2017-01-17 62 views
3

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

回答

1

匹配是由证书的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