SSLHandshakeException: aucun autre nom de sujet présent

J’appelle le service Web HTTPS SOAP via le code Java. J’ai déjà importé un certificate auto-signé dans le fichier de clés jre cacerts. Maintenant je reçois:

com.sun.xml.internal.ws.com.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present 

Le nom d’hôte de l’URL de service ne correspond pas à celui du CN fourni dans cert. J’ai lu une solution de contournement pour définir un vérificateur de nom d’hôte personnalisé ici . Mais je ne peux pas faire où je devrais implémenter la solution de contournement dans mon code.

 public SOAPMessage invokeWS(WSBean bean) throws Exception { SOAPMessage response=null; try{ /** Create a service and add at least one port to it. **/ Ssortingng targetNameSpace = bean.getTargetNameSpace(); Ssortingng endpointUrl = bean.getEndpointUrl(); QName serviceName = new QName(targetNameSpace, bean.getServiceName()); QName portName = new QName(targetNameSpace, bean.getPortName()); Ssortingng SOAPAction = bean.getSOAPAction(); HashMap map = bean.getParameters(); Service service = Service.create(serviceName); service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl); /** Create a Dispatch instance from a service. **/ Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE); // The soapActionUri is set here. otherwise we get a error on .net based // services. dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, new Boolean(true)); dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, SOAPAction); /** Create SOAPMessage request. **/ // compose a request message MessageFactory messageFactory = MessageFactory.newInstance(); SOAPMessage message = messageFactory.createMessage(); // Create objects for the message parts SOAPPart soapPart = message.getSOAPPart(); SOAPEnvelope envelope = soapPart.getEnvelope(); SOAPBody body = envelope.getBody(); SOAPElement bodyElement = body.addChildElement(bean.getInputMethod(), bean.getPrefix(), bean.getTargetNameSpace()); ...more code to form soap body goes here // Print request message.writeTo(System.out); // Save the message message.saveChanges(); response = (SOAPMessage)dispatch.invoke(message); } catch (Exception e) { log.error("Error in invokeSiebelWS :"+e); } return response; } 

Veuillez ignorer le paramètre WSBean car les espaces de noms et les autres atsortingbuts wsdl proviennent de ce bean. Et si cette exception peut être résolue avec des solutions de contournement différentes, les pls suggèrent.

Merci, Bruno, de m’avoir donné des informations sur le nom commun et le nom alternatif du sujet. Comme nous l’avons compris, le certificate a été généré avec CN avec le nom DNS du réseau et a demandé la régénération du nouveau certificate avec l’entrée Autre nom du sujet, à savoir san = ip: 10.0.0.1. quelle est la solution réelle ?

Mais, nous avons réussi à trouver une solution avec laquelle nous pouvons exécuter en phase de développement. Ajoutez simplement un bloc statique dans la classe à partir de laquelle nous établissons la connexion ssl.

 static { HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { public boolean verify(Ssortingng hostname, SSLSession session) { // ip address of the service URL(like.23.28.244.244) if (hostname.equals("23.28.244.244")) return true; return false; } }); } 

Si vous utilisez Java 8, il existe un moyen beaucoup plus efficace d’obtenir le même résultat:

 static { HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals("127.0.0.1")); } 

Contrairement à certains navigateurs, Java respecte ssortingctement la spécification HTTPS en ce qui concerne la vérification de l’identité du serveur (RFC 2818, section 3.1) et les adresses IP.

Lorsque vous utilisez un nom d’hôte, il est possible de revenir au nom commun dans le nom distinctif du sujet du certificate du serveur, au lieu d’utiliser le nom alternatif du sujet.

Lors de l’utilisation d’une adresse IP, le certificate doit contenir une entrée de nom de sujet alternatif (de type adresse IP et non de nom DNS).

Vous trouverez plus de détails sur la spécification et sur la manière de générer un tel certificate dans cette réponse .