OpenSSL和s_client - 为什么客户端需要私钥?

Aer*_*del 27 ssl openssl ssl-certificate

我需要在.NET/WCF应用程序和第三方Web服务器之间设置双向SSL通信通道.现在我正在尝试与主机成功握手,以验证所有元素都已正确设置(客户端证书,服务器证书颁发机构,网络通信......).我正在使用openSSL命令行工具尝试使用s_client命令对其进行验证.

这是什么阻止了我,我不明白:

  • 无论我做什么,openSSL都希望找到客户端证书的私钥
  • 客户端证书由第三方提供给我,但它不包含任何私钥
  • 如果我只是使用openSSL生成我自己的私钥文件,我得到一个键值不匹配错误

请记住,我刚刚开始使用SSL,因此我对整个协议有了非常基本的了解.从我一直在阅读的内容来看,似乎服务器和客户端都需要双向SSL设置中的私钥.但是,我无法弄清楚如何在我的客户端上获取工作私钥(使用提供给我的客户端证书).如果有人能够了解客户端证书私钥,我将非常感激,因为这让我头疼不已.

谢谢!

Bru*_*uno 53

证书本身只是公开的信息.将公钥证书与其包含的名称相关联的是,对该名称拥有合法控制权的人(例如您的姓名或服务器名称)也具有私钥.

证书用于通过挑战远程方执行只能使用相应私钥进行的操作来证明远程方的身份:签署某些东西(可以用公钥验证)或解密用加密的东西.公钥.(两者都可以在SSL/TLS握手中发生,具体取决于密码套件.)

在SSL/TLS握手期间,服务器发送其证书(以明文形式)并使用经过身份验证的密钥交换向客户端证明它具有相应的私钥.

在您的情况下,您还希望使用客户端证书身份验证.在握手期间发送客户端证书是不够的:客户端还必须证明它具有私钥.否则,任何收到该证书的人都可以克隆它.使用证书的目的是防止任何克隆,这样您就不必显示自己的秘密(私钥).

更具体地说,客户端必须在TLS握手的证书验证消息中签署握手消息,以便服务器可以根据客户端证书中发送的公钥对其进行验证.如果没有此步骤,则不会进行客户端证书身份验证.

客户端证书由第三方提供给我,但它不包含任何私钥

在没有私钥的情况下给你的证书似乎没有多大意义,除非你事先想要在你身边生成证书请求(在这种情况下你会拥有私钥).

实际上,不是给出证书及其私钥,而是更好的做法是生成密钥对,创建证书请求(CSR),让CA从该CSR颁发证书(但他们不知道你的私钥).在这种情况下,您应该保留您的私钥,并且您可以将其与您将收到的证书一起使用.