我需要在.NET / WCF应用程序和第三方Web服务器之间设置双向SSL通信通道。现在我正在尝试与主机成功握手,以验证所有元素都已正确设置(客户端证书,服务器证书颁发机构,网络通信......)。我正在使用openSSL命令行工具尝试使用s_client命令对其进行验证。
这是什么阻止了我,我不明白:
请记住,我刚刚开始使用SSL,因此我对整个协议有了非常基本的了解。从我一直在阅读的内容来看,似乎服务器和客户端都需要双向SSL设置中的私钥。但是,我无法弄清楚如何在我的客户端上获取工作私钥(使用提供给我的客户端证书)。 如果有人能够了解客户证书私钥,我将非常感激,因为这让我头疼不已。
谢谢!
答案 0 :(得分:48)
证书本身只是公开的信息。将公钥证书与其包含的名称相关联的是,对该名称拥有合法控制权的人(例如您的姓名或服务器名称)也具有私钥。
证书用于通过挑战远程方执行只能使用相应私钥进行的操作来证明远程方的身份:签署某些内容(可以使用公钥验证)或解密某些内容用公钥加密。 (两者都可以在SSL / TLS握手中发生,具体取决于密码套件。)
在SSL / TLS握手期间,服务器发送其证书(以明文形式)并向客户证明它具有相应的私钥using an authenticated key exchange。
在您的情况下,您还希望使用客户端证书身份验证。在握手期间发送客户端证书是不够的:客户端还必须证明它具有私钥。否则,任何收到该证书的人都可以克隆它。使用证书的目的是防止任何克隆,这样您就不必显示自己的秘密(私钥)。
更具体地说,客户端必须在TLS握手的Certificate Verify消息中签署握手消息,以便服务器可以根据客户端证书中发送的公钥对其进行验证。如果没有此步骤,则不会进行客户端证书身份验证。
客户证书是由第三方提供给我的,但确实如此 不包含任何私钥
在没有私钥的情况下为您提供证书似乎毫无意义,除非您事先预计会在您身边生成证书请求(在这种情况下您将拥有私钥)。
事实上,不是给出证书及其私钥,而是更好的做法是生成密钥对,创建证书请求(CSR),让CA从该CSR颁发证书(但没有它们)永远都知道你的私钥)。在这种情况下,您可能会保留您的私钥,并且您可以将其与您收到的证书一起使用。
答案 1 :(得分:0)
这是一个有趣的问题。我在配置 LDAPS 时对 TLS 相关错误感到困惑,我的学习在这里。
...所以,就openssl
而言,当您使用-cert
时,您表示客户端证书身份验证,您将需要-key
来指定相应的私钥。>
但是,对于很多 Web 场景,即使服务器的证书是由自制 CA 签名的,只需将自制 CA 添加到 truststore 或 keychain 即可验证服务器证书。这是通过使用 -CAfile
来完成的。
答案 2 :(得分:0)
底线.. 如果您要发送客户端证书,那么您将需要客户端证书的私钥来加密 pre-master secret