Как доверять самоподписанному сертификату и добавить его в httpclient - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть приложение Windows form (клиент), и оно мне нужно, чтобы доверять сертификату моего сервера и добавлять собственный сертификат в запрос.Я уже сделал это в Android (Java), но у меня возникают трудности при попытке реализовать его на C #.

В Android Studio (Java) я использовал это:

private OkHttpClient initClient() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException, KeyManagementException {

    // Trust self signed certificate
    InputStream certificateFileCRT = mContext.getResources().openRawResource(R.raw.server);
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(certificateFileCRT);
    String alias = cert.getSubjectX500Principal().getName();
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    trustStore.load(null);
    trustStore.setCertificateEntry(alias, cert);

    // KeyStore containing client certificate
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    InputStream fis = mContext.getResources().openRawResource(R.raw.client);
    keyStore.load(fis, "password".toCharArray());

    // Build an SSL context
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
    kmf.init(keyStore, "password".toCharArray());
    KeyManager[] keyManagers = kmf.getKeyManagers();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
    tmf.init(trustStore);
    TrustManager[] trustManagers = tmf.getTrustManagers();

    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(keyManagers, trustManagers, null);

    return new OkHttpClient.Builder()
            .readTimeout(60, TimeUnit.SECONDS)
            .sslSocketFactory(sslContext.getSocketFactory())
            .hostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            })
            .build();

}

Прямо сейчас,У меня есть этот код.Я думаю, что мне просто нужно добавить сертификат клиента в HttpClient.

X509Certificate x509Certificate = new X509Certificate2("server.pfx", "password");

WebRequestHandler clientHandler = new WebRequestHandler();
clientHandler.ClientCertificates.Add(x509Certificate);

HttpClient client = new HttpClient(clientHandler);

try
{
    HttpContent content = loginJSON;
    HttpResponseMessage responseMessage = await client.PostAsync(SERVER_ADMIN_URL + LOGIN_PATH, content);
    Console.WriteLine("\n" + responseMessage.StatusCode);
    responseMessage.EnsureSuccessStatusCode();
    responseBody = await responseMessage.Content.ReadAsStringAsync();
}
catch (HttpRequestException e)
{
    Console.WriteLine(e.StackTrace);
    responseBody = "An error occured while sending the request to the server";
}

Я думаю, что я могу разрешить сертификат сервера (самоподписанный).Моя проблема в том, что я хочу отправить сертификат моего клиента на сервер.

...