2013-05-08 2 views
0

Я работаю над приложением Java (JSE 7), которое получает закрытый ключ в формате SSLeay с внешнего сервера и нуждается в создании объекта java.security.PrivateKey. Поскольку ключ получен динамически и приложение запрещено использовать JNI, я не могу использовать openssl для преобразования ключа.Построить объект Java PrivateKey с помощью отформатированного ключа SSLeay

Вместо этого я ищу чистое Java-решение для преобразования из SSLeay в PKCS # 8 или в другой формат, из которого может быть создан PrivateKey.

В Googling представлены несколько сторонних библиотек, которые обрабатывают ключи SSLeay (например, один из «Entrust»), но я, к сожалению, ограничен в этой реализации, чтобы использовать внешние библиотеки. Да, я знаю. Даже не палаты общин.

Кто-нибудь знает какие-либо инструменты в стандартной библиотеке JSE 7, которые помогут с этим? Я не возражаю за то, чтобы писать в себе конвертацию самостоятельно, но мне было трудно найти точную спецификацию для SSLeay.

Спасибо за любые указатели!

ответ

0

Обратите внимание, что этот ответ полезен только в том случае, если вы ограничены, как и я, во избежание использования каких-либо сторонних библиотек. Если вам разрешено использовать BouncyCastle или другие библиотеки, это, по-видимому, лучший способ.

Ключ, который я получал, был ключ RSA в формате OpenSSL («традиционный SSLeay») DER, закодированный в PEM. Я был в состоянии получить Java java.security.PrivateKey объект следующим образом:

  1. Написал упрощенным МЭД анализатор, который обрабатывает только DER тегов типа 2 (целые). Парсеру пришлось обрабатывать чтение тега последовательности DER (0x30) и объектов фиксированной и переменной длины.
  2. Используется String.replace, чтобы избавиться от заголовка и нижнего колонтитула RSA в строке PEM.
  3. Используется DatatypeConverter.parseBase64Binary(), чтобы получить массив байтов из строки PEM.
  4. Использовал парсер DER для извлечения BigInteger s из данных: версия, модуль, открытый экспонента, частный показатель, простой P, простой Q, простой показатель P, простой показатель Q и коэффициент CRT (в указанном порядке).
  5. Создал объект java.security.spec.RSAPrivateCrtKeySpec (keySpec) от этих значений.
  6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

Это работает для моих целей, но неудачное переизобретение пары колес.

Смежные вопросы