微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于 OpenSSL 的 Ruby 代码生成 PKCS#1/PEM 格式 RSA 私钥的 SHA256 指纹

如何解决用于 OpenSSL 的 Ruby 代码生成 PKCS#1/PEM 格式 RSA 私钥的 SHA256 指纹

例如,给定以下使用 OpenSSL::PKey::RSA.new(2048) 生成的 PKCS#1/PEM 格式的 RSA 私钥:

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEArL7/qAft6XBmEP9JkadhsPYydS7V+wsOLQPpJbtRmvs7rDUG
5hagEjhMKolSksAL8Gh4ZR84iFnATv81xLzoKBbWtHfMmgOohrXJy3Xw1kRrJemh
ZLmoJDbFVyDiCXXIDpfLDxm/9jBFn+hUuESFXMIBpbjhFJ0t12HFqXwFmKVfkNbq
JhwKuq3AEylN8dWn3oQNz4rq2ZCZiqjNBo0X4hny0GlBGvPHADS9Fe8DX/yN8Ggj
IM7MvQeVi3uiZ0u1qhiK7wcaPoTEjXJH4NhbmzZjGRQ/2VznbeXCYdzWzfAHDWjS
ADT6895geYYHTAJi1v7qtBRP2sihpdBhIpihgwIDAQABAoIBADOWxtrzo0V338Nr
uhjZl/81R1RfrF/QqWcgJ9yw2GokZWnEXE8SqrNGRNjfMd3JpMcjK/FnJYby5s+w
v+oFUH/Ick5rCJtmREoWuDEfA9G5lRY5c42VNHW8NasTku2oUxqokmfsFLv9Jo3e
4I43SGyvM7a+Q9nYJvyPomw/MZyoKKUJr7Poa1lYAqfigIWCbU2C0c9sHhsVNQJZ
+t69y9DiNTX7VDRhj8UQ07H0qs8nG06bFjt411Z/jdsKvh59ucLGARHYS0t4OGcr
CkIRUYI1xPF2UPCnCB7EJoeUbJPxtGt9Qb1yrV8U6K2WtezO/Suld7u2u/lX/aey
urkUwAECgYEA47oeArcPVttOJjFRL+YX6g7ixfRblh5SaPxVB19gqN404KrWqPWD
JpdageERr/TprtSXw75B5YZzdE1HjS811RN0gwS7d47uYu41XB/glH0E1u23w5CN
ldVoUKRG5JrK/ebXzUaXTPSelPjDXuucGoNN5X2K7vwbf31qzwKGGAECgYEAwjFp
/w+4vURb1Zzsp2/lDI2Md2Kq49YKIWOYZkPPUtUK0Xoqm0oKZF1Vl04T8ANnSIKk
n1aiNnxwmaYaOMfB2UHVbDbE2F5yLYUIelzVaMqzanxPN5oq0NBCW8UUxE+GPan4
syz5rEzBz/hENR9oFnvxbxewJsR5UjD43wmiWYMCgYEAu/xj0bH0A6s9s+F6N6Ql
kZ2ALhEtmZqmROwn9NITJNNpqxzb3tXs0eqXWCfHRg1S6nOsZHWmSCbZH+S7cBzM
v3wz7gP2DRf8ScaCXe4iofEiEZpi3Bl0B4AHgKpbq1LsxvPMqTPgqjI0xp0kCjNM
xcYmg49DJUedAvUxOnnG4AECgYEAiPXs+jWOZ/6kfn5U8qqac0YKAdGXEWXOc0oZ
HFdLC/Kx1JhDII8R0UN6sgii8a6U07FAhhjGA4O0rslVySIp+B7UdaQTJT9HbA9d
sV90LJp5++p8vIyBEhEwHCVdxi8IUMlmXIil9v2T3CgPgyAJe4Ii/+VHGbCMmIlt
nXDgDh0CgYEAlmko3ujnfoVwV3f92JgetIZx5IMe5rylJ5FjxyQ3dD3UEaEQgxoz
81j23ZSFVe4Mg8PzyxFgLgEZN7TVj/sjELqpRlRhZUu91io9FjGuU6XZNgfjRAhH
RbgFj9mnr8TV9kETuxXpoGaMD/7MVvetg8Qr1nxpi7m29Ao5L5R5h7g=
-----END RSA PRIVATE KEY-----

我可以使用 openssl 生成它的 SHA256 指纹:

$ openssl rsa -in rsa_private_test.pem -pubout -outform DER | openssl sha256 -binary | openssl base64
writing RSA key
8T0BsSCXlbxqFGekWsIuGhj6/ca/6VpLjDqzT4X3TBQ=

我如何在 Ruby 中做同样的事情?我的假设是这两种方法,即通过 Ruby 中的 OpenSSLopenssl 应该产生相同的结果。

解决方法

您可以通过 OpenSSL::Digest 实现:

require 'openssl'

pem = OpenSSL::PKey::RSA.new(2048)

fingerprint = OpenSSL::Digest::SHA256.new(pem.to_der).to_s
# => "9a7c94fd90bf88d0b52aa48739b552bc6afc39e4a7d6949aa0ad1c110852906d"
,

所以,from this other post@Topacocomment here 我发现我做错了什么。

部分问题在于 .hexdigest 始终返回文本,而 openssl 的第二部分中的输出返回需要采用二进制形式的输出。您应该获得公钥的 DER,因为 openssl 命令的第一部分返回公钥。

你可以看到它现在正在工作......

pry(main)> sha256 = OpenSSL::Digest::SHA256.new
=> #<OpenSSL::Digest::SHA256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855>
pry(main)> digest = sha256.digest(rsa_public.to_der)
=> "\xF1=\x01\xB1 \x97\x95\xBCj\x14g\xA4Z\xC2.\x1A\x18\xFA\xFD\xC6\xBF\xE9ZK\x8C:\xB3O\x85\xF7L\x14"
pry(main)> Base64.encode64(digest) 
=> "8T0BsSCXlbxqFGekWsIuGhj6/ca/6VpLjDqzT4X3TBQ=\n"

与我之前得到的相反......

pry(main)> digest = OpenSSL::Digest::SHA256.hexdigest(rsa_public.to_der).to_s
=> "f13d01b1209795bc6a1467a45ac22e1a18fafdc6bfe95a4b8c3ab34f85f74c14"
pry(main)> Base64.encode64(digest)
=> "ZjEzZDAxYjEyMDk3OTViYzZhMTQ2N2E0NWFjMjJlMWExOGZhZmRjNmJmZTk1\nYTRiOGMzYWIzNGY4NWY3NGMxNA==\n"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。