当 FIPS 模式被禁用时,OpenSSL 生成的私钥是否可以在 FIPS 模式启用时使用?

当 FIPS 模式被禁用时,OpenSSL 生成的私钥是否可以在 FIPS 模式启用时使用?

在禁用 FIPS 模式的情况下运行时,我遇到了 OpenSSL 生成的密钥不兼容的问题,并尝试在启用 FIPS 模式的情况下使用这些密钥。

OpenSSL 版本 = OpenSSL 1.0.1e-fips 2013 年 2 月 11 日

用于创建密钥的命令(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>

cnf 文件中的“default_md”设置为 SHA256(在“[ CA_default ]”和“[ req ]”部分中)

cnf文件中的'private_key'设置为上面生成的密钥

我收到的错误是:

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 上而不是这里。)

你可以产生使用“新” PKCS8 格式的密钥(自~2000 年起!)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 之前不可用,但如果有 0.9.x 的 FIPS 版本(我不记得了),那它一定已经过期了。虽然这对您今天没有帮助,但大约一个月前终于开始测试的 AIUI 3.0.0 将在正常版本中使用 FIPS,不需要所有额外的步骤。)

仅供参考default_md, 中的[req]是用于 CSR 上的签名(或使用-x509自签名证书), 中的[CA_default]是用于证书上的签名ca——例如,您得到的是 RSAwithSHA256 而不是 RSAwithSHA1。它与任何密钥文件无关,甚至不能req生成密钥ca

相关内容