2015-07-21 30 views
0

我正嘗試使用自定義OpenSSL引擎進行客戶端證書身份驗證所需的加密操作。如何爲Net :: HTTP使用自定義OpenSSL引擎

目前Net :: HTTP允許我們僅傳遞將用於客戶端身份驗證的證書和密鑰。我們將所有私鑰移動到HSM(「硬件安全模塊」),以取代默認的OpenSSL引擎,我們希望插入一個定製的OpenSSL引擎。自定義OpenSSL引擎將使用HSM執行私鑰簽名操作。

當前使用默認的引擎,我們有一些代碼是這樣的:

http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = uri.scheme == 'https' 
http.cert = OpenSSL::X509::Certificate.new(File.read("/tmp/cert.pem")) 
http.key = OpenSSL::PKey::RSA.new(File.read('/tmp/key_pointer.pem')) 
http.ssl_version = :TLSv1_2 
http.open_timeout = open_timeout 
http.read_timeout = read_timeout 
request = Net::HTTP::Post.new(uri) 
request.body = "body goes here" 
response = http.request(request) 

我試圖尋找如何插件的淨:: HTTP定製OpenSSL的引擎,但找不到任何東西。我們如何使用自定義引擎來使用私鑰進行簽名,作爲客戶端證書身份驗證的一部分?

+0

如果我錯了,請更正我的錯誤,但是您不需要某種SSL證書嗎? –

+0

其實看起來像我在這裏錯誤地使用SSL。我的意思是客戶證書認證。 –

+0

您需要一些SSL證書進行驗證,例如客戶端 - >通信 - >服務器通過SSL(HTTPS)。 –

回答

0

我爲此得到了解決辦法。由於Net :: HTTP在客戶端證書認證期間使用OpenSSL進行加密。我沒有通過密鑰,而是通過定製引擎使用密鑰句柄,並且在客戶端證書認證期間執行的操作(簽名)被中繼到HSM。以下是示例代碼的樣子:

 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = uri.scheme == 'https' 
http.cert = OpenSSL::X509::Certificate.new(File.read("/tmp/cert.pem")) 
OpenSSL::Engine.load 
http.key = OpenSSL::Engine.by_id("EngineId").load_private_key("CKA_LABEL=rsa-private-client-cert-auth-test-9ik98jui98") 
http.ssl_version = :TLSv1_2 
http.open_timeout = open_timeout 
http.read_timeout = read_timeout 
request = Net::HTTP::Post.new(uri) 
request.body = "body goes here" 
response = http.request(request)