如何将LWP与客户端证书和CA一起使用

时间:2015-07-16 23:59:53

标签: perl ssl curl lwp lwp-useragent

我当然有一些perl代码,这些代码退出shell以调用curl与证书的终点进行通信。这工作正常,但我总是觉得我在perl作弊,当我逃到贝壳并采取简单的选择。下面是我正在使用的curl命令,这个工作正常。

$ soap_response = echo '$soap_request' | curl --cacert $self->{'server_cert'} --cert $self->{'client_cert'} -d '\@-' -H 'SOAPAction:urn:anonOutInOp' $self->{'end_point'} -s | xmllint -format -;

我有一个CA文件和一个客户端文件,都是PEM格式。

我曾尝试使用LWP和Net :: SSL完全在perl中进行此通信并摆脱对curl的依赖,但我无法让我的生活得到它的工作。

我为Net:SSL设置了环境

#set up the ssl envrioment for Net::SSL
$ENV{HTTPS_DEBUG} = 1;
$ENV{HTTPS_CERT_FILE} = $client_cert;
$ENV{HTTPS_CA_FILE}   = $server_cert;
$ENV{HTTPS_CA_DIR}    = $certificate_dir;

然后将我的请求发送为

my $ua = new LWP::UserAgent();
my $request = HTTP::Request->new(POST => $endpoint);
$request->header(SOAPAction => '"query"');
$request->content($query);
$request->content_type("text/xml; charset=utf-8");

my $response = $ua->request($request);
print $response->content,"\n";

运行时得到的输出是

SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL_connect:SSLv3 read finished A
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><soapenv:Fault><faultcode xmlns:ns1="http://xml.apache.org/axis/">ns1:HTTP</faultcode><faultstring>(403)Forbidden</faultstring><detail><ns2:hostname xmlns:ns2="http://xml.apache.org/axis/">hh0pgw01</ns2:hostname><ns3:HttpErrorCode xmlns:ns3="http://xml.apache.org/axis/">403</ns3:HttpErrorCode></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>

所以它似乎交换了CA文件并且对主机感到满意,但是我的请求因403 forbiden错误而被拒绝,我怀疑这是因为我的客户端密钥没有与请求正确交换。

任何人都可以帮我解决这个问题或建议可能会崩溃的地方。

1 个答案:

答案 0 :(得分:1)

  

所以它似乎交换了CA文件并且对主机感到满意,但是我的请求因403 forbiden错误而被拒绝,我怀疑这是因为我的客户端密钥没有与请求正确交换。

看起来客户端发送了证书,服务器接受了它。因为否则SSL握手会失败,在这种情况下,服务器将无法发送403甚至某些XML。因此,可能是服务器端应用程序没有将必要的权限与您发送的证书相关联,即这是错误的证书或服务器配置错误。

也可能是您的请求有误。在查看curl和LWP请求时,它会查找我,就像您发送与SOAP相关的不同标头。

除此之外,您似乎使用的是旧版本的LWP或明确强制使用已弃用且不安全的Net :: SSL / Crypt :: SSL后端。当前版本的LWP(版本&gt; = 6.0,即过去4年内的所有内容)不使用Net :: SSL / Crypt :: SSLeay,而是使用IO::Socket::SSL作为后端。要配置它,请使用ssl_opts,然后使用IO :: Socket :: SSL中记录的相关SSL选项:

 LWP::UserAgent->new(..., ssl_opts => {
      SSL_ca_path   => ... # directory with CA, if file use SSL_ca_file
      SSL_cert_file => ... # the client site certificate
      SSL_cert_key  => ... # the key for the client site certificate
 });