c# - 从 .net 客户端访问 ssl 服务器(web 服务)

标签 c# web-services ssl keystore truststore

我正在尝试从 .net 客户端 (c#) 访问 ssl 服务器(网络服务)。我可以访问可以连接到服务器的 Java 客户端代码。源代码中包含 3 个文件(saPubKey.jks、WebServices.pfx 和 trustStore),我认为 java 示例中只使用了 3 个中的 2 个。

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 服务器。

最佳答案

这可能无关紧要,但请确保 Web 服务不在 app_code 文件夹中。

关于c# - 从 .net 客户端访问 ssl 服务器(web 服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971292/

相关文章:

c# - 在 C# 中建模数据

spring - cxf 相互 SSL 配置外部化 key 和密码以使用 JNDI

php - 结合 SSL/TLS (HTTPS) 的 HTTP 基本身份验证将用于对用户进行身份验证

node.js - 激活 CloudFlare 时重定向循环

c# - 如何在 C# 中使用本地化

c# - 添加 log4net 配置时出现异常

c# - 使用分布式 Web 服务查询多个数据库

ssl - 带 SSL 的 IIS7.5 Web 服务器前面的 Cloudfront

c# - 为什么我的 C# 代码没有从我的 Oracle 函数中获得返回值?

java - 如何添加请求 URI 的上下文路径?