标题the ciphers ain't supported in jruby-openssl
基本上就是这个意思,我遇到了生产问题。我需要其中之一:
ECDHE-RSA-AES256-GCM-SHA384 TLS1.2
ECDHE-RSA-AES256-SHA384 TLS1.2
ECDHE-RSA-AES256-CBC-SHA TLS1.2
ECDHE-ECDSA-AES256-SHA384 TLS1.2
ECDHE-ECDSA-AES256-SHA TLS1.2
ECDH-RSA-AES256-SHA384 TLS1.2
ECDH-ECDSA-AES256-SHA384 TLS1.2
ECDH-RSA-AES256-SHA TLS1.2
ECDH-ECDSA-AES256-SHA TLS1.2
所有这些中的-MRI Ruby AES256-SHA256(根据OpenSSL命名法)支持1,但是MRI Ruby不是一个选择。
我一直在玩的基本脚本是:
uri = URI.parse(ds_url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.ssl_version = :"TLSv1_2"
http.verify_mode = OpenSSL::SSL::VERIFY_NONE # OpenSSL::SSL::VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE
http.cert = client_cert
http.key = client_key
http.ca_file = ds_cert_file
http.ciphers = OpenSSL::SSL::SSLContext.new.ciphers.map do |c|
c[0].gsub("-", "+")
end
puts http.ciphers.inspect
resp = http.post(uri.request_uri, http_body, 'Content-Type' => 'application/xml; charset=utf-8')
resp.body
但是它只会导致“套接字关闭”错误,只玩了amazing one-liner的变体,我设法找出了问题-缺乏兼容的密码。
由于the Manticore HTTP client for JRuby似乎对BouncyCastle
使用了不同的加密适配器,因此我也尝试过使用该适配器,但是这个刚刚开始将我拖入有趣的Java错误的虫洞中,例如
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : algid parse error, not a sequence
manticore实现的代码相似:
client = Manticore::Client.new(socket_timeout: 5, ssl: {
ca_file: "ca.pem",
client_cert: 'cert.pem',
client_key: 'key.pem'
}) do |http_client_builder, request_builder|
binding.pry
end
rv = client.post(ds_url)
rv.body
并导致上述错误,然后出现以下错误:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
,到那时,我暂时放弃了这种方法。 Manticore does open up some apis to let you play with org.apache.http.impl.client.HttpClientBuilder
,但是Java-fu很快使我的眼睛变得水汪汪。
在这一点上,我甚至很想跟随“从JRuby调用Java”的困境,了解Java HTTP库的生态系统以及所有这些,但这并不是我的专长,我束缚时间。
有一个乐于助人且知识渊博的人可以提供帮助吗?我正在寻找其中之一:
答案 0 :(得分:0)
最后,经过大量研究和苦恼,我们编写了一个Java库,该库发送HTTP请求并公开此特定用例的相关参数。用Java为JRuby编写Java通常是两全其美,但是在这种情况下-要求是如此简单-却很轻松。
下面是Ruby端的外观:
java_import "com.mycompany.http.HttpClient"
java_import "com.mycompany.http.SSLOptions"
#
# ...
#
ssl_options = SSLOptions.createFromStrings client_cert, client_key, ca_cert
rv = HttpClient.create(url, ssl_options, 60000, "changeit", "changeit").send(request)
if rv.responseSuccess
# log.merge(response: rv.responseSuccess.payload)
rv.responseSuccess.payload
else
raise rv.responseFailure.cause
end