8

我得到那个错误。这是我的代码。

   use LWP::UserAgent;
    use HTTP::Request::Common qw(POST);
    use HTTP::Cookies;

$URL="https://example.com/my.plicy";
$UA = LWP::UserAgent->new();
$UA->ssl_opts( verify_hostnames => 0 ); 
#UA->ssl_opts( SSL_ca_file => Mozilla::CA::SSL_ca_file() );

$req =HTTP::Request::Common::POST("$URL",
   Content_type=>'form-data',
   Content =>[
         'username'=>'111',
         'password'=>'2222',
         'vhost'=>'standard'
   ]
);
$req->header('Cookie' =>q(TIN=287000; LastMRH_Session=439960f5; MRHSession=78c9c47291c1fcedae166121439960f5));


$resp=$UA->request($req);

if( ($resp->code() >= 200) && ($resp->code() <400) ) {
  print $resp->decoded_content;

}else{
  print "Error: ". $resp->status_line. "\n";
}
   

问题是我没有真正的证书可提供,因为该站点处于开发阶段,并且使用了本地主机的证书......浏览器无法识别它。

有没有办法绕过验证?并避免错误?

更新:

我稍微改变了我的代码。添加了另一个库并添加了此功能:

use CACertOrg::CA;

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

$UA->ssl_opts(
    verify_hostnames => 0,
    SSL_ca_file      => CACertOrg::CA::SSL_ca_file()
);

现在我明白了:


不推荐对客户端使用 SSL_VERIFY_NONE 的 SSL_verify_mode 的默认值!请将 SSL_verify_mode 设置为 SSL_VERIFY_PEER 以及 SSL_ca_file|SSL_ca_path 以进行验证。如果您真的不想验证证书并保持连接对中间人攻击开放,请在您的应用程序中将 SSL_verify_mode 显式设置为 SSL_VERIFY_NONE。


在 C:/Perl/lib/LWP/Protocol/http.pm 第 31 行。

所以我将选项更改为:

    $UA->ssl_opts(
     SSL_verify_mode   => 'SSL_VERIFY_NONE',
    verify_hostnames => 0,
    SSL_ca_file      => CACertOrg::CA::SSL_ca_file()
);

我什么都没有打印出来……不过,我没有收到错误。这是一个好兆头吗?

4

4 回答 4

19

您需要在use ..部分之后添加此行:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
于 2013-10-16T07:51:25.453 回答
2

尝试这个

my $UA   = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0, } );
于 2014-04-25T13:23:34.600 回答
1

在这里挖掘尸体,但我处于相同的位置,这是您需要包含的内容才能修复它;)

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
$ENV{PERL_LWP_SSL_CA_FILE} = "/path/to/your/cert.pem";

当您使用自签名证书时,仅将 verify_hostnames 设置为 0 是不够的。

于 2020-04-19T22:49:08.453 回答
0

这些解决方案都不适合我(上次更新后两年半......但它仍然是顶级搜索结果,所以我想我会添加对我有用的解决方案) - 我需要一个额外的包来安装我的服务器。它是我通过 cpan 安装的 LWP::Protocol::https 包。为了安装它,我在我的服务器 shell 上输入了命令行:

cpan install LWP::Protocol::https

安装软件包后,代码可以像以前一样工作,无需对代码进行任何更改。

于 2021-12-03T10:29:10.797 回答