Взаимный SSL - получение ключей/хранилищ доверия в надлежащих форматах

Я сгенерировал CSR с помощью OpenSSL:

openssl req -out MyCompanyCsr.csr -new -newkey rsa:2048 -nodes -keyout MyCompanyPrivateKey.key

Итак, начнем с того, что имеем:

- MyCompanyPrivateKey.key
- MyCompanyCsr.csr

Затем я отправил его нашему партнеру по интеграции, который ответил тремя файлами:

- PartnerIntermediateCa.crt
- PartnerRootCa.crt
- MyCompanyCsr.crt

Теперь мне нужно подключиться к их веб-службе, используя взаимный SSL. Я знаю, что для этого мне нужно установить хранилище доверенных сертификатов и хранилище ключей в моем SSLSocketFactory для JAXB.

Я создаю хранилище ключей и хранилище доверенных сертификатов в Java, используя:

      KeyStore trustStore = KeyStore.getInstance("JKS");
      InputStream tsis = ClassLoader.getSystemResourceAsStream(trustStorePath);
      trustStore.load(tsis, "mypassword".toCharArray());
      tsis.close();

      KeyStore keyStore = KeyStore.getInstance("JKS");
      InputStream ksis = ClassLoader.getSystemResourceAsStream(keyStorePath);
      keyStore.load(ksis, "mypassword".toCharArray());
      if (ksis != null) {
        ksis.close();
      }

      TrustManagerFactory tmf =
          TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      tmf.init(trustStore);

      KeyManagerFactory kmf =
          KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
      kmf.init(keyStore, "mypassword".toCharArray());

Однако попытка использовать этот код для подключения к серверу выдает SSLHandshakeException с сообщением http.client.failed:

com.sun.xml.ws.client.ClientTransportException: HTTP transport error: 
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

keystore и truststore, которые я использую, были экспортированы из моего браузера, с закрытым ключом клиента в виде файлов PKCS и сертификатом сервера в виде файлов x509 Cert PKCS#7 w/ Chain'. Then opened them up in Portecle and exported them both asJKS`.

Предполагая, что код Java является законным, как я могу быть уверен, что правильно создал keystore и truststore?

Большое спасибо.


person Cuga    schedule 10.08.2012    source источник


Ответы (1)


Я наконец понял это. Я использовал FireFox и Portecle.

Установите сертификаты сервера и закрытый ключ в браузере.

Примечание. Один всегда сбивающий с толку момент: и "хранилище доверенных сертификатов", и "хранилище ключей" являются хранилищами ключей с точки зрения Portecle/Java. Единственная разница заключается в том, что тот, который мы используем в качестве нашего хранилища ключей в клиенте, будет иметь наши закрытые ключи в дополнение к общедоступным сертификатам.

TrustStore, созданный с использованием сертификатов сервера:

  • Перейдите по URL-адресу по адресу, нажмите рядом с адресной строкой (значок замка, показывающий, что SSL включен)
  • Вкладка «Безопасность» > «Просмотр сертификата» > вкладка «Сведения» > кнопка «Экспорт»
  • Выберите тип: Сертификат X.509 с цепочкой (PKCS#7).
  • Сохраните где-нибудь как ffTestServerCert.crt

  • Откройте в Portecle через: меню «Проверить»> «Проверить сертификат»> выберите ffTestServerCert.crt.

  • Теперь вы можете увидеть содержащиеся в нем сертификаты (например, я вижу 3). Каждый должен быть экспортирован сам по себе. Нажмите кнопки со стрелками в верхней части страницы и для каждого:
  • Нажмите кнопку «Кодирование PEM».
  • Кнопка Сохранить
  • Сохранить как файл .pem на диске (например, у меня есть caCert1.pem, caCert2.pem, caCert3.pem)

  • Создайте новое хранилище ключей в Portecle: Файл > Новое хранилище ключей > JKS

  • Для каждого экспортированного сертификата сверху (caCert1.pem, caCert2.pem, caCert3.pem) выполните:
  • Инструменты > Импорт доверенного сертификата > выберите кнопку .pem > Импорт
  • Появится окно сообщения о том, что нам нужно определить, доверяем ли мы этому сертификату.
  • Нажмите «ОК»> «ОК» (если вы доверяете сертификату)> «Да»> «Введите псевдоним» (я оставил его по умолчанию)> «ОК».
  • Повторите для любых других сертификатов, которые вы хотите импортировать (я сделал все 3).

  • Сохраните хранилище ключей в Portecle:

  • Файл > Сохранить хранилище ключей как... >
  • Дважды введите пароль truststore
  • Введите имя для сохранения, например clientTrustStore.jks.

Поздравляем, это правильное хранилище доверенных сертификатов.

Хранилище ключей, созданное с использованием закрытого ключа и сертификатов сервера:

  • Сначала импортируйте закрытые ключи в FireFox (или Chrome или IE)
  • Используйте браузер для экспорта закрытого ключа в формате PKCS.
  • Firefox> Настройки> вкладка «Дополнительно»> вкладка «Шифрование»> «Просмотр сертификатов»> «Ваши сертификаты».
  • Выберите тот, который вы хотите экспортировать> нажмите кнопку «Резервное копирование».
  • (Единственный вариант здесь - формат PKCS12, что нам и нужно)
  • Выбираем имя - clientKeys.p12
  • введите пароль для хранилища ключей
  • Должен сказать, что они были экспортированы, нажмите «ОК».

  • Открытые ключи в Portecle

  • Файл> Открыть хранилище ключей> выберите clientKeys.p12, который мы сохранили выше.
  • Введите пароль, выбранный выше

  • Преобразование в JKS с помощью Portecle

  • Инструменты > Изменить тип хранилища ключей > JKS
  • Прочтите предупреждающее сообщение о том, что текущий тип не поддерживает пароли для ввода пары ключей.
  • Важно! это действие устанавливает внутренний пароль для записей пары ключей password.
  • Чтобы изменить пароль внутренних записей пары ключей, выберите любую «пару ключей» в файле в Portecle (их значок будет представлять собой пару ключей поверх другого)
  • Щелкните правой кнопкой мыши «ввод пары ключей»> «Установить пароль».
  • Введите старый пароль (который является «паролем») и введите новые пароли к тому, что вы хотите
  • Нажмите ОК

  • Сохраните хранилище ключей:

  • В Portecle выполните: Файл > Сохранить хранилище ключей как > введите имя, например clientKeyStore.jks.
  • Нажмите Сохранить

Готово

Теперь у вас есть правильно настроенные файлы clientTrustStore.jks и clientKeyStore.jks для аутентификации вашего клиента.

Чтобы увидеть пример того, как их теперь можно использовать, вы можете проверить: SOAP с взаимным SSL - как отправлять учетные данные?

person Cuga    schedule 10.08.2012