我当然有一些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错误而被拒绝,我怀疑这是因为我的客户端密钥没有与请求正确交换。
任何人都可以帮我解决这个问题或建议可能会崩溃的地方。
答案 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
});