[英]How to get Frontier::Client / LWP to STOP verifying the SSL certificate in a CGI::Application web app?
在开发和测试环境中,我们将自签名SSL证书用于XMLRPC Web服务。 生产使用了不错的第三方证书,并且证书验证工作得很好,没有问题。
在调用应用程序(即CGI :: Application Web应用程序)的代码中,我们仅知道在开发环境和测试环境中将失败并且应该失败,否则将跳过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环境中如何跳过证书验证有任何想法?
这是一个旧线程,但是我仍然想分享我的解决方案。 在进行边界调用之前只需添加以下内容:
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
无需更改任何前沿代码或东西...
LWP :: UserAgent :: ssl_opts(verify_hostname => 0);
---更新5/17/16 330pm-
如果您可以编辑Frontier :: Client(或者只是将其粘贴并赋予其不同的包/文件名),则可以将LWP :: UserAgent的使用替换为WWW :: Curl :: Easy,这就是我SSL的入门指南(我有LWP的旧版本,该版本使用带有错误的库)。 这是curl代码:
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-> parse($ rHeadRegexed。$ rBody)来获取LWP :: UserAgent-> request(etc)返回的相同对象;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.