Bonjour,

je me lance dans la compréhension des certificats et les communications sécurisé SSL.

Je vais aborder tout le périmètre du problème afin que quelqu'un puisse m'expliquer le fonctionnement que je remercie par avance.

Alors voilà mon problème:

Sur un serveur apache j'ai bien définit la configuration SSL(port:443) du virtualhost comme ceci pour une aplication [App_A]:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 SSLEngine on
        SSLCipherSuite HIGH:MEDIUM:LOW
        SSLProtocol -ALL +SSLv3 +TLSv1
 
        SSLCertificateFile /etc/ssl/certs/<nom_du_domaine>/2014/wildcard.e-server-name.crt
        SSLCertificateKeyFile /etc/ssl/certs/<nom_du_domaine>/2013/wildcard.e-server-name.key
        SSLCertificateChainFile /etc/ssl/certs/<nom_du_domaine>/2014/wildcard.e-server-name.chain
J'ai une autre application (App_B) qui tourne sur un autre serveur et qui contacte par webservice App_A, hors si le fichier:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SSLCertificateFile /etc/ssl/certs/<nom_du_domaine>/2014/wildcard.e-server-name.crt
change (mis à jour car la date est arrivée à expiration), j'ai une exception de type:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
ok pas de souci, je récupère le certificat à laide de la commande:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
echo | openssl s_client -connect server_name:443 2> /dev/null | 
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'  > server_name.crt
je vérifie ça validité:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 openssl x509 -noout -dates -in server_name.crt
je peut maintenant l'ajouter(le fichier server_name.crt) au 'fameux' truststore de $JAVA_HOME/lib/security/cacerts avec la commande

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
cd $JAVA_HOME/lib/security/cacerts
keytool -import -keystore cacerts -file server_name.crt
la password par défaut est: Changeit

et voilà la connexion et rétabli, l'exception à disparu.


En local j'ai la même aplication que celle du serveur App_B (ou tester avec SoapUI), mais je n'ai pas eu besoin d'ajouter le certificat au truststore de java.

Je crois comprendre que mon application(mon client en local), lui ne sollicite pas une authentification de la part du serveur.

Tout le problème est là.

Est-ce possible qu'un client demande une authentification ou c'est le fait d'avoir une entré dans le truststore de java qui implique que la communication entre les deux machine est le même certificat(clé publique).

Merci par avance.