2012-12-20 196 views
3

我嘗試從.net客戶端(c#)訪問ssl服務器(web服務)。我有權訪問可以連接到服務器的Java客戶端代碼。在源代碼中包含3個文件(saPubKey.jks,WebServices.pfx和trustStore),我認爲在java示例中只使用了3個文件中的2個。從.net客戶端訪問ssl服務器(web服務)

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()); 

} 

我對C#客戶端的代碼是這樣的

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和證書,並真正需要幫助的訪問從C#中的SSL服務器。

回答

0

這可能是不相關的,但要確保web服務不在app_code文件夾中。