Доступ к ssl-серверу (веб-сервису) из .net-клиента

Я пытаюсь получить доступ к ssl-серверу (веб-службе) с клиента .net (С#). У меня есть доступ к клиентскому коду Java, который может подключаться к серверу. В исходный код включены 3 файла (saPubKey.jks, WebServices.pfx и trustStore), и я думаю, что только 2 из 3 используются в примере Java.

private void setSSLConnection(WSBindingProvider bp){
    KeyStore ks = KeyStore.getInstance("pkcs12");
    ks.load(this.getClass().getClassLoader().getResourceAsStream("WebServices.pfx"), "password".toCharArray());

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, "password".toCharArray());

    SSLContext sslContext = SSLContext.getInstance("TLS");
    KeyStore ts = KeyStore.getInstance("JKS");
    ts.load(this.getClass().getClassLoader().getResourceAsStream("trustStore"), "pass".toCharArray());

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    tmf.init(ts);
    sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

    bp.getRequestContext().put(JAXWSProperties.SSL_SOCKET_FACTORY, sslContext.getSocketFactory());

}

Код, который у меня есть для клиента С#, таков

var clientCertificate = new X509Certificate2(@"C:\WebServices.pfx", "password");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://blablabla.org:700/fws/ftrs");
req.ClientCertificates.Add(clientCertificate);
req.Headers.Add("SOAPAction", "\"https://blablabla.org:700/fws/ftrs/Rgdvice\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";
using (Stream stm = req.GetRequestStream())
{
   using (StreamWriter stmw = new StreamWriter(stm))
   {
      stmw.Write(soap);
   }
}
WebResponse response = req.GetResponse(); //(500) Internal Server Error.
Stream responseStream = response.GetResponseStream();

Метод req.GetResponse() выдает «(500) Внутренняя ошибка сервера». Без добавления клиентских сертификатов я получаю: «При отправке произошла непредвиденная ошибка». Я также пробовал эту строку кода без везения:

ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

Я новичок в ssl и сертификатах, и мне действительно нужна помощь в доступе к серверу ssl из С#.


person user1918513    schedule 20.12.2012    source источник


Ответы (1)


Это может быть не связано, но убедитесь, что веб-служба не находится в папке app_code.

person jmorrissette    schedule 22.01.2013