openssl - 如何使用 Openssl 制作自签名 RSA_PSS_RSAE 证书
问题描述
我想制作如下证书。rsassaPss 作为签名算法,rsaEncryption 作为公钥算法。
Certificate:
Data:
Version: 3 (0x2)
....
Signature Algorithm: rsassaPss
Hash Algorithm: sha1 (default)
Mask Algorithm: mgf1 with sha1 (default)
Salt Length: 20 (default)
Trailer Field: 0xbc (default)
....
Subject: .....
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
.....
我尝试了以下操作,但结果都相同。
1
openssl genpkey -algorithm RSA-PSS -out test1\ca2.key.pem -pkeyopt rsa_pss_keygen_md:sha1 -pkeyopt rsa_pss_keygen_mgf1_md:sha1 -pkeyopt rsa_pss_keygen_saltlen:20
openssl req -x509 -new -nodes -key test1\ca2.key.pem -days 1024 -out test1\ca2.crt.pem
2
openssl req -new -newkey rsa-pss -pkeyopt rsa_keygen_bits:2048 -sigopt rsa_mgf1_md:sha256 -passout pass:123456 -sha256
openssl x509 -req -in test3\rootreq.pem -passin pass:123456 -sha256 -days 14600 -extensions v3_cn -signkey test3\rootkey.pem -out test3\rootcert.pem
谁能帮我?
解决方案
要获得您显示的内容,请将密钥文件创建为 v1.5,但使用 PSS签署证书。对于自签名证书:
# in separate steps either of
openssl genrsa 2048 >keyfile
openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 >keyfile
# in either case add encryption if desired; your Q is inconsistent about that
# then
openssl req -new -x509 -key keyfile -sigopt rsa_padding_mode:pss -sha1 -sigopt rsa_pss_saltlen:20 -out certfile
# add options for subject, days, extensions, or other config as desired
# for 1.0.0 & 1.0.1 -sha1 was default for hash and can be omitted;
# in all versions MGF1 hash defaults to data hash
# but saltlen defaults to 0xEA -- I'm not sure why -- and must be set
# in one step
openssl req -new -x509 -newkey rsa:2048 -keyout keyfile -sigopt rsa_padding_mode:pss -sha1 -sigopt rsa_pss_saltlen:20 -out certfile
也就是说,我基本同意马特的评论;如果这是您的实际目标,这不一定是 TLS1.3 rsa_pss_rsae 签名所需要的。首先,自签名、根证书或其他锚证书上的签名根本不利于安全,通常甚至不检查;RFC8446 4.2.3 明确允许该签名不满足 sigalgs。(尽管我认为这是一个错误;鉴于规范的其余部分,将其从 sigalgs或 sigalgs_cert中排除会更有意义,无论哪个适用。)
其次,如果这是一个重要的签名——在由(不同的)CA 颁发的证书上,如果你愿意,OpenSSL 也可以这样做,但不同的是——那么使用 SHA-1 将是非常糟糕的。RFC8446 允许证书签名仅将 SHA-1 用作最后的手段——对于任何公钥算法(RSAv1.5、RSA-PSS、ECDSA、EdDSA)——并且某些实现不信任使用它们的证书在“破碎”和现在“混乱”(谷歌,或查看 crypto.SX 和 security.SX 了解详细信息)。
推荐阅读
- python - 压缩最长的列表并对齐输出。python itertools 从头开始
- python - 无法将变量从一个函数定义到另一个函数
- python - 在 chrome cookie 中编码 blob
- django - TypeError:entry() 缺少 1 个必需的位置参数:'title'(Django 帮助)
- javascript - 未捕获的 ReferenceError:在初始化之前无法访问“类”
- android-studio - Ctrl + L 不能用作我的评论快捷方式
- azure - 如何使用来自 secrets.json Azure 应用服务配置的嵌套值
- python - 我希望在单击复选按钮之前将框架默认为隐藏
- maven - 上传新包后无法搜索
- django - 我应该如何避免这种竞争条件?