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.
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,