如何在 SSL 握手中的 JKS 中获取正确的证书

How correct certificate is getting picked up in JKS in ssl handshake

假设我有一个 JAVA 客户端应用程序,它尝试通过 https 连接到服务器 (example.com)。客户端应用程序有一个信任库 JKS ,它有服务器的证书和一些其他证书。在服务器向此客户端应用程序发送证书时的握手过程中,如何从信任库 jks 中获取正确的证书。即基于什么参数 java 将服务器发送的证书与存储在 JKS 中的证书相匹配。

通过证书的Subject.

进行匹配

例如如果您浏览 https://www.google.com/ 并查看他们的证书,它会显示一个证书链:

主题: /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
发布者:/C=US/O=Google Inc/CN=Google Internet Authority G2
发布者:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
问题作者:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority

* 实际使用openssl s_client -connect www.google.com:443 -showcerts

得到

如果 任何 证书在您的信任库中,则证书将被信任。

您可以像这样扫描信任库(假设您有 grep):

keytool -list -keystore /path/to/cacerts -storepass changeit -v | grep "CN=GeoTrust Global CA" -B 4 -A 8

要获得这种输出:

Alias name: geotrustglobalca
Creation date: Jul 18, 2003
Entry type: trustedCertEntry

Owner: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
Issuer: CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
Serial number: 23456
Valid from: Tue May 21 00:00:00 EDT 2002 until: Sat May 21 00:00:00 EDT 2022
Certificate fingerprints:
         MD5:  F7:75:AB:29:FB:51:4E:B7:77:5E:FF:05:3C:99:8E:F5
         SHA1: DE:28:F4:A4:FF:E5:B9:2F:A3:C5:03:D1:A3:49:A7:F9:96:2A:82:12
         SHA256: FF:85:6A:2D:25:1D:CD:88:D3:66:56:F4:50:12:67:98:CF:AB:AA:DE:40:79:9C:72:2D:E4:D2:B5:DB:36:A7:3A
         Signature algorithm name: SHA1withRSA
         Version: 3