使用Ruby OpenSSL库时无效的公钥

我正在尝试在Ruby中生成RSA密钥对,主要使用此博客文章中的示例。 这是我稍加修改的代码:

def generate_keypair(passphrase) rsa_key = OpenSSL::PKey::RSA.new(2048) cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc') private_key = rsa_key.to_pem(cipher, passphrase) public_key = rsa_key.public_key.to_pem return private_key, public_key end 

这成功生成了私钥和公钥,我可以将它们写到文件系统上的文件中。

 irb(main):002:0> private_key1, public_key1 = generate_keypair('test') [...output of keys...] irb(main):003:0> File.open("key.pem","w") {|f| f.write(private_key1) } => 1766 irb(main):004:0> File.open("pubkey.pem","w") {|f| f.write(public_key1) } => 426 

但是,当我尝试使用此公钥时,OpenSSL会抱怨:

 $ openssl rsautl -encrypt -inkey pubkey.pem -pubin -in text.txt -out text.ssl unable to load Public Key 

如果我使用openssl工具从私钥中提取公钥,那么一切正常:

 $ openssl rsa -in key.pem -pubout -out pubkey2.pem Enter pass phrase for key.pem: writing RSA key $ openssl rsautl -encrypt -inkey pubkey2.pem -pubin -in text.txt -out text.ssl $ openssl rsautl -decrypt -inkey key.pem -in text.ssl Enter pass phrase for key.pem: this is a file that needs to be encrypted 

Ruby OpenSSL库生成的公钥与openssl cli工具从私钥中提取的公钥不同:

 $ cat pubkey.pem -----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYrDL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww 5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcSMDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7 DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az734qEribgyI+87LB8TujG8v5iOvdzT/Je4 JAllToZVGC3RddfTc6ww37gB39B++FYNzPg+nrIEU45KgEWPo2eJxBpX29lACh6q EEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4 MkDDFGwWv7eJLb4UZuZjafTbqokHved3bwIDAQAB -----END RSA PUBLIC KEY----- $ cat pubkey2.pem -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzgNcsEL7yGBoLBYBXFYr DL6oLP8ZbW9+VwdoXyNG6Qt/NEhEx4Ww5yOxtXAbqeUwyvbTUxRrJ02dQcb4FGcS MDgz2QHIZyCuDJkgC9Wj7KI1Q7g0GV+7DcZvLcwPZOhLXqUzlcZXjDWM1PZ+az73 4qEribgyI+87LB8TujG8v5iOvdzT/Je4JAllToZVGC3RddfTc6ww37gB39B++FYN zPg+nrIEU45KgEWPo2eJxBpX29lACh6qEEBCQr9xyLxOC2eomYIl3dG2dV7nGGH7 Pur2HjppgJphBvNkwxIWUa/pD6hAnOQ4MkDDFGwWv7eJLb4UZuZjafTbqokHved3 bwIDAQAB -----END PUBLIC KEY----- 

我不太确定这里发生了什么,但似乎Ruby OpenSSL库正在生成一个无效的公钥pem文件。 难道我做错了什么?

似乎OSSL不支持该格式。 “openssl rsa”生成的是一个RSA_PUBKEY结构:一个PUBKEY记录,它是ASN.1-“标记”(带有OID)以指示它是一个RSA密钥。 Ruby生成的是“原始”RSA密钥(其中字节不表示它是RSA;因此您必须在PEM头中声明它)。

OSSL应该使用API​​函数,如PEM_write_bio_RSA_PUBKEY(或通用PEM_write_bio_PUBKEY),而不是PEM_write_bio_RSAPublicKey。