Как использовать закрытый ключ ECC с Java 1.6?

Я создал новое хранилище ключей JKS, которое содержит trustCertEntry и PrivateKeyEntry. Оба созданы с использованием ECC (имя алгоритма подписи: SHA384withECDSA). Импорт можно выполнить только с помощью клавишного инструмента Java 1.7, поддерживающего ECC. Во время выполнения я использую java 1.6, которая не поддерживает ECC.

В моем коде я определил:

System.setProperty("javax.net.ssl.keyStore", "c:\mykey.ks");
System.setProperty("javax.net.ssl.keyStorePassword","abcde");

В настоящее время я получаю:

org.apache.axis2.AxisFault: невозможно декодировать данные base64: null

Есть ли способ использовать JKS с Java 1.6?


person Amir_Af    schedule 28.12.2014    source источник
comment
К вашему сведению, этикет stackoverflow заключается в том, чтобы не редактировать ответ на вопрос. Вместо этого примите ответ @omikron или опубликуйте свое решение в виде отдельного ответа.   -  person Brian    schedule 29.12.2014


Ответы (1)


По сути, чтобы сделать ECC доступным в Java 6, нужно добавить дополнительного провайдера, который поддерживает ECC. Не платя денег, у вас есть два варианта:

  1. Поставщик Sun PKCS#11
  2. Поставщик Bouncy Castle

Для варианта 1 вам понадобится собственная библиотека PKCS # 11, которой, как я полагаю, у вас нет. И вариант 2, вероятно, в любом случае является лучшим выбором, потому что PKCS#11 на самом деле предназначен для ключей в смарт-картах или модулях HSM. Но для протокола, если кто-то хочет пойти таким путем, вот описание того, как это сделать (часть NSS не имеет значения): Как экспортировать ключ ECC и сертификат из базы данных NSS и импортировать их в хранилище ключей JKS и Oracle Wallet

Вариант 2 требует, чтобы хранилище ключей было одного из типов, предоставляемых Bouncy Castle (либо BKS, либо UBER), и требует установки поставщика Bouncy Castle.

Для установки провайдера следуйте этим инструкциям: Установка провайдера. Возможно, потребуется добавить поставщика BC перед стандартным поставщиком SSL (com.sun.net.ssl.internal.ssl.Provider), но я не уверен в этом.

После этого вы можете импортировать ключ в хранилище ключей BKS с помощью команды keytool, которую вы использовали ранее, со следующими изменениями:

  • -storetype BKS вместо -storetype JKS
  • -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider

В качестве альтернативы вы можете использовать KeyStore Explorer для преобразования хранилища ключей из JKS в BKS (если вы используете KSE с Java 7 ).

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

System.setProperty("javax.net.ssl.keyStoreType", "BKS");

Так и должно быть, но, честно говоря, я бы рекомендовал либо переключиться на ключи Java 7, либо на ключи RSA.

person Omikron    schedule 28.12.2014
comment
Спасибо за быстрый и подробный ответ! - person Amir_Af; 29.12.2014
comment
Почему вы рекомендуете использовать RSA? - person Martin Wickman; 13.01.2015
comment
Потому что сочетание Java 6 и ECC часто вызывает проблемы. Я ничего не имею против ECC в целом. - person Omikron; 14.01.2015