【问题标题】:Ruby code for OpenSSL to generate SHA256 fingerprint of PKCS#1/PEM format RSA private key用于 OpenSSL 的 Ruby 代码生成 PKCS#1/PEM 格式 RSA 私钥的 SHA256 指纹
【发布时间】:2021-11-23 12:07:42
【问题描述】:

例如,给定下面使用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 应该产生相同的结果。

【问题讨论】:

  • 有效载荷的 sha256 是我的猜测。你可能会觉得这很有趣stackoverflow.com/questions/22030264/…
  • 在第一部分,OpenSSL 语句从发布的私钥(PKCS#1 格式,PEM 编码)中导出公钥(X.509/SPKI 格式,DER 编码)。由此(即来自公钥,而不是私钥)在第二步中生成 SHA256 哈希,最后在第三步中进行 Base64 编码。
  • @Topaco 谢谢。这实际上帮助我意识到了问题的一部分。发布了对我有用的最终解决方案。

标签: ruby openssl rsa sha256 pem


【解决方案1】:

你可以通过OpenSSL::Digest实现它:

require 'openssl'

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

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

【讨论】:

  • 实际上尝试过,当我将共享的私钥加载到 OpenSSL::PKey::RSA.new 时,我得到的值与使用 openssl 时得到的值不同,这是我所期望的。
【解决方案2】:

所以,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"

【讨论】:

    【解决方案3】:

    抱歉,我无权直接评论您的回答。

    我遇到了同样的问题,我也尝试了您的答案,但无法得到预期的答案。我可以知道您是如何获得rsa_public 的吗?谢谢。

    这是我的红宝石代码:

    pkey = OpenSSL::PKey::RSA.new(File.read('rsa_private_test.pem'))
    
    sha256 = OpenSSL::Digest::SHA256.new
    
    digest = sha256.digest(pkey.public_key.to_der)
    
    puts Base64.encode64(digest) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 2012-05-21
      • 2023-02-07
      • 2011-11-28
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多