keytool против FIPS при работе с хранилищами ключей PKCS12 - PullRequest
0 голосов
/ 14 мая 2018

Справочная информация: что работает

Время от времени нам приходится использовать часть программного обеспечения Java, которое читает хранилища ключей PKCS # 12.Для этого конкретного проекта нам необходимо создавать открытые / закрытые пары по мере необходимости, и мы храним ключи в файлах PKCS12, потому что он стабилен, и почти все могут читать этот формат.

Поскольку мы делаемУ нас много Java, keytool сидят без дела, и мы решили, что просто используйте keytool для создания закрытого ключа и сертификата.Типичный пример выглядит следующим образом:

keytool -keystore MyLuggage.p12 -storepass 123456 -storetype pkcs12
   -alias "......"
   -genkeypair -keyalg RSA -keysize typically_2048_or_3072 -sigalg SHA256withRSA

   -ext "KeyUsage=dataEncipherment,digitalSignature,keyEncipherment"
   -startdate ....
   -dname "......."

Фактический -keysize на практике варьируется между 2048 и 8192;для целей этого вопроса, похоже, не имеет значения, что используется, но, очевидно, мы используем длины ключей, соответствующие задаче, если мы вообще их выбираем (обычно это диктуется ограничениями другого программного обеспечения или диктуетсянекоторые правила, которые нам передали).

Это всегда работало, в том, что другое программное обеспечение - включая программное обеспечение Java, упомянутое в начале - может читать хранилище ключей и использовать закрытые ключи внутри.(И открытый ключ можно экспортировать и использовать, и т. Д.)

Вот что ломается

Программное обеспечение недавно было обновлено до версии, использующей сертифицированную FIPS 140 Javaбиблиотеки от RSA.(«BSAFE» или «JSAFE» в зависимости от того, кого вы спрашиваете.) И теперь, попытка открыть ранее созданные файлы PKCS # 12 завершается неудачно с

java.lang.SecurityException: Algorithm not allowable in FIPS140 mode: PBE/PKCS12/SHA1/RC2/CBC/40
    at ......
    at java.security.KeyStore.load(Unknown Source)

.источник RSA, которого у нас нет, и он ищет имена функций, которые в любом случае были запутаны.Так что, глядя на их источник, чтобы попытаться выяснить, что именно он тестирует, чтобы вызвать это, не вариант.

Итак, что является причиной ?Единственные алгоритмы, которые мы выбрали, - это генерация ключа «RSA» и подпись «SHA256withRSA», оба из которых разрешены FIPS 140-2.Я снова просматривал вывод keytool -genkeypair -help и, похоже, не было никаких других алгоритмов или параметров безопасности.(Мы избегали использования -keypass, потому что инструменты PKCS # 12 действительно ненавидят его, когда пароль хранилища ключей и пароль ключа различаются, и keytool -genkeypair по умолчанию вводит пароль ключа в пароль хранилища ключей.) Остальная часть сообщения об ошибке сбивает с толку, поскольку мы нигде не указываем использование SHA-1 или RC2 (!).

Поиск в Google указывает на людей, имеющих проблемы с созданием SSL-сертификатов, которые мы здесь не делаем, и на решения, предоставленныеКажется, что это специфично для Tomcat.

Это проблема с тем, как мы создаем хранилище ключей, как мы создаем пару ключей в хранилище ключей, или какую-то "особенность"FIPS 140, с которым мы раньше не сталкивались?

1 Ответ

0 голосов
/ 17 мая 2018

PKCS # 12 хранит закрытый ключ, зашифрованный с помощью ключа, полученного из пароля.Похоже, что keytool использует pbeWithSHAAnd128BitRC2-CBC (pkcs-12PbeIds 5), алгоритм PBES1 для этого.Даже keytool.exe в Oracle Java 9 действительно использует этот алгоритм, поскольку вы можете проверить его, загрузив файл .p12 в онлайн-декодер ASN.1 , декодирующий образец файла PKCS # 12 .

Если я правильно прочитал PKCS # 12 , то PBES1 давно заменили «более новой» версией системы получения ключей, названной «PBES2» (в основном на основе PBKDF2), с которой нужно было бы работать.Но keytool не использует его.Это мое толкование сообщения об ошибке.

Поэтому сертификат и ключ могут быть приемлемыми, но контейнер PKCS # 12 неприемлем.Вы можете попытаться извлечь ключ и сертификат и сохранить их в новом файле PKCS # 12, используя текущее программное обеспечение, такое как OpenSSL (или вы просто сгенерируете весь файл PKCS # 12 напрямую, используя OpenSSL).

OpenSSL имеет возможность указать PBE, используемый для шифрования ключей и сертификатов (параметры -keypbe и -certpbe в режиме PKCS # 12).Я не проверял это, но алгоритм вроде AES-256-CBC должен быть FIPS140-совместимым.

...