Как создать контекст ssl с HTTP-клиентом с настраиваемым хранилищем доверенных сертификатов и сертификатами хранилища клиентов? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь создать клиента 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, но это кажется неправильным. Какой здесь правильный подход? Спасибо!

...