SSLHandshakeException: нет альтернативных имен субъектов



Я вызываю HTTPS SOAP web service через java-код. Я уже импортировал самозаверяющий сертификат в хранилище ключей jre cacerts. Теперь я получаю:



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


имя хоста URL-адреса службы не совпадает с именем CN, указанным в сертификате. Я читал о обходном пути определения пользовательского верификатора имени хоста здесь. Но я не могу сделать, где я должен реализовать обходной путь в моем коде.



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;
}


Пожалуйста, игнорируйте параметр WSBean как пространства имен и другие атрибуты wsdl поступают из этого компонента. И если это исключение можно решить с помощью некоторых различных обходных путей, pls предлагают.

650   2  

2 ответов:

спасибо, Бруно за то, что предупредил меня об общем имени и альтернативном имени субъекта. Как мы выяснили, сертификат был сгенерирован с CN с DNS-именем сети и запросил регенерацию нового сертификата с записью альтернативного имени субъекта, т. е. san=ip:10.0.0.1. который является фактическое решение.

но, нам удалось узнать a решение С которым мы можем способный для того чтобы побежать на участке развития. Просто добавить статический блок в класс, из которого мы создание ssl-соединения.

static {
    HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier()
        {
            public boolean verify(String 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;
            }
        });
}

Если вы используете Java 8, есть гораздо более гладкий способ достижения того же результата:

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

В отличие от некоторых браузеров, Java строго следует спецификации HTTPS, когда дело доходит до проверки подлинности сервера (RFC 2818, раздел 3.1) и IP-адресов.

при использовании имени хоста можно вернуться к общему имени в DN субъекта сертификата сервера вместо использования альтернативного имени субъекта.

при использовании IP-адреса должна быть запись альтернативного имени субъекта (типа IP-адрес, а не DNS-имя) в поле сертификат.

вы найдете более подробную информацию о спецификации и как создать такой сертификат в ответ.

Comments

    Ничего не найдено.