2013-05-13 47 views
1

我需要的紅寶石相當於如下: OpenSSL的X​​509 -sha1 -fingerprint -noout -in cert.pemOpenSSL的Ruby代碼來生成指紋

我寫的代碼:

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

此代碼不會生成與openssl cli命令相同的指紋。

任何想法我可能做錯了什麼?

回答

1

嘗試Base64.decode64。

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

證書PEM格式是基礎64個的二進制DER格式的編碼的版本,因此它們需要被取SHA1哈希之前被解碼。

或者,你可以轉換PEM文件使用OpenSSL爲DER格式是這樣的:

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

然後Ruby代碼應該是這樣的:

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

兩種方法都可行。

4

正如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(":")

+0

FWIW,一個PKCS12證書對象(來自pfx文件)必須將其證書成員提取出來用於校驗和,所以最後一行是:OpenSSL :: Digest :: SHA1.new(cert.certificate .to_der).to_s – KWillets 2016-06-13 20:37:57

+0

我知道這個主題是一個老的,希望有人會回覆。對於SHA256證書,我是否需要將摘要計算爲SHA256? '把OpenSSL :: Digest :: SHA256.new(cert.to_der).to_s' – SickLickWill 2017-02-16 18:01:10

+0

@SickLickWill否,這裏的SHA1表示用於生成指紋本身的算法,並且與證書中使用的哈希算法沒有關係。 – 2017-06-12 18:37:17