我正在尝试生成私钥和公钥对。我想使用私钥对我的JWT进行签名,然后将公钥发送给第三方以对我的JWT进行解码。
在我的mac os终端上,我生成了这样的密钥:
ssh-keygen -m PEM -t rsa -b 2048
现在我将pkey和pkey.pub分别设置为私钥和公钥。现在,在我的rails控制台中,我尝试获取像这样的私钥,它可以正常工作:
rsa_private = OpenSSL :: PKey :: RSA.new(File.read(“ / path / to / private / key / pkey”))
rsa_private.to_s
“ -------开始使用RSA私有密钥--- \ nCONTENTS_OF_PKEY_FILE \ n -----结束RSA私有密钥----- \ n“
现在,我可以像这样从生成的私钥中获取公钥:
pub_key = rsa_private.public_key
但是当我尝试打印它的内容时,它与运行ssh-keygen命令时生成的pkey.pub中的内容有所不同。
pub_key看起来像这样:
“ -------公共公钥----- \ nSOME_CONTENT \ n ----- END公钥----- \ n”
但是我的pkey.pub文件看起来有所不同,如下所示:
ssh-rsa SOME_OTHER_CONTENT user@user.local
那么,我的问题是,如何为同一个私钥获取2个不同的公钥?我该使用哪一个来解码我的JWT?
答案 0 :(得分:0)
密钥应该相同,但编码方式不同。
一个RSA密钥对由几个数字组成,私有密钥是所有这些数据,公共密钥是相同的,但私有部分已删除。
数字可以以不同的顺序写入,以不同的格式编码。还可以使用密码对密钥进行加密以进行存储(不是这种情况)。因此,具有相同键的文件看起来可能完全不同。
PEM格式(具有BEGIN PUBLIC KEY
和Base64数据的格式)对于通用密钥更为常见,因此请更好地使用它。
更新: PEM格式是具有页眉和页脚的base64编码DER。 DER依次是ASN.1的二进制表示。但是SSH使用的是间接密钥编码格式(RFC4716)
示例:
% ssh-keygen -m PEM -t rsa -N '' -b 1024 -f ./rsa
% cat rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDRNFYxsULk6x90T0EE8iS3skfJJ407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlpLjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+HQU3IzyU1i0X9K828Q== vasfed@Vasiliys-MacBook-Pro.local
% ssh-keygen -e -m PEM -f ./rsa.pub
-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBANE0VjGxQuTrH3RPQQTyJLeyR8knjTt5/dYkkKWt7STawslQlfr9dtzc
5vE2OLFdyAhenYfihU6c2m6OoUX9czzXOWkuMZP/iKC0rUWMgchoXJGF4a7CmWDA
KReXEB7+gfUFvicVeUP+Q5GYaBJ9IT0Gkf4dBTcjPJTWLRf0rzbxAgMBAAE=
-----END RSA PUBLIC KEY-----
% ssh-keygen -e -m PKCS8 -f ./rsa.pub
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRNFYxsULk6x90T0EE8iS3skfJ
J407ef3WJJClre0k2sLJUJX6/Xbc3ObxNjixXcgIXp2H4oVOnNpujqFF/XM81zlp
LjGT/4igtK1FjIHIaFyRheGuwplgwCkXlxAe/oH1Bb4nFXlD/kORmGgSfSE9BpH+
HQU3IzyU1i0X9K828QIDAQAB
-----END PUBLIC KEY-----
同一个键的上面是3种不同的编码,以下是后两个的ASN解码版本(通过https://lapo.it/asn1js):
PEM,最小最小值(模数和指数,无元数据):
SEQUENCE (2 elem)
INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
INTEGER 65537
PKCS8,在这里我们看到的数字完全相同,但是这次有一些元数据:
SEQUENCE (2 elem)
SEQUENCE (2 elem)
OBJECT IDENTIFIER 1.2.840.113549.1.1.1 rsaEncryption (PKCS #1)
NULL
BIT STRING (1 elem)
SEQUENCE (2 elem)
INTEGER (1024 bit) 146908353891476107599563957703741990254320034409224509383359005248419…
INTEGER 65537