私は自分のサーバーとSSLを使って話しますが、自己署名証明書を持っています。Xamarin.iOSおよびUniversal Windows Platformで自己署名入りのSSL証明書を使用する方法は?
は、Androidで私は自分のサーバーにできるメイク要求であることをシステムに自分のSSL証明書を渡すために、このコードを使用します。今、私はWindowsのユニバーサルアプリケーションでこのようなものが必要
KeyStore ks = KeyStore.getInstance("BKS");
InputStream in = new ByteArrayInputStream(<byte [] my_ssl_data>);
ks.load(in, <string mypassword>.toCharArray());
in.close();
TrustManagerFactory Main_TMF = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
Main_TMF.init(ks);
X509TrustManager Cur_Trust_Manager = new X509TrustManager()
{
public void checkClientTrusted(X509Certificate [] chain, String authType) throws CertificateException { }
public void checkServerTrusted(X509Certificate [] chain, String authType) throws CertificateException { }
public X509Certificate [] getAcceptedIssuers() { return null; }
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] { Cur_Trust_Manager }, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
{
@Override
public boolean verify(String hostname, SSLSession session)
{
try
{
Cur_Trust_Manager.checkServerTrusted((X509Certificate []) session.getPeerCertificates(), session.getCipherSuite());
return true;
}
catch (Exception e) {}
return false;
}
});
8.1+(Windowsの+ WindowsPhone) iOS 7.0以降。
私は、UWPとXamarin.iOSの両方で動作するSystem.Net.Http.HttpClientを使用します。サーバーからDER形式の証明書を取得しましたが、HttpClientにハンドラを追加できません。
Xamarin.iOSバージョンは、残念ながら
HttpClientHandler myHandler = new HttpClientHandler();
X509Certificate2 certificate = new X509Certificate2();
certificate.Import(my_cert_der_bytes);
myHandler.ClientCertificates.Add(certificate);
myHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
myHandler.AllowAutoRedirect = false;
HttpClient c = new HttpClient(myHandler);
....
UWPバージョン "実装されていません" と言う(と、なぜ地獄を?)X509Certificate2とすべてのものを知りません。私はWinRtHttpClientHandlerを使用しようとしましたが、どこの証明書を渡すべきか理解していませんでした。私はエラーをスキップしようとしましたが(動作を開始しましたが)、それは解決策ではありません。私の要求が、別の不安定なサーバーにリダイレクトされないようにするためです。
var filter = new HttpBaseProtocolFilter();
Certificate cer = new Certificate(my_cert_bytes.AsBuffer());
filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted);
filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired);
WinRtHttpClientHandler myHandler = new WinRtHttpClientHandler(filter);
HttpClient c = new HttpClient(myHandler);
....
これはほとんどのインディーにとって共通の課題だと思われますが、証明書はテストや小さなアプリではめったにありません。しかし、プラットフォーム開発者はタスクが非常に困難になっているようです。信頼できる解決法はありますか?
これは解決策ではなく、自己署名入りの証明書はデバッグ証明書ではありません。私は証明書を支払う必要はなく、証明書が期限切れになるか、証明書発行者のサイトがダウンすると問題を回避したい – Tertium