Como faço para obter uma solicitação HTTPS com o SSL Client Cert para trabalhar com o Ruby EventMachine?
-
27-09-2019 - |
Pergunta
Estou tentando acessar um serviço da Web HTTPS que usa a autenticação do SSL CERT usando o Ruby EventMachine, mas não estou fazendo com que funcione.
Eu escrevi o seguinte bloco de código simples para testá-lo de ponta a ponta:
require 'rubygems'
require 'em-http'
EventMachine.run do
url = 'https://foobar.com/'
ssl_opts = {:private_key_file => '/tmp/private.key',
:cert_chain_file => '/tmp/ca.pem',
:verify_peer => false}
http = EventMachine::HttpRequest.new(url).get :ssl => ssl_opts
http.callback do
p http.response_header.status
p http.response_header
p http.response
EventMachine.stop
end
http.errback do
EventMachine.stop
fail "Request failed"
end
end
Executando as saídas acima <SSL_incomp>
seguido pela mensagem RUNDTIME RUNDIME. Eu tentei correr com :verify_peer
Defina como verdadeiro e falso e me dá o mesmo erro. Corrida EventMachine::HttpRequest#get
sem o :ssl
a opção faz o mesmo.
Eu também tentei enviar o pedido ao Gmail (https://mail.google.com) sem o :ssl
Opção (ou seja, https simples sem cert) e que funciona, saída de código de status 200, cabeçalhos e corpo.
Eu tentei fazer o mesmo pedido para o serviço da web com o CURL e isso funciona:
curl --silent --cert /tmp/private.key --cacert /tmp/ca.pem https://foobar.com/
Estou pensando que estou usando a geme em-http-request ou o EventMachine incorretamente ou que os arquivos SSL estão em um formato que funciona com o CURL, mas não o EventMachine.
Alguém sabe como resolver o exemplo acima ou fornecer um exemplo semelhante usando o EventMachine diretamente seria muito apreciado!
Solução
O arquivo passou para o Curl's --cert
contém o certificado e a chave (a menos que você passe em um --key
separadamente). Apenas use /tmp/private.key
Como argumento para ambos :private_key_file
e :cert_chain_file
Ver http://github.com/eventmachine/eventmachine/issues/#issue/115 Para obter mais detalhes sobre o problema e um patch que expõe o erro subjacente (em vez de apenas imprimir ssl_incomp).