Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何让Frontier::Client/LWP停止验证CGI::Application web应用程序中的SSL证书?_Perl_Ssl_Https_Lwp - Fatal编程技术网

Perl 如何让Frontier::Client/LWP停止验证CGI::Application web应用程序中的SSL证书?

Perl 如何让Frontier::Client/LWP停止验证CGI::Application web应用程序中的SSL证书?,perl,ssl,https,lwp,Perl,Ssl,Https,Lwp,在开发和测试环境中,我们对XMLRPC web服务使用自签名SSL证书。生产使用了一个很好的第三方证书,证书验证工作很好,没有问题 在调用应用程序(CGI::ApplicationWeb应用程序)的代码中,我们只跳过开发和测试环境中SSL证书的验证,因为我们知道它会失败,也应该失败。。。或者试着跳过它。尽管将$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME}设置为0,调用仍然失败,原因是: Error executing run mode 'myRunMode': 500 Ca

在开发和测试环境中,我们对XMLRPC web服务使用自签名SSL证书。生产使用了一个很好的第三方证书,证书验证工作很好,没有问题

在调用应用程序(CGI::ApplicationWeb应用程序)的代码中,我们只跳过开发和测试环境中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::应用程序环境中跳过证书验证吗?

——2016年5月17日下午3300时更新---

如果您可以编辑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->parse($rheadregex.$rBody)来获取LWP::UserAgent->request(etc)返回的相同对象

——2016年5月17日下午3300时更新---

如果您可以编辑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->parse($rheadregex.$rBody)来获取LWP::UserAgent->request(etc)返回的相同对象

这是一个旧线程,但我仍然想与大家分享我的解决方案。 在进行边境通话之前,只需添加以下内容:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

无需更改任何边界代码或内容…

这是一个旧线程,但我仍想与大家分享我的解决方案。 在进行边境通话之前,只需添加以下内容:

$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;

无需更改任何前沿代码或其他内容。

LWP 6.15是一个已解除绑定的版本,因此即使开始使用https,也需要安装该版本。将我的
L::P::https
模块移开,我得到一个“如果安装了LWP::Protocol::https模块,LWP将支持https URL。”错误。有一件事可能有助于调试,那就是
perl-MCarp::Always
始终为您提供堆栈跟踪。还有类似于排序键%INC的
printf(“%s=>%s(MD5%s)\n“,$,$,$INC{$},qx#md5sum$INC{$}#=~/^(\s+/)错误位置附近的某个位置,以向您提供实际使用的模块列表。最新版本说“libwww perl core不再捆绑用于SSL的协议插件。您需要单独安装LWP::protocol::https以支持处理https URL。”是,这就是我的观点:
LWP::Protocol::https
以前随LWP一起提供,但在您的版本中已经没有了。因此,如果有人在没有安装此模块的情况下检查证书,就会发生奇怪的事情。因此,我建议转储
%INC
。LWP 6.15是一个已经解除绑定的
LWP::Protocol::https
版本,因此即使开始使用https,也需要安装它。将我的
L::P::https
模块移开,我得到一个“如果安装了LWP::Protocol::https模块,LWP将支持https URL。”错误。有一件事可能有助于调试,那就是
perl-MCarp::Always
始终为您提供堆栈跟踪。还有类似于排序键%INC的
printf(“%s=>%s(MD5%s)\n“,$,$,$INC{$},qx#md5sum$INC{$}#=~/^(\s+/)错误位置附近的某个位置,以向您提供实际使用的模块列表。最新版本说“libwww perl core不再捆绑用于SSL的协议插件。您需要单独安装LWP::protocol::https以支持处理https URL。”是,这就是我的观点:
LWP::Protocol::https
以前随LWP一起提供,但在您的版本中已经没有了。因此,如果有人在没有安装此模块的情况下检查证书,就会发生奇怪的事情。因此,我建议转储
%INC
。因为Frontier::Client在内部使用LWP::UserAgent,并且没有在自己的API中公开其所有选项,所以我必须进入Frontier::Client本身并进行设置。我尝试了
new(ssl\u opts=>{verify\u hostname=>0})
ua->ssl\u opts(verify\u hostname=>0)
,但都没有成功。一些邪恶的事情正在发生。由于Frontier::Client在内部使用LWP::UserAgent,并且没有在其自己的API中公开其所有选项,因此我必须进入Frontier::Client本身并进行设置。我尝试了
new(ssl\u opts=>{verify\u hostname=>0})
ua->ssl\u opts(verify\u hostname=>0)
,但都没有成功。一些邪恶的事情正在发生。