客户端证书是否需要被客户端信任?

信息安全 tls 验证 证书
2021-08-18 09:51:22

我正在寻找有关客户端证书的信任要求(如果有)的一些说明。

我正在与第三方合作,通过 Mutual TLS 访问他们的服务。

我生成 CSR,将其发送给第三方,他们向我发送证书(他们使用自己的 CA 生成)。这是一个单一的证书。我没有获得任何中间证书 - 因为我假设您不需要这些证书来发出客户端证书身份验证请求

当我尝试连接此证书时,握手失败:

openssl s_client -connect the-server.com:443 -cert the-cert.pem -key the-key.pem -state
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
depth=2 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5
verify error:num=20:unable to get local issuer certificate
verify return:0
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write certificate verify A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL3 alert read:fatal:handshake failure
SSL_connect:failed in SSLv3 read finished A
78460:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s3_pkt.c:1145:SSL alert number 40
78460:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59/src/ssl/s23_lib.c:185:

我被告知它失败了:“pem 文件不包含签署客户端证书的公共 CA 证书”但是如果是这种情况,客户端甚至会发送证书(因为它似乎正在这样做上面的 TLS 协商步骤)是否需要信任它?

3个回答

客户端证书是否需要被客户端信任?

不,客户端证书仅由服务器验证,服务器证书仅由客户端验证。因此,任何关于客户端证书或其签名 CA 的信任只需要在服务器端。

...这是一个单一的证书,没有中间

... pem 文件不包含签署客户端证书的公共 CA 证书

我建议第一个陈述是错误的,即您获得的证书实际上是由中间 CA 签名的,并且您没有包含必要的链证书。根证书本身不应该被发送,因为它们必须作为受信任的一方存在于进行验证的一方,即在客户端证书的情况下是服务器。

我建议您找出他们在服务器端预信任的 CA,并将其与您的证书颁发者进行比较。如果它们不匹配,则缺少链证书。如果它们匹配,则可能是服务器端设置的问题,即它们没有将必要的 CA 配置为服务器信任的客户端身份验证。

不,客户端不需要信任它提供给服务器的证书。(服务器也不需要信任它提供给客户端的证书)。只有连接的另一端需要能够验证提供的证书。

话虽如此,客户端使用的私钥和证书必须匹配。您可以使用以下命令进行检查:

openssl rsa -in localhost.key -modulus -noout openssl x509 -in localhost.crt -modulus -noout 他们的输出需要完全匹配。

服务器可能希望客户端发送验证用户证书真实性所需的中间 CA 证书,但这会非常奇怪并且基本上闻所未闻。

最后,如果您正在部署一个新系统,我强烈建议不要使用 OpenSSL 0.9.8 - 它只会在年底之前收到安全更新。

鉴于客户端证书是由内部 CA 颁发的,正在连接的服务器将需要“信任”内部 CA 才能验证客户端证书。

即使客户端可以提供内部 CA 的公共证书,服务器仍将不信任该证书,因为它尚未由其受信任的根之一(即众多公共 CA 之一...Verisign、Comodo 等)签名。

服务器管理员需要在服务器的信任库中安装内部 CA 的证书(即您的客户端证书的根)。