所以主要问题是“我可以使用经过身份验证的加密存储OpenSSL私钥(特别是RSA私钥)吗?”。
OpenSSL支持各种各样的密钥加密选项,但似乎其中许多只支持输出,而不是输入。例如,openssl genrsa -aes256
工作正常,并创建一个可以解密并稍后使用的密钥(但使用的是CBC模式),但如果执行openssl genrsa -aes-256-gcm
,则OpenSSL无法使用生成的密钥。确切的错误消息似乎因版本而异,最新的1.1.0h给出:
root@cb772d20894d:/# openssl genrsa -aes-256-gcm | openssl rsa
Generating RSA private key, 2048 bit long modulus
.................................................+++
................................................+++
e is 65537 (0x010001)
Enter pass phrase:
Verifying - Enter pass phrase:
Enter pass phrase:
unable to load Private Key
139772421357760:error:0906A065:PEM routines:PEM_do_header:bad decrypt:../crypto/pem/pem_lib.c:445:
虽然旧版本甚至没有达到以下目的:
140678952371864:error:0906B072:PEM routines:PEM_get_EVP_CIPHER_INFO:unsupported encryption:pem_lib.c:544:
aes-256-ocb
和aes-256-ccm
显示相同的错误。我认为这是所有可用的经过身份验证的密码?也许我在OpenSSL的某个地方错过了一个选项来允许这个?
答案 0 :(得分:0)
通过OpenSSL代码的一些消息显示,EVP密钥加密层并不了解auth标签,所以它们只是被抛弃而不是像人们期望的那样与IV一起存储。因此,目前没有AEAD密码可以与密钥加密系统一起使用。
答案 1 :(得分:0)
OpenSSL维护摘要算法和密码的内部表。 1.1版之前的,我们需要对该表进行显式初始化或取消初始化。因此,为了添加所有算法,您需要调用OpenSSL_add_all_algorithms()
(它将把所有算法添加到表中(摘要和密码))。这样可以解决您不支持的加密错误。
注意:确保调用EVP_cleanup()
从表中删除所有密码和摘要。