2015-07-21 64 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)