Le client http(s) Java n'échoue pas


J'ai une application Java SE desktop (console) utilisant la bibliothèque Apache HTTP components :

<dependency org="org.apache.httpcomponents" name="httpcore" rev="4.4.5"/>

Au calque le plus bas, je fais simplement un:

CloseableHttpClient httpClient = HttpClients.custom().setDefaultHeaders(headers).build();
CloseableHttpResponse response = httpClient.execute(request); 

J'utilise ensuite cette application console pour accéder à un service Web qui est servi via SSL et où le serveur est configuré avec le certificat suivant:

Common Name (CN)    InCommon RSA Server CA
Organization (O)    Internet2
Organizational Unit (OU)    InCommon

Je m'attendais à ce que mon client échoue. C'est parce que quand je regarde les certificats fournis avec Java rien avec "internet2" ou "inc" semble être parmi eux:

$ keytool -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -list | grep -i 'internet2\|inc'
Enter keystore password:  
<no output>
$

Pourquoi mon client n'échoue-t-il pas? Je n'ai pas configuré pour accepter tous les certificats. Dans le passé (lorsque le serveur ne présentait aucun certificat), le code échouait en effet, mais je m'attendais à ce qu'avec le nouveau certificat, la situation reste la même car l'autorité de certification InCommon n'est pas répertoriée parmi celles trouvées dans le fichier cacerts de Java.

Author: Marcus Junius Brutus, 2017-09-01

1 answers

La suggestion d'utiliser keytool -printcert -sslserver hostname[:port] a été très utile.

C'est pas encore très clair pour moi comment déchiffrer la sortie de keytool -printcert -sslserver et comment faire pour "connecter" avec la sortie de keytool -printcert. L'incantation (fragile) suivante trouve quelques correspondances:

for x in $(keytool -printcert -sslserver example.com:443 -v | grep ^Issuer | awk '{print $2}' | cut -c4- | sort | uniq); do keytool -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -list   | grep -i $x; done

However cependant, les correspondances ne sont pas sensibles à la clé et sur le préfixe uniquement.

, En particulier, la sortie de keytool -printcert -sslserver a la chaîne "USERTrust", mais la plus proche de la sortie de keytool -keystore, a est: "usertrusteccca" et "usertrustrsaca".

Sortie de l'utilitaire keytool -printcert -sslserver` (greping pour " usertrust`)

$ keytool -printcert -sslserver example.com:443 -v | grep -i usertrust

 accessLocation: URIName: http://crt.usertrust.com/InCommonRSAServerCA_2.crt
 accessLocation: URIName: http://ocsp.usertrust.com
Owner: CN=USERTrust RSA Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
 accessLocation: URIName: http://ocsp.usertrust.com
 [URIName: http://crl.usertrust.com/AddTrustExternalCARoot.crl]
Issuer: CN=USERTrust RSA Certification Authority, O=The USERTRUST Network, L=Jersey City, ST=New Jersey, C=US
 accessLocation: URIName: http://crt.usertrust.com/USERTrustRSAAddTrustCA.crt
 accessLocation: URIName: http://ocsp.usertrust.com
 [URIName: http://crl.usertrust.com/USERTrustRSACertificationAuthority.crl]

Sortie de 'keytool-keystore' (greping pour 'usertrust')

$ keytool -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -list   | grep -i usertrust
Enter keystore password:  

*****************  WARNING WARNING WARNING  *****************
* The integrity of the information stored in your keystore  *
* has NOT been verified!  In order to verify its integrity, *
* you must provide your keystore password.                  *
*****************  WARNING WARNING WARNING  *****************

usertrusteccca, May 11, 2015, trustedCertEntry, 
usertrustrsaca, May 11, 2015, trustedCertEntry, 
 0
Author: Marcus Junius Brutus, 2017-09-13 19:51:21