【问题标题】:SSL/TLS is not working with .p7b certificateSSL/TLS 不适用于 .p7b 证书
【发布时间】:2016-02-08 16:40:59
【问题描述】:

我从某个支付提供商处生成了客户端证书,我必须在向他们的 https API 请求时使用它。我的代码如下:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://site/api/requests/");

request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = Encoding.UTF8.GetByteCount(postDataSerialized);
request.KeepAlive = false;

request.ProtocolVersion = HttpVersion.Version10;

ServicePointManager.Expect100Continue = false;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

X509Certificate2Collection certCollection = new X509Certificate2Collection();
certCollection.Import(@"d:\Production Merchant Certificate.p7b");

request.ClientCertificates.AddRange(certCollection);
request.PreAuthenticate = true;


using (StreamWriter os = new StreamWriter(request.GetRequestStream())) //Exception
{
}

而且我总是遇到两个错误:

发送POST(Form)请求时发生错误底层 连接已关闭:发送时发生意外错误。 System.IO.IOException:无法从传输中读取数据 连接:已存在的连接被远程强行关闭 主持人。 ---> System.Net.Sockets.SocketException:现有连接 被远程主机强行关闭。

请求被中止:无法创建 SSL/TLS 安全通道。

如果您能告诉我发送带有证书链的请求的正确方法,我将不胜感激。

在 Microsoft 管理控制台中,我已将 p7b 添加到本地计算机的个人和中间证书颁发机构,但我仍然收到这两个错误。

【问题讨论】:

    标签: ssl certificate ssl-certificate x509certificate2 tls1.2


    【解决方案1】:

    问题是您的客户端证书根本不包含私钥。 PKCS#7 容器(带有 .p7b 文件扩展名)不应该存储带有私钥的证书。您需要获取具有对私钥的有效引用的证书对象。证书可以安装在您的个人证书存储 (CurrentUser\My) 中,或者通过导入 PKCS#12(带有 .pfx 或 .p12 文件扩展名)容器来安装,该容器应该存储带有私钥的证书。

    【讨论】:

    • 但是在文档中我可以读到:响应(PKCS#7 或 PEM)将包含您的客户端证书和所有 CA 证书,直到 Root.Import 生成的证书和所有 CA 证书到您的服务器。从哪里可以得到私钥? .p12 文件?
    • 到服务器的证书在 PKCS#7 中发送。没有私钥。它是正确的。但是,叶证书必须包含私钥才能执行基于证书的身份验证。例如,服务器将使用您的公钥加密会话密钥。你想如何在没有私钥的情况下解密会话密钥?
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多