我正在尝试使用RSA密钥对签名和validation签名。
下面是我如何生成密钥对(哪些encryption/解密工作正常):
ssh-keygen -t rsa -f mykey -N '' -b 2048 mv mykey mykey-priv.pem ssh-keygen -f mykey.pub -e -m pem > mykey-pub.pem ; rm -f mykey.pub
但是,当我尝试encryption散列(使用私钥),然后validation它(使用公钥),它将失败:
openssl dgst -sha256 /etc/hosts > /tmp/hash openssl rsautl -sign -inkey mykey-priv.pem -in /tmp/hash -out /tmp/signature openssl rsautl -verify -pubin -inkey mykey-pub.pem -in /tmp/signature
最后一行让我无法加载公钥
我错过了什么?
如果是相关的,我正在使用CentOS 3.9(旧的和旧的,但我没有select在这里)。
最后,这里是一个样本密钥对:
-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu 7KqeRzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVm i4r/Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1Flbpo LixTGCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjq W6W6jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF +ZI53CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQABAoIBAQCn7zd64gZLqmJ3 zThVG+obGyX4U3lhTVHQaD0ysR4ZcJPHxDA6ip7gsmprxr3/puupWD7b86a3jp8c v4/MIEZxUk3qlDKFAAHIijy/kvuW+sSl65uwUZETFf5DvQq1hYzttxuzFwIx5kzc HQBsi3MbtQGJ1a5Z5WofSMu4wEa289tAjHQiaXs8WEbgOctwS11lhFbDLwLagBFz FL+J0C0oGjgNYaLJUihZKsMHCPZ0/LVFDcCus0ep7mQmvAEQ3FhSNNVakUL07XmM MC6PTUxUvQa8vGDlRnXwGlIWVFNevvudvZjs02J7KWc3hUH9DqXiEm7cClJfoISB HIq4WFvpAoGBAP0UHfCRyv4/2nZmizX05NG/qMNuz97G6Rir2ltw9wmrpvqK/n4r d1JX19ECCx2nQM04C4Q7jQMmyqpF21Wf903PrGXPBa8j5XIDJy+YPC2RrifGsaHm wN1EmYVfYZCphwmTIO2D05n/4Zkgze/KmhMnqpWn27De+LLfgcxsbET7AoGBAPVB 4RvpQCfKdP+ieKRopDE0v+UkdQCogdUz0rhwAdwzhXmUZIJ/Xb4a15DIN+zxKz2h aiIJFkifKw5bQQQQjiIuRN73YpjQ6D9jWTdEs3E1zaWYFNPNAYqSi/1g/udgLL0N RAOw5aNCDyOV4OZRESa9rhUUngfK4VrbqWIm1pLFAoGBAOBGWZn9uaTDNXjDuw6f 7b+rV4WJyBEmuR8x/JoYa/RX9+wEDTAGmQGR8yG3693lgFndFueiVn66e9OVgKBK 2MBOD/tRETp6VzVIcguNn5bKiUmanYRamAP+bQZy1mV6tr7XcdDKiFTrHCO1nIqq QwxClLt3PAtsLX1m8QIV+4TNAoGBAMA161hWi2Mj9mHKUUZ4hAXUU3ggBFqJtYcD 4GeP0MVk03yfYc4sR6mPm9XqNHpL4BmjAWy/Nmmf5LyRo/itiNcc7/jWZL1jLEFR eUApZYCaLBtVfy0nA8g4ZeIkPGHVK/rWBLHn13EFepvnAKVAb3KvQVlgGSH+THNK qAs2aQAJAoGAabSXLpXsZTdy1lMUtZlvUhH4tLVgHFJGILMQ3bh2TTMnkaVbPFyy KDeK+QJGaqjTx1SIXYgANR5cYI1xNge6aVA6T2aY2Dlq3qpAOK3sJWhEZYDxJKeq Oy97h96/n14jdfh1U4TValcZfgVXqAfBMjxx0fPtSQjIn2RVjZRBpFs= -----END RSA PRIVATE KEY----- -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEA8nVhTRuinf4bGAda1ufF+VGG6f8kIFGt8/oCK74n9E6lXgpu7Kqe RzadaiONDh8GgQXn5bX9O2vOL+sL0xYa3W13eCoT7+4U51C/+8HqBxujRAVmi4r/ Ju+52kober+GSuIfoNF2nMA24EDy9tid0JgHcBJ0NTyhv6sPvNfcFR1FlbpoLixT GCcn5S9A9NzJXiOkZ6abnxmyEmZsEaboowMay027GLWAw186GODbrGBByhjqW6W6 jcijb7EFdIYCEqtC6RsZmAiuPBK0LfW5078GE05oIZrG8GtQR8f7k8HDpEDF+ZI5 3CZiLhrcXq6+tS4U57FqQs8ytUf6Gno7JwIDAQAB -----END RSA PUBLIC KEY-----
除此之外: ssh-keygen -m
只是在相当新的OpenSSH版本中,比我预期在CentOS 3.9上更为新近。 你有没有使用一些存储库或自己构build它? 无论如何…
OpenSSH所说的“PEM”不是PEM OpenSSL在这里使用的那种types。
背景:OpenSSL 库长期支持PEM和DER两种公钥结构:
每个支持的algorithm特有的“传统”结构,带有PEM头文件
-----BEGIN RSA PUBLIC KEY-----
-----BEGIN DSA PUBLIC KEY-----
-----BEGIN EC PUBLIC KEY-----
由例程PEM_{write,read}{RSA,DSA,EC}PublicKey
由X.509定义的一个通用结构,名为SubjectPublicKeyInfo
和PEM头
-----BEGIN PUBLIC KEY-----
! 注意没有algorithm名称
由例程PEM_{write,read}{,RSA,DSA,EC}PUBKEY
但是,OpenSSL 命令行几乎全部使用后者,包括rsautl -pubin
。 你可以看到你有前者。 为什么?
OpenSSH ,当它最近添加-m
格式选项到ssh-keygen -e
导出时,莫名其妙地命名为OpenSSL传统结构PEM
但OpenSSL X.509通用结构PKCS8
– 尽pipe它不是所有的PKCS#8,这是一个标准和通用格式的私人密钥。
所以你的select是:
使用错误的,但实际上正确的格式选项ssh-keygen -e -m pkcs8
使用唯一的处理旧版结构的操作来转换文件:
openssl rsa -in sshpub_called_pem -RSAPublicKey_in -out goodpub -pubout
但只有在OpenSSL 1.0.0及以上。
因为你的OpenSSH私钥文件是OpenSSL兼容的格式( -----BEGIN RSA PRIVATE KEY-----
不-----BEGIN OPENSSH PRIVATE KEY-----
这也是OpenSSH的一个新增内容)你可以使用OpenSSL 而不是 ssh-keygen -e
:
openssl rsa -in sshprivate -pubout -out pubforopenssl
或在1.0.0及以上,shiny的新selectopenssl pkey -in sshprivate -pubout -out pubforopenssl
还 rsautl -sign|-verify
: rsautl -sign|-verify
(默认情况下)使用PKCS#1-v1.5(又名types01)填充,但不符合标准要求您也编码散列在ASN.1 SEQUENCE
。 以这种方式创build的签名将不会在其他遵从该标准的软件中进行validation,而在其他软件中创build的签名会给出不同(尽pipe部分匹配)的结果。 考虑使用
openssl {dgst -hashname | hashname} {-sign privatekey | -verify publickey}
完成操作:散列数据,ASN.1编码,填充和RSA符号,或者相反RSAvalidation,unpad,解码和匹配; 要么
openssl pkeyutl -sign|-verify -inkey key [-pubin] -pkeyopt digest:hashname
密钥是一个RSA密钥, 除了散列数据之外 ,它完成PKCS#1-v1.5的所有操作 。 例如:
https://stackoverflow.com/questions/9380856/openssl-signature-difference-when-using-c-routines-and-openssl-dgst-rsautl-
https://stackoverflow.com/questions/13419201/why-are-the-rsa-sha256-signatures-i-generate-with-openssl-and-java-different
https://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst
https://crypto.stackexchange.com/questions/27079/what-is-the-difference-between-openssl-pkeyutl-sign-and-openssl-rsautl-sign
https://crypto.stackexchange.com/questions/27892/verify-a-rsa-signature-using-only-rsa-encryption