在开发和测试环境中,我们使用XMLRPC Web服务的自签名SSL证书。生产使用一个不错的第三方证书和证书验证工作很好,没有问题。
在调用应用程序的代码中,这是一个CGI :: Application Web应用程序,我们只在dev和测试环境中跳过SSL证书的验证,知道它会失败......或者试图跳过它。尽管将$ ENV {PERL_LWP_SSL_VERIFY_HOSTNAME}设置为0,但呼叫仍然失败,并且:
Error executing run mode 'myRunMode': 500 Can't connect to mydomain.com:443 (certificate verify failed)
其他一些(现在可能已被弃用?)env变量已经尝试过,我们似乎无法在Web应用程序中解决此错误。在命令行,我们可以成功调用,忽略了所有相同代码的证书验证,并且我们比较了所有Perl模块的版本(两种情况下LWP均为6.15)实例)。
在线讨论指向不同的场景,具体取决于正在使用的 SSL后端,因此我们尝试安装LWP :: Protocol :: https,至少得到了不同的行为。我们在安装模块之后开始失败:
Error executing run mode 'myRunMode': 404 Not Found
404似乎是一个红色的鲱鱼,但唉,删除LWP :: Protocal :: https让我们回到'证书验证失败'错误,所以看起来我们可能会有所作为。
有没有人对如何在此CGI :: Application环境中跳过证书验证有任何想法?
答案 0 :(得分:2)
这是一个老线程,但我还想分享我的解决方案。 只需在进行边界呼叫之前添加以下内容:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
无需更改任何前沿代码或内容......
答案 1 :(得分:1)
LWP::UserAgent::ssl_opts(verify_hostname => 0);
---更新5/17/16 330pm ---
如果你可以编辑Frontier :: Client(或者只是复制粘贴它并给它一个不同的包/文件名),你可以用WWW :: Curl :: Easy替换LWP :: UserAgent的使用,一直是我的SSL(我已经使用了旧版本的LWP,它使用了有bug的库)。这是卷曲代码:
my ($rBody,$rHead); # response written here
my $curl = WWW::Curl::Easy->new();
$curl->setopt(CURLOPT_URL, $url);
$curl->setopt(CURLOPT_HEADER, 0);
$curl->setopt(CURLOPT_POST, 1);
$curl->setopt(CURLOPT_POSTFIELDS, $myRequest);
$curl->setopt(CURLOPT_HTTPHEADER, \@myHeaders);
$curl->setopt(CURLOPT_WRITEDATA, \$rBody);
$curl->setopt(CURLOPT_WRITEHEADER, \$rHead);
$curl->setopt(CURLOPT_FOLLOWLOCATION, 1);
$curl->setopt(CURLOPT_SSL_VERIFYHOST, 0);
$curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
my $cc = $curl->perform();
您甚至可以使用HTTP :: Response->解析($ rHeadRegexed。$ rBody)来获取LWP :: UserAgent-> request(etc)返回的相同对象;