sun.security.validator.ValidatorException: сбой построения пути PKIX

Я создал запрос CSR с помощью этой команды:

openssl req -out certificatecsr.csr -new -newkey rsa: 2048 -keyout certificatekey.key

После этого CA поделился со мной файлом сертификата (.cer).

Теперь после этого я преобразовал файл .cer в .p12 с помощью ключа.

Создание сертификата .p12 с использованием сертификата, отправленного центром сертификации, и закрытого ключа

C: \ Java \ jdk1.6.0_38 \ jre \ bin> openssl pkcs12 -export -in C: \ Users \ asharma1 \ cert.cer -inkey certificatekey.key -out

certi.p12

Создание хранилища ключей JKS:

keytool -genkey -alias quid -keystore quid.jks

импорт сертификата .p12 в хранилище ключей jks

C: \ Java \ jdk1.6.0_38 \ jre \ bin> keytool -v -importkeystore -srckeystore C: \ OpenSSL-Win64 \ bin \ certi.p12 -srcstoretype PKCS12

-destkeystore quid.jks -deststoretype JKS

но когда я ссылаюсь на этот JKS из своего java-кода, я получаю эту ошибку:

sun.security.validator.ValidatorException: сбой при построении пути PKIX:

sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

Я также добавил файл cer в cacerts. но все еще получаю ту же ошибку.

Что касается кода JAVA, я ссылаюсь на эту ссылку, чтобы ссылаться на мое собственное созданное хранилище ключей:

http://jcalcote.wordpress.com/2010/06/22/managing-a-dynamic-java-trust-store/

public SSLContext getSSLContext(String tspath) 
        throws Exception {

      TrustManager[] trustManagers = new TrustManager[] { 

        new ReloadableX509TrustManager(tspath) 
      };
      SSLContext sslContext = SSLContext.getInstance("TLS");

      sslContext.init(null, trustManagers, null);

      return sslContext;

    }

SSLContext sslContext=getSSLContext("C:\\Java\\jdk1.6.0_38\\jre\\bin\\quid.jks");
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
URL pickUrl = new URL(pickupLocation);
URLConnection urlConn = pickUrl.openConnection();
HttpsURLConnection httpsURLConn = (HttpsURLConnection)urlConn;
httpsURLConn.setSSLSocketFactory(socketFactory);
String encoding = urlConn.getContentEncoding();   
InputStream is = urlConn.getInputStream();    
InputStreamReader streamReader = new InputStreamReader(is, encoding != null
? encoding : "UTF-8");

Обратите внимание, я не использую сервер. Я пытаюсь запустить выше написанный код только с помощью основного метода.

Пожалуйста, дайте мне знать, что нужно сделать. Зачем мне нужно конвертировать мой файл .cer в файл .p12?


person Anil Sharma    schedule 15.07.2014    source источник
comment
В этом нет никакого смысла. Вы должны сначала сгенерировать закрытый ключ . Затем CSR. Тогда подпиши это. Затем заново скомбинируйте его с закрытым ключом.   -  person user207421    schedule 15.07.2014
comment
Команда @EJP openssl req -out certificatecsr.csr -new -newkey rsa:2048 -keyout certificatekey.key создает новый запрос сертификата и новый закрытый ключ на основе документации, здесь   -  person pepo    schedule 15.07.2014
comment
Так почему именно вы используете keytool -genkey?   -  person user207421    schedule 15.07.2014
comment
@EJP Именно это и происходит. Сначала генерируем закрытый ключ и csr, а затем подписываем CA, а затем объединяем его с закрытым ключом для формирования хранилища ключей .p12, после чего конвертируем его в хранилище JKS.   -  person Anil Sharma    schedule 15.07.2014
comment
Нет. 'Keytool -genkey' создает новый ключ. См. Документацию. Ваша последовательность команд не имеет смысла.   -  person user207421    schedule 16.07.2014


Ответы (2)


Я бы посоветовал вам импортировать сертификат CA (или всю цепочку CA и промежуточных CA) в хранилище ключей.

Думаю, что п12 импортировали нормально. Я предлагаю импортировать цепочку в хранилище ключей. По крайней мере, об этом говорится в сообщении об ошибке.

Я предполагаю, что:

  • корневой ЦС в цепочке не является доверенным, поэтому построение цепочки не удается или
  • в сертификатах в цепочке нет раздела AIA, поэтому нельзя получить сертификаты до доверенного корневого ЦС, поэтому построение цепочки не удается или
  • сертификаты не извлекаются на основе AIA, потому что он не реализован в java (я не программист java), поэтому построение цепочки не удается

Вы можете использовать portecle для импорта отсутствующих сертификатов доверенного ЦС (не сертификата конечного объекта, который у вас есть в .p12 или в отдельном .cer файл, полученный от выдающего центра сертификации). Это более удобно, чем keytool. Просто следуйте этому руководству.

person pepo    schedule 15.07.2014
comment
Спасибо за ответ, проверил с помощью portecle. сертификат присутствует в хранилище ключей quid.jks. Я проверил как файл .cer, так и файл .p12 в quid.jks. Однако, когда я пытаюсь импортировать доверенный сертификат (certi.p12) через portecle, он показывает мне ошибку «Сертификат не найден в certi.p12», но работает. cer файл. Я не уверен в корневом ЦС и промежуточных ЦС. Что нужно проверить? Думаю, импорт сертификата эквивалентен импорту ЦС. - person Anil Sharma; 15.07.2014

Я бы посоветовал вам использовать формат * .der вместо формата .p12.

Вот общее описание того, как импортировать сертификаты, чтобы исправить следующую ошибку:

Ошибка при попытке выполнить запрос. javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели

Как импортировать сертификаты

  1. Go to URL in your browser, click on HTTPS certificate chain (little lock symbol next to URL address) to export the certificate
    • Click "more info" > "security" > "show certificate" > "details" > "export..".
    • Сохранить как .der
    • Повторите эти действия для любых сертификатов, которые необходимо импортировать.
  2. Найдите $ JAVA_HOME / jre / lib / security / cacerts.
  3. Импортируйте все файлы * .der в файл cacerts, используя следующее:

    sudo keytool -import -alias mysitestaging -keystore $JAVA_HOME/jre/lib/security/cacerts -file staging.der
    sudo keytool -import -alias mysiteprod -keystore  $JAVA_HOME/jre/lib/security/cacerts -file prod.der
    sudo keytool -import -alias mysitedev -keystore  $JAVA_HOME/jre/lib/security/cacerts -file dev.der
    
  4. Пароль хранилища ключей по умолчанию - changeit.

  5. Вы можете просмотреть изменения, внесенные с помощью этой команды, которая показывает отпечаток сертификата.

    keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
    
  6. Если это не решит проблему, попробуйте добавить эти параметры java в качестве аргументов:

    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts"
    -Djavax.net.ssl.trustStorePassword="changeit"
    
person Katie    schedule 18.10.2016