下記プログラムについて、過去5年位問題なく普通に動いていたのですがここ2ヶ月ほど動かなくなる事があり不安定でした。そこで、Perlモジュールなど様々なものをアップデートしていると完全にここでスクリプトが止まり動かなくなりました。SSL関連で失敗しているようなのですがどのようにすれば解決しますでしょうか?
環境
Windows 10 64bit
ActivePerl 5.22
perl
1 use WWW::Mechanize; 2 my $ua = WWW::Mechanize->new( autocheck => 1 ); 3# $ua->ssl_opts( verify_hostname => 0 ); 4 $ua->get("https://yahoo.jp/"); 5 my $source = $ua->content; 6 open(F,">test.html"); 7 print F $source; 8 close F; 9 print $source; 10```Error GETing https://yahoo.jp/: Can't connect to yahoo.jp:443 at D:\Programming\test.pl line 4. 11と表示されプログラムが途中でストップします。 12 13ちなみに、他のhttpsを使うスクリプトでは下記のようなエラーメッセージも表示されていました。 14Error GETing https://github.com/: SSL upgrade failed: SSL connect attempt failed error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed at testx.pl line 262. 15 16なお、以下であれば期待通りの動作をします。 17```perl 18 use WWW::Mechanize; 19 my $ua = WWW::Mechanize->new( autocheck => 1 ); 20 $ua->ssl_opts( verify_hostname => 0 ); 21 $ua->get("http://yahoo.jp/"); 22 my $source = $ua->content; 23 open(F,">test.html"); 24 print F $source; 25 close F; 26 print $source; 27```もしくは 28```perl 29 use WWW::Mechanize; 30 my $ua = WWW::Mechanize->new( autocheck => 1 ); 31# $ua->ssl_opts( verify_hostname => 0 ); 32 $ua->get("http://yahoo.jp/"); #httpでアクセスする 33 my $source = $ua->content; 34 open(F,">test.html"); 35 print F $source; 36 close F; 37 print $source;
Perl本体やモジュールがおかしいのか気になり、コードを以下に書き換え、strawberry-perl(Portable)と上記のActivePerlで試して見ました。それぞれ以下のエラーが表示されました。
なお、opensslは
Win64OpenSSL_Light-1_0_0e.exe
Win64OpenSSL-1_1_1g.exe
Win64OpenSSL_Light-1_1_1g.msi
をそれぞれ試してみましたが無理でした。
strawberry-perl(Portable)
Can't connect to yahoo.jp:443 (Bad file descriptor)
Bad file descriptor at C:/PortableApp/strawberry-perl-5.32.0.1-64bit-PDL/perl/vendor/lib/LWP/Protocol/http.pm line 50.
ActivePerl
Can't connect to yahoo.jp:443
Bad file descriptor at C:/Perl/site/lib/LWP/Protocol/http.pm line 46.
perl
1use strict; 2#use Mozilla::CA; 3use LWP::UserAgent; 4my $ua = LWP::UserAgent->new; 5#$ua->ssl_opts( verify_hostname => 0 ); 6# $ua->ssl_opts( SSL_ca_file => Mozilla::CA::SSL_ca_file() ); 7my $url; 8$url = "http://yahoo.jp/"; 9$url = "https://yahoo.jp/"; 10my $res = $ua->get($url); 11my $source = $res->content; 12open(F,">test.html"); 13print F $source; 14close F; 15print $source;