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

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

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, указанному в сертификате. Я читал об обходном пути определения пользовательского верификатора Hostname здесь . Но я не могу сделать, где я должен реализовать обходной путь в моем коде.

 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 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 действительно предлагает.

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

Но нам удалось найти обходное решение, с которым мы можем работать на этапе разработки. Просто добавьте статический блок в class, из которого мы создаем соединение 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-адресов.

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

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

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

  • Смутно о том, как обращаться с запросами preflight CORS OPTIONS
  • Самостоятельный SSL-сертификат Tomcat Server / Client
  • Подключение удаленного экземпляра tomcat JMX с помощью jConsole
  • Несколько портов (8005, 8080, 8009), требуемых Tomcat Server на локальном хосте, уже используются
  • Статус HTTP 404 - Запрошенный ресурс (/) недоступен
  • Как вызвать метод до уничтожения объекта сеанса?
  • Максимальный размер содержимого параметра POST?
  • SQLException: не найдено подходящего драйвера
  • Tomcat VS Jetty
  • Как я могу сделать компиляцию JSP Tomcat при запуске?
  • Tomcat начал работать в Eclipse, но не смог подключиться к http: // localhost: 8085 /
  • Interesting Posts

    Как я могу иметь другой текст в нижнем колонтитуле на каждой странице документа Word?

    Угловое изменение на каждом нажатии клавиши

    Есть ли в Firefox плагин проверки HTML5?

    Генерация случайных чисел в C ++ 11, как сгенерировать, как они работают?

    Адрес конечной точки изменения WCF во время выполнения

    Попытка запустить средство создания медиа – «Что-то случилось 0x80070002 – 0x20016»

    Как добавить push-уведомление в мое собственное приложение для Android

    F #: let mutable vs. ref

    TransformException дубликат записи для common.annotations.Beta

    Как я могу обновить драйвер дисплея AMD Catalyst?

    Список поиска с взаимным счетом (2-я попытка)

    Я подключен ко ВСЕМ людям, которые в настоящее время загружают / посещают этот файл Bittorrent?

    Используя команду history с помощью ssh и получать выходные данные с отметками времени

    Как отформатировать указатель на функцию?

    Обратный вызов, когда свойство зависимостей получает изменение xaml

    Давайте будем гением компьютера.