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

时间:2017-01-17 17:13:49

标签: java ssl jks

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

1 个答案:

答案 0 :(得分:2)

匹配由证书Subject完成。

E.g。如果您浏览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