如何为Net :: HTTP使用自定义OpenSSL引擎

时间:2015-07-21 17:07:59

标签: ruby security openssl net-http hsm

我正在尝试使用自定义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)

我尝试搜索如何为Net :: HTTP插入自定义OpenSSL引擎,但找不到任何东西。我们如何使用自定义引擎作为客户端证书身份验证的一部分使用私钥进行签名?

1 个答案:

答案 0 :(得分: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)