【问题标题】:Error: 500 Can't connect to example.com:443 (certificate verify failed)错误:500 无法连接到 example.com:443(证书验证失败)
【发布时间】:2013-10-24 05:01:12
【问题描述】:

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

   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 年,但是关于您问题的更新部分,请不要将 SSL_VERIFY_NONE 放在引号中。它是一个常数,而不是一个字符串。

标签: perl


【解决方案1】:

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

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

【讨论】:

  • 好的,我已经打印了回复。感谢您的帮助
  • 奇怪的是,我的脚本在一个客户端上运行。我将它移到另一个客户端并得到相同的错误(500 无法连接)。它指向同一台服务器,所以我不确定问题是什么。这解决了我的问题。
  • 刚刚弄清楚有什么区别。这是 CentOS 7 与 CentOS 6。他们必须在默认情况下使用 7 使事情变得更严格。
【解决方案2】:

试试这个

my $UA   = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0, } );

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      cpan install LWP::Protocol::https
      

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

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2020-09-07
      • 2018-05-18
      • 1970-01-01
      • 2019-04-17
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多