Я сталкиваюсь с несовместимостью между ключами, сгенерированными OpenSSL при работе с отключенным режимом FIPS, и попыткой использовать эти ключи при включенном режиме FIPS.
Версия OpenSSL = OpenSSL 1.0.1e-fips 11 февраля 2013 г.
Команда, используемая для создания ключа (режим FIPS отключен):
openssl genrsa -rand <path to rand file> -aes256 -passout file:<path to password file> -out <path to output .key.pem file> 4096
Команда, пытающаяся использовать ключ (режим FIPS включен):
openssl ca -config <path to cnf file> -extensions v3_usr_cert -passin file:<path to password file> -batch -notext -in <path to CSR file> -out <path to output .cert.pem file>
Для параметра «default_md» в файле cnf установлено значение SHA256 (в разделах «[CA_default]» и «[req]»).
«private_key» в файле cnf устанавливается на ключ, сгенерированный выше.
Я получаю следующую ошибку:
unable to load CA private key
139772432762696:error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips:digest.c:251:
Есть ли другой способ генерации ключа, чтобы сделать его совместимым при отключенном и включенном FIPS?
Есть ли другой способ использования ключа для подписания запроса?
решение1
genrsa
записывает «традиционный» формат OpenSSL — тот, что с меткой PEM RSA PRIVATE KEY
и добавленными заголовками Proc-Type
и DEK-Info
. Он использует нестандартный вывод ключей OpenSSL (на самом деле SSLeay) ( EVP_BytesToKey
) на основе MD5, который не одобрен FIPS. (И также не очень безопасен, но это другой вопрос, и его уже задавали или на него отвечали много раз, вероятно, больше на security.SX, чем здесь.)
Ты можешьгенерироватьключ в «новом» (примерно с 2000 года!) формате PKCS8 genpkey
(который гораздо более функционален, но, следовательно, имеет больше опций) или вы можетеконвертироватьстарый формат с любым
openssl pkey -in tradfile -passin whatever -aes256 -out pkcs8file -passout whatever
openssl pkcs8 -topk8 -in tradfile -passin whatever -v2 aes-256-cbc -out pkcs8file -passout whatever
Любой из них использует PBES2 и (следовательно) PBKDF2 с HMAC-SHA1 по умолчанию, что приемлемо для FIPS. (Технически pkey
не было доступно до версии 1.0.0, но если была версия FIPS 0.9.x, которую я не помню, она, должно быть, уже устарела. И не то чтобы это помогло вам сегодня, но AIUI 3.0.0, бета-версия которой, наконец, началась около месяца назад, будет иметь FIPS в обычной сборке, не требуя всех дополнительных шагов.)
FYI default_md
в [req]
для подписи на CSR (или с -x509
самоподписанным сертификатом) и в [CA_default]
аналогично для подписи на сертификате ca
-- например, вы получаете RSAwithSHA256 вместо RSAwithSHA1. Это не имеет ничего общего с каким-либо ключевым файлом, и только req
даже может сгенерировать ключ, ca
не может.