我正在尝试连接到已启用相互 TLS 身份验证设置的第三方 API。因此,我应该将客户端证书安装在密钥存储中,并在 TLS 握手过程中发送它。
对于这个过程我现在正在使用commodo positive SSL作为客户端证书。当我进行 TLS 调用时,即使服务器正在请求证书,客户端也不会发送证书。当我检查 SChannel 日志时,我可以看到这样的警告
远程服务器已请求 TLS 客户端身份验证,但找不到合适的客户端证书。将尝试匿名连接。此 TLS 连接请求可能会成功或失败,具体取决于服务器的策略设置。
所以我的疑问是,我是否使用了正确类型的 X509 证书来进行客户端身份验证?我需要使用任何其他特定类型吗?因为我当前的证书没有被发送。
答案1
视情况而定。X.509v3 证书通常带有“扩展密钥用途”扩展字段,其中包含允许用途 (EKU) 列表。
常规网页服务器证书包含“TLS 服务器身份验证”用法(有时显示为“TLS Web 服务器”,但实际上它根本不是特定于 Web 的)。
要充当客户端,您需要一个具有“TLS 客户端身份验证”的证书(同样经常显示为“TLS Web 客户端”,尽管其中没有任何特定于 Web 的内容)。
常规“Web 服务器” SSL 证书通常包含两个都用途——例如,我正在查看 Let's Encrypt 和 DigiCert 颁发的证书,它们都包含两种用途,因此可以用于客户端/相互身份验证。
然而,在其他一些 CA 中,尤其私人组织 CA,大多数证书都有一种用途,但很少同时具有两种用途。
例如,OpenVPN 曾经严格要求“仅有的TLS 客户端”(而不是“至少由于该程序与其他程序一样,都具有“TLS 客户端”的称谓,因此其easy-rsa
脚本只颁发服务器端证书和客户端证书,而不颁发混合型证书。
因此,您应该检查您的证书,并确保它们包含所需的 EKU。实际上,任何证书工具都可以完成这项工作 - 例如证书属性Windows 中的对话框将在“ V3扩展”下显示此内容,Web 浏览器、、、等也将openssl x509
如此。certtool
certutil
如果你运行自己的内部 CA,还需记住:如果你使用中级CA证书,也要注意。中级不需要有 EKU 扩展,但如果他们做拥有它,则该中间件颁发的所有证书都受其约束。(如果您通过商业渠道获得证书,则不必担心这一点。)
此外,该证书将具有基本的“密钥使用”字段包含一些非常普遍的限制:例如“数字签名”表示允许证书对数据进行签名(因此允许在 TLS 中进行 EDH/EECDH 握手);“密钥协议”似乎用于静态 DH/ECDH;“密钥加密”允许静态 RSA 握手。
官方的 X.509v3 文档对于何时需要使用哪些内容非常混乱...商业 CA 通常会正确填写此字段。但对于私有 CA 来说,值得再检查一下。