java - SSL в RMI

Я пытаюсь запустить пример кода для создания RMI здесь, и пока я могу запустить сервер, если изменю файл политики на это:

grant {
    permission java.net.SocketPermission "*", "listen,accept,resolve";
};

Клиент возвращает это исключение:

HelloClient exception: error during JRMP connection establishment; nested exception is: 
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
java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
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
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Client.Client.main(Client.java:25)
Caused by: 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
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.DataOutputStream.flush(Unknown Source)
... 5 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
... 16 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
... 22 more

но я даже не могу найти, где все эти вещи определены, поэтому могу даже попытаться решить эту проблему. Может кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ:

Теперь это дает мне эту ошибку. Я думаю, что это связано с якорями доверия, но я не могу понять, как их определить.

 HelloClient exception: error during JRMP connection establishment; nested exception is: 
     javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
 java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
     javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at Client.Client.main(Client.java:25)
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.SSLSocketImpl.handleException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.handleException(Unknown Source)
at sun.security.ssl.AppOutputStream.write(Unknown Source)
at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
at java.io.BufferedOutputStream.flush(Unknown Source)
at java.io.DataOutputStream.flush(Unknown Source)
... 5 more
 Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at sun.security.validator.PKIXValidator.<init>(Unknown Source)
at sun.security.validator.Validator.getInstance(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.getValidator(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.writeRecord(Unknown Source)
... 9 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(Unknown Source)
at java.security.cert.PKIXParameters.<init>(Unknown Source)
at java.security.cert.PKIXBuilderParameters.<init>(Unknown Source)
... 22 more

person user2934164    schedule 06.05.2016    source источник
comment
@EJP этот пост мне не помог ... Я не понимаю ответа, и я понял, что пробовал: изменил JAVA_HOME на java1.8 ... где находится samplecacert. Пытался переместить samplecacert в корневой каталог проекта, в папку src и в папку сервера.   -  person user2934164    schedule 07.05.2016


Ответы (1)


Проверьте раздел файла README.txt "ЗАМЕТКИ ДЛЯ РАБОТЫ С JDK SUN", похоже, вы используете Java со стандартным trustore.

samplecacerts

Этот файл хранилища доверенных сертификатов очень похож на стандартный файл cacerts JDK, поскольку он содержит сертификаты доверия от нескольких поставщиков. Он также содержит доверенные сертификаты от "Duke" и "localhost" выше.

Пароль для этого хранилища ключей совпадает с исходным паролем JDK cacert: changeit

См. Документацию вашего провайдера, чтобы узнать, как настроить местоположение вашего доверенного файла сертификата.

ЗАМЕЧАНИЯ ПО РАБОТЕ С SUN JDK:

Пользователи Sun JDK могут указать местоположение хранилища доверенных сертификатов, используя один из следующих методов (более подробно они описаны в Справочном руководстве Sun JDK JSSE):

  1. Свойства системы:
    java -Djavax.net.ssl.trustStore=samplecacerts \
    -Djavax.net.ssl.trustStorePassword=changeit
    Application
  1. Установите файл в:
    <java-home>/lib/security/jssecacerts
  1. Установите файл в:
    <java-home>/lib/security/cacerts

Если вы выберете 2) или 3), обязательно замените этот файл рабочим файлом cacerts перед развертыванием.

person vzamanillo    schedule 06.05.2016
comment
Спасибо за ответ. Попробовал то, что вы сказали, и ошибка изменилась. Отредактировал исходный вопрос. - person user2934164; 06.05.2016
comment
Это все об использовании сертификата герцога, предоставленного с образцом кода. В вопросе нет доказательств того, что OP это делает. - person user207421; 06.05.2016
comment
Мой ответ относится к первой ошибке, а не к ошибке, добавленной после настройки trustore, которая не является исходным вопросом. - person vzamanillo; 06.05.2016
comment
В вашем ответе говорится, что он должен использовать файл samplecacerts, поставляемый с образцами, что не требуется, если он не использует сертификат герцога. Приведенное вами примечание касается запуска примера кода, а не общего программного обеспечения с использованием JSSE. - person user207421; 07.05.2016
comment
Примечание связано с исходным вопросом, проблема с запуском примера, и ему не нужен сертификат герцога, но нужна запись localhost, прочтите запись rmi в файле readme - person vzamanillo; 07.05.2016