我有以下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 中工作的方法
仔细检查您的私钥。正如错误消息中详细说明的那样,它是 EC 而不是 RSA。
编辑一行即可解决您的问题:
client_key = OpenSSL::PKey::EC.new(File.read('/root/client/client.key'), keypass)