Я пытаюсь запросить данные у веб-службы, которая требует, чтобы клиент представил сертификат клиента. Сервер использует SSL для всех соединений и использует самозаверяющий сертификат. Я дал Netbeans WSDL-файл службы, и он сгенерировал код клиента с wsimport
.
У меня нет проблем, когда мой клиентский код написан в обычном приложении Java; Я установил в хранилище доверия файл cacerts
, содержащий сертификат сервера, установил хранилище ключей как файл, предоставленный администратором сервера в формате JKS, содержащий 2 ключа - личный ключ клиента и открытый ключ сервера, создаю объект запроса. и отправьте запрос.
Проблема возникает, когда я перемещаю ее в корпоративную среду Java. Требования диктуют, что код должен быть Enterprise JavaBean внутри Enterprise Archive, запущенного на сервере приложений Glassfish. Похоже, что Glassfish имеет свои собственные настройки безопасности, которые переопределяют настройки JVM. Когда выполняется метод EJB, содержащий вызов веб-службы, согласование SSL завершается ошибкой: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
. Я не знаю, как настроить параметры безопасности Glassfish как настройки моей JVM, кто-нибудь может объяснить настройки безопасности Glassfish? Проведенное мной исследование показало, как настроить Glassfish в качестве веб-службы сервер , а не веб-службы клиент .
У меня есть файл сертификата .cer для сервера, который я добавил в свое хранилище доверенных сертификатов, используя keytool
Java для добавления его в файл cacerts
по умолчанию.
Было бы лучше изменить файл cacerts
с помощью InstallCert
для включения самозаверяющего сертификата, следуя инструкциям на http://blog.johnryding.com/post/1548502059/acquire-an-ssl-certificate-for-your-java-programs-in-win?
У меня есть файл хранилища доверенных сертификатов, файл хранилища ключей, файл сертификата .cer и сертификат браузера .p12, которые хранятся в $ JAVA_HOME / jre / lib / security и $ JAVA_HOME / lib / security.
Я использую Netbeans 6.9.1 и Glassfish 3.1 Final. Соответствующий фрагмент кода ниже, скопированный из моего EJB. Исключение возникает в последней строке.
System.setProperty("javax.net.ssl.trustStore", "C:\\jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStore", "C:\\userCertificate.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "password");<br>
RequestObject request = new RequestObject;<br>
request.setQuery("some data");<br>
request.setUsername("user");<br>
request.setPassword("pass");<br>
Service service = new Service();<br>
Endpoint port = service.getWebServicePort();<br>
Result result = port.specificWebServiceMethod(request);