【问题标题】:Ruby code for openssl to generate fingerprintopenssl 用于生成指纹的 Ruby 代码
【发布时间】:2013-05-13 07:09:35
【问题描述】:

我需要以下红宝石等价物:

openssl x509 -sha1 -fingerprint -noout -in cert.pem

我写的代码是:

data = File.read("cert.pem")
data["-----BEGIN CERTIFICATE-----\n"]=""
data["-----END CERTIFICATE-----\n"]=""
OpenSSL::Digest::SHA1.new(Base64.encode64(data))

此代码生成的指纹与 openssl cli 命令生成的指纹不同。

知道我做错了什么吗?

【问题讨论】:

    标签: ruby openssl base64 sha1 fingerprint


    【解决方案1】:

    正如 gtrig 所提到的,OpenSSL 命令行通过散列证书的 DER 编码而不是 Base64 PEM 表示来构建指纹。您可以使用纯 OpenSSL 解析它:

    file_data = File.read("cert.pem")
    cert = OpenSSL::X509::Certificate.new(file_data)
    puts OpenSSL::Digest::SHA1.new(cert.to_der).to_s
    

    无耻插件:r509 也可以这样:

    cert = R509::Cert.load_from_file("cert.pem")
    puts cert.fingerprint('sha1')
    

    如果您需要它以冒号分隔的形式,您可以只取散列并执行"fingerprint".scan(/../).map{ |s| s.upcase }.join(":")之类的操作

    【讨论】:

    • FWIW,PKCS12 证书对象(来自 pfx 文件)必须为校验和提取其证书成员,因此最后一行将是:OpenSSL::Digest::SHA1.new(cert.证书.to_der).to_s
    • 我知道这个帖子是老帖子了,希望有人回复。对于 SHA256 证书,我是否需要将摘要计算为 SHA256? puts OpenSSL::Digest::SHA256.new(cert.to_der).to_s
    • @SickLickWill 否,这里的 SHA1 表示用于生成指纹本身的算法,与证书中使用的哈希算法无关。
    【解决方案2】:

    试试 Base64.decode64。

    OpenSSL::Digest::SHA1.new(Base64.decode64(data))
    

    PEM 格式的证书是二进制 DER 格式的 Base 64 编码版本,因此需要在获取 SHA1 哈希之前对其进行解码。

    或者,您可以使用 OpenSSL 将 PEM 文件转换为 DER 格式,如下所示:

    openssl x509 -in cert.pem -out cert.der -outform der
    

    那么您的 Ruby 代码将如下所示:

     data2 = File.read("cert.der")
     print OpenSSL::Digest::SHA1.new(data2)
    

    任何一种方式都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2015-04-03
      • 2018-06-27
      • 1970-01-01
      • 2012-11-15
      相关资源
      最近更新 更多