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命令相同的指纹.
知道我可能做错了吗?
正如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(":")
尝试 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)
无论哪种方式都有效。