向 REST API 发送 http 请求时在 client.crt 和 client.key 中指定

问题描述 投票:0回答:1

我有以下curl命令,它连接到需要客户端证书进行身份验证的远程服务器API:

curl -s -k --cert /root/client/client.crt --key /root/client/client.key https://{SERVER_IP_HERE}:{PORT}/1.0 | jq .metadata.auth

这个curl命令工作得很好

我还尝试使用 python 使用名为 requests 的库

import requests

cert = ("/root/client/client.crt", "/root/client/client.key")
server = "https://{SERVER_IP_HERE}:{PORT}"

r = requests.get(server, verify=False, cert=cert)
print("result returned: " + r.text)

效果也很好

但是,当我尝试使用 ruby 做同样的事情时,例如使用rest-client:

require 'openssl'

require 'rest-client'
keypass = ''
client_key = OpenSSL::PKey::RSA.new(File.read('/root/client/client.key'), keypass)
client_cert = OpenSSL::X509::Certificate.new(File.read('/root/client/client.crt'))

response = RestClient::Request.execute(
  method: :get,
  url: "{SERVER_IP_HERE}:{PORT}",
  ssl_client_cert: client_cert,
  ssl_client_key: client_key,
  verify_ssl: OpenSSL::SSL::VERIFY_NONE
)

我收到错误

usr/lib/ruby/3.0.0/openssl/pkey.rb:348:in `initialize': incorrect pkey type: id-ecPublicKey (OpenSSL::PKey::RSAError)

我无法让它与 httprb gem 一起工作,等等。我可以使用哪个 http gem 并不重要,我只是想要一种让它在 ruby 中工作的方法

ruby openssl
1个回答
0
投票

仔细检查您的私钥。正如错误消息中详细说明的那样,它是 EC 而不是 RSA。

编辑一行即可解决您的问题:

client_key = OpenSSL::PKey::EC.new(File.read('/root/client/client.key'), keypass)
© www.soinside.com 2019 - 2024. All rights reserved.