Я пытаюсь создать клиента SSL HTTP (для отправки данных через TLS) с настраиваемым хранилищем доверенных сертификатов и сертификатами хранилища клиентов. Мне удалось сделать это в Java через OKHTTP, но я не понимаю, как я могу это сделать в C # /. net
Вот подход OKHTTP, который я использовал:
byte[] trustStoreBytes = ...
byte[] clientCertBytes = ...
TrustManagerFactory trustManagerFactory = null;
try
{
trustManagerFactory = createTrustManagerFactory(trustStoreBytes, trustStorePass);
}
catch (Exception e)
{
Log.e(TAG, "Exception initializing TrustManagerFactory.", e);
}
if (trustManagerFactory == null)
{
Log.e(TAG, "TrustManagerFactory cannot be null.");
}
SSLContext sslContext = null;
try
{
sslContext = createSSLContext(clientCertBytes, clientCertPass, trustManagerFactory);
}
catch (Exception e)
{
Log.e(TAG, "Exception initializing SSLContext.", e);
}
if (sslContext == null)
{
Log.e(TAG, "SSLContext cannot be null.");
}
SSLSocketFactory sslSocketFactory = null;
X509TrustManager trustManager = null;
try
{
sslSocketFactory = sslContext.getSocketFactory();
trustManager = getX509TrustManager(trustManagerFactory);
Log.d(TAG, "newSecureWebSocketsClient: " + sslSocketFactory.getDefaultCipherSuites().toString());
}
catch (Exception e)
{
Log.e(TAG, "Unable to create ssl socket factory or trust manager.", e);
}
if (sslSocketFactory == null)
{
Log.e(TAG, "SSL Socket Factory cannot be null.");
}
if (trustManager == null)
{
Log.e(TAG, "Trust manager cannot be null");
}
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
clientBuilder.sslSocketFactory(sslSocketFactory, trustManager);
clientBuilder.retryOnConnectionFailure(true);
clientBuilder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session)
{
Log.i(TAG, "Hostname: " + hostname);
Log.w(TAG, "Hostname verification is disabled. If you are using DNS," +
" this could introduce security risks for you.");
return true;
}
});
return clientBuilder.build();
Вот моя первая попытка с System.Net.Http.HTTPClient
HttpClient client = new HttpClient();
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 cert = new X509Certificate2(clientBytes, "password");
handler.ClientCertificates.Add(cert);
handler.ClientCertificates.Add( ??? );
Я мог добавить сертификат хранилища доверенных сертификатов в ClientCertificates, но это кажется неправильным. Какой здесь правильный подход? Спасибо!