Я устанавливаю клиентское приложение, которое вызывает веб-сервис. Веб-сервис развернут на сервере Weblogic. У меня есть WSDL, доступный в HTTP или Local (это то же самое), и я хочу использовать метод этой службы.
Сервер хочет получить сертификат от клиента, потому что я настроил двустороннюю аутентификацию и настроил трафик HTTPS.
Я создал клиентские классы с помощью плагина JAX-WS RI.
Мне нужно получить доступ к веб-сервису в https и передать сертификат клиента.
Вопросы:
- Почему возникает ошибка ниже, если я изменяю доступ к WSDL в HTTPS и не генерируется с использованием HTTP?
<code>Caused by: javax.net.ssl.SSLHandshakeException: General SSLEngine problem
- Достаточно ли иметь соединение в HTTPS, если я получаю доступ к WSDL в HTTP и устанавливаю BindingProvider.ENDPOINT_ADDRESS_PROPERTY в https (как я сделал)?
Это метод, который вызывает веб-сервис:
protected synchronized void reloadListaCondizioni(){
URL wsdlURL = new URL("http://localhost:7001/CondizioniWS/services/condizioniService?wsdl");
CondizioniService_Service cdzService = new CondizioniService_Service(wsdlURL);
BindingProvider bindingProvider = (BindingProvider) cdzService.getCondizioniServiceImplPort();
bindingProvider.getRequestContext().put("com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory", cdzService.getCustomSSLSocketFactory());
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://localhost:7002/CondizioniWS/services/condizioniService");
CondizioniService condizioniWS = cdzService.getCondizioniServiceImplPort();
List famiglie = condizioniWS.getStrutturaListaCondizioni("00000", "CC", "ISC", "T");
Это пользовательский SSLSocketFactory:
public SSLSocketFactory getCustomSSLSocketFactory() throws NoSuchAlgorithmException, KeyStoreException, CertificateException, FileNotFoundException, IOException, UnrecoverableKeyException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSLv3");
KeyManagerFactory kmf =
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
String certPasswd = "mypassword";
ks.load(new FileInputStream("C:\\....\\client_keystore.jks"), certPasswd.toCharArray());
kmf.init(ks, certPasswd.toCharArray());
sc.init( kmf.getKeyManagers(), null, null );
return sc.getSocketFactory();
}