用于生成指纹的openssl的Ruby代码

Muk*_*kta 2 ruby base64 openssl sha1 fingerprint

我需要以下的红宝石:

openssl x509 -sha1 -fingerprint -noout -in cert.pem
Run Code Online (Sandbox Code Playgroud)

我写的代码是:

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

此代码不会生成与openssl cli命令相同的指纹.

知道我可能做错了吗?

Pau*_*rer 6

正如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
Run Code Online (Sandbox Code Playgroud)

无耻插头:r509也可以这样做:

cert = R509::Cert.load_from_file("cert.pem")
puts cert.fingerprint('sha1')
Run Code Online (Sandbox Code Playgroud)

如果你需要它以冒号分隔的形式,你可以采取哈希并做类似的事情 "fingerprint".scan(/../).map{ |s| s.upcase }.join(":")


gtr*_*rig 1

尝试 Base64.decode64。

OpenSSL::Digest::SHA1.new(Base64.decode64(data))
Run Code Online (Sandbox Code Playgroud)

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

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

openssl x509 -in cert.pem -out cert.der -outform der
Run Code Online (Sandbox Code Playgroud)

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

 data2 = File.read("cert.der")
 print OpenSSL::Digest::SHA1.new(data2)
Run Code Online (Sandbox Code Playgroud)

无论哪种方式都有效。