在开发和测试环境中,我们为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应用程序中绕过这个错误。在命令行,我们可以成功地调用一个忽略所有相同代码的cert验证的调用,并且我们已经比较了所使用的所有Perl模块的版本(例如,在这两种情况下,LWP为6.15 )。
在线讨论指出了不同的场景(取决于所使用的SSL后端),因此我们尝试安装LWP::Protocol::https,至少有不同的行为。只是在模块安装之后,我们就开始失败了:
Error executing run mode 'myRunMode': 404 Not Found404看起来像是一条红鲱鱼,但是遗憾的是,删除了LWP::Protocal::https使我们回到了“证书验证失败”错误,因此我们似乎在做一些事情。
对于如何在这个CGI::应用程序环境中跳过证书验证,有人有什么想法吗?
发布于 2017-04-03 14:09:14
这是个老生常谈,但我还是想分享我的解决方案。只需在执行边界调用之前添加以下内容:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;没必要改变边境密码之类的..。
发布于 2016-05-17 02:45:12
--更新5/17/16 330 16
如果您可以编辑Frontier::Client (或者只是复制-粘贴它并给它一个不同的包/文件名),您可以将LWP::UserAgent的用法替换为WWW::Curl::Easy,这是我对SSL的选择(我有使用带有bug的库的LWP的旧版本)。以下是卷曲代码:
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(等)返回的相同对象;
https://stackoverflow.com/questions/37264884
复制相似问题