keytool против FIPS при обработке хранилищ ключей PKCS12

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

Время от времени мы должны использовать часть программного обеспечения 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)

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

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

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

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

1 ответ

Решение

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.

Другие вопросы по тегам