2017-02-21 51 views
0

Я могу получить доступ к URL-адресу, который я хочу, с помощью команды curl с моей машины Glassfish, указав файл cert.pem.GET from Glassfish с указанием файла .pem

Однако в моем приложении Java я попытался использовать файл jks, который содержит ту же информацию, что и я получаю исключение.

Я делаю это в Java:

System.setProperty("javax.net.ssl.keyStore", keystore_path); 
    System.setProperty("javax.net.ssl.keyStorePassword", "pass123"); 

Keystore путь извлекается

getClass().getClassLoader().getResource("/keystore.jks").getPath() 

В то время как я могу заглянуть внутрь файла JKS просто отлично с помощью утилиты Keytool, я получаю следующее stacktrace from Glassfish:

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java: 141) at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java: 126) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java: 280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java: 382) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java: 292) at sun.security.validator.Validator.validate(Validator.java: 260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java: 324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java: 229) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java: 124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java: 1491) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java: 216) at sun.security.ssl.Handshaker.processLoop(Handshaker.java: 979) at sun.security.ssl.Handshaker.process_record(Handshaker.java: 914) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java: 1062) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java: 1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java: 1387) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 543) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java: 409) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java: 177) 

Одним из предложений является указание сделать один-ва y рукопожатие, но я не уверен, как это указать.

Кроме того, могу ли я указать файл .pem, как и в случае рабочей команды curl, и будет ли это иметь какой-либо выигрыш?

ответ

1

Вам нужно установить переменную хранилища доверенных не к хранилищу

System.setProperty("javax.net.ssl.trustStore", keystore_path); 
System.setProperty("javax.net.ssl.trustStorePassword", "pass123"); 

Убедитесь, также, что keystore_path указывает на абсолютное место. Он не может загружать файлы из пути к классам.

+0

При загрузке trustStore вместо хранилища ключей я получаю org.apache.hadoop.gateway.shell.HadoopException: невозможно загрузить доверенность. Может быть связано с настройкой пароля или форматом доверия. Я могу получить доступ к содержимому сертификата с помощью keytool -list -v -keystore store.jks (что означает, что у меня есть правильный пароль). – Eugen

+0

Кажется [Hadoop] (https://github.com/apache/knox/blob/master/gateway-shell/src/main/java/org/apache/hadoop/gateway/shell/Hadoop.java) использует 'javax .net.ssl.trustStore' тоже. Коренной причиной является исключение IOException (посмотрите на код). Могут ли разрешаться файлы или указывать на плохой файл? (вы сказали, что пароль правильный). – pedrofb

+0

Пасс определенно правильный, я могу использовать keytool -list -v -keystore store.jks, чтобы проверить содержимое jks. Yeap, Hadoop также пользуется доверием. Настройка свойства keystore дает мне это, а настройка truststore не позволяет найти правильный путь сертификации. Файл JKS включен в развернутую войну, и я уже использую файл jks для аутентификации для подключения hive jdbc, и это работает нормально. Полностью тупик об этом ... – Eugen