SSLHandshakeException: Pas d'autres noms de l'objet présent
Je suis en invoquant HTTPS web service SOAP par le biais de code java. J'ai déjà importé le certificat auto-signé dans jre cacerts de magasin de clés. Maintenant j'obtiens :
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 du service ne correspond pas à celle de la CN fourni dans cert. J'ai lu sur un contournement de la définition d'un nom d'hôte personnalisé vérificateur ici. Mais je ne peux pas en mesure de faire, où je dois mettre en œuvre 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. **/
String targetNameSpace = bean.getTargetNameSpace();
String endpointUrl = bean.getEndpointUrl();
QName serviceName = new QName(targetNameSpace, bean.getServiceName());
QName portName = new QName(targetNameSpace, bean.getPortName());
String SOAPAction = bean.getSOAPAction();
HashMap<String, String> 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;
}
S'il vous plaît ignorer WSBean paramètre que les espaces de noms et d'autres wsdl attributs sont en provenance de ce bean. Et si cette exception peut résoudre avec diverses solutions de contournement, pls ne le suggèrent.
- Votre service est URI aide d'une adresse IP ou un nom d'hôte?
- sa à l'aide de l'adresse ip.
Vous devez vous connecter pour publier un commentaire.
Merci,Bruno, pour me donner le heads-up sur le Nom Commun et le Nom de lieu Sujet. Comme nous l'avons compris certificat a été généré avec le CN avec DNS de nom de réseau et a demandé pour la régénération du nouveau certificat avec l'autre Nom de l'Objet entrée c'est à dire san=ip:10.0.0.1. qui est le solution réelle.
Mais, nous avons réussi à trouver un solution de contournement avec qui nous pouvons capable de tourner sur la phase de développement. Il suffit d'ajouter un bloc statique dans la classe à partir de laquelle nous faisons de la connexion ssl.
Si vous arrive d'être à l'aide de Java 8, il y a bien un moyen d'atteindre le même résultat:
CN=localhost
à la place.Contrairement à certains navigateurs, Java suit le HTTPS spécification strictement quand il s'agit de l'identité du serveur de vérification (RFC 2818, Section 3.1) et les adresses IP.
Lors de l'utilisation d'un nom d'hôte, il est possible de tomber en arrière pour le Nom Commun de l'Objet DN du certificat du serveur, au lieu d'utiliser l'autre Nom de l'Objet.
Lors de l'utilisation d'une adresse IP, il doit y avoir un autre Nom de l'Objet entrée (de type adresse IP, pas de nom DNS) dans le certificat.
Vous trouverez plus de détails sur la spécification et la façon de générer un tel certificat cette réponse.
/etc/hosts
fichier (si sous Linux, ou son équivalent Windows).