152 votes

Comment corriger l'erreur "java.security.cert.CertificateException: aucun nom alternatif de sujet présent"?

Je dispose d'un client de service Web Java, qui consomme un service Web via HTTPS.

import javax.xml.ws.Service;

@WebServiceClient(name = "ISomeService", targetNamespace = "http://tempuri.org/", wsdlLocation = "...")
public class ISomeService
    extends Service
{

    public ISomeService() {
        super(__getWsdlLocation(), ISOMESERVICE_QNAME);
    }

Lorsque je me connecte à l'URL du service (https://AAA.BBB.CCC.DDD:9443/ISomeService), je reçois l'exception java.security.cert.CertificateException: Aucun nom alternatif de sujet présent.

Pour corriger cela, j'ai d'abord exécuté openssl s_client -showcerts -connect AAA.BBB.CCC.DDD:9443 > certs.txt et obtenu le contenu suivant dans le fichier certs.txt :

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=someSubdomain.someorganisation.com
   i:/CN=someSubdomain.someorganisation.com
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=someSubdomain.someorganisation.com
issuer=/CN=someSubdomain.someorganisation.com
---
No client certificate CA names sent
---
SSL handshake has read 489 bytes and written 236 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 512 bit
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5            
    Session-ID: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Session-ID-ctx:                 
    Master-Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    Key-Arg   : None
    Start Time: 1382521838
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)
---

À ma connaissance, je dois maintenant

  1. extraire la partie de certs.txt entre -----BEGIN CERTIFICATE----- et -----END CERTIFICATE-----,
  2. le modifier afin que le nom du certificat soit égal à AAA.BBB.CCC.DDD et
  3. puis importer le résultat en utilisant keytool -importcert -file fileWithModifiedCertificate (où fileWithModifiedCertificate est le résultat des opérations 1 et 2).

Est-ce correct ?

Si oui, comment puis-je faire fonctionner le certificat de l'étape 1 avec une adresse IP (AAA.BBB.CCC.DDD) ?

Mise à jour 1 (23.10.2013 15:37 MSK) : Dans une réponse à une question similaire, j'ai lu ce qui suit :

Si vous n'avez pas le contrôle de ce serveur, utilisez son nom d'hôte (à condition qu'il y ait au moins un CN correspondant à ce nom d'hôte dans le certificat existant).

Que signifie exactement "utiliser" ?

0voto

Gert Points 51

J'ai eu cette question après avoir reçu ce même message d'erreur. Cependant, dans mon cas, nous avions deux URL avec des sous-domaines différents (http://example1.xxx.com/someservice et http://example2.yyy.com/someservice) qui étaient dirigés vers le même serveur. Ce serveur avait seulement un certificat wildcard pour le domaine *.xxx.com. Lors de l'utilisation du service via le deuxième domaine, le certificat trouvé (*.xxx.com) ne correspond pas au domaine demandé (*.yyy.com) et l'erreur se produit.

Dans ce cas, nous ne devrions pas essayer de corriger un tel message d'erreur en réduisant la sécurité SSL, mais devrions vérifier le serveur et les certificats sur celui-ci.

0voto

Sachin Rane Points 56

Je passais par le SSL à double sens dans SpringBoot. J'ai fait toutes les configurations correctes pour le service du serveur Tomcat et l'appelant du service RestTemplate. mais j'obtenais une erreur comme "java.security.cert.CertificateException: Aucun nom alternatif de sujet n'est présent"

Après avoir examiné les solutions, j'ai découvert que le JVM avait besoin de ce certificat sinon il renvoie une erreur de poignée de main.

Maintenant, comment ajouter ceci au JVM.

allez dans le fichier jre/lib/security/cacerts. nous devons ajouter notre fichier de certificat serveur à ce fichier cacerts du jvm.

Commande pour ajouter le certificat du serveur au fichier cacerts via la ligne de commande sous Windows.

C:\Program Files\Java\jdk1.8.0_191\jre\lib\security>keytool -import -noprompt -trustcacerts -alias sslserver -file E:\spring_cloud_sachin\ssl_keys\sslserver.cer -keystore cacerts -storepass changeit

Vérifiez si le certificat du serveur est installé ou non:

C:\Program Files\Java\jdk1.8.0_191\jre\lib\security>keytool -list -keystore cacerts

vous pouvez voir la liste des certificats installés:

pour plus de détails: https://sachin4java.blogspot.com/2019/08/javasecuritycertcertificateexception-no.html

0voto

Tudor Points 470

Lorsque vous avez un certificat avec à la fois un CN et des noms alternatifs du sujet (SAN), si vous effectuez votre demande en fonction du contenu du CN, alors ce contenu particulier doit également être présent sous SAN, sinon cela échouera avec l'erreur en question.

Dans mon cas, le CN avait quelque chose, le SAN avait autre chose. J'ai dû utiliser l'URL SAN, et ensuite cela a fonctionné correctement.

0voto

Manishoaham Points 131

J'ai résolu l'erreur mentionnée

MqttException (0) - javax.net.ssl.SSLHandshakeException: Aucun subjectAltNames sur le certificat ne correspondent

en ajoutant un (peut en ajouter plusieurs) nom alternatif de sujet dans le certificat du serveur (ayant CN=example.com) qui affiche ensuite la partie du certificat comme ci-dessous:

Subject Alternative Name:
DNS: example.com

J'ai utilisé KeyExplorer sur Windows pour générer mon certificat de serveur. Vous pouvez suivre ce lien pour ajouter des noms de sujet alternatifs (suivez uniquement la partie pour l'ajouter).

0voto

Volcan Baru Points 11

J'ai été orienté vers la réponse de animo3991 et je l'ai ajustée pour faire fonctionner mon client de sauvegarde Bitbucket 3.6.0 pour sauvegarder mon serveur Bitbucket alors qu'avant il affichait également une erreur Aucun nom alternatif de sujet présent.

Cependant, la première commande doit utiliser alias tomcat, sinon le serveur Bitbucket ne démarrera pas correctement :

keytool -genkey -keyalg RSA -sigalg SHA256withRSA -keystore keystore.jks -keysize 2048 -alias tomcat -ext san=ip:

openssl s_client -showcerts -connect :443 < /dev/null | openssl x509 -outform PEM > myCert.pem

keytool -import -trustcacerts -keystore /etc/pki/ca-trust/extracted/java/cacerts -alias  -file ./myCert.pem

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X