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



我正在尝试使用自定义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引擎,但找不到任何东西。如何使用自定义引擎将私钥作为客户端证书身份验证的一部分进行签名?

我找到了解决这个问题的方法。由于Net::HTTP在客户端证书认证期间使用OpenSSL进行加密。我没有传递密钥,而是使用自定义引擎的密钥句柄,并将在客户端证书身份验证期间对其执行的操作(签名)转发给HSM。下面是示例代码:

<>之前http = Net:: http .new(uri。主机,uri.port)http。Use_ssl = uri。方案== 'https'http。cert = OpenSSL::X509::Certificate.new(File.read("/tmp/cert.pem"))OpenSSL: Engine.loadhttp。key = OpenSSL::Engine.by_id("EngineId").load_private_key("CKA_LABEL=rsa-private-client-cert-auth-test-9ik98jui98")http。ssl_version =:TLSv1_2http。Open_timeout = Open_timeouthttp。Read_timeout = Read_timeout请求= Net::HTTP::Post.new(uri)请求。Body = " Body转到这里"Response = http.request(请求)

最新更新