我試圖從一個網頁上獲得一些東西,使用類似這樣的東西
。#!/usr/bin/perl
使用 LWP::Simple。
use LWP::Protocol::https;
$url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=YP_009724389.1&rettype=ft& retmode=text'。
$res = getprint($url)。
print $res。
這段代碼在我的本地機器(MacOS)上運行得非常好,但我不能讓它在服務器上作業。Python wget在服務器上對這個URL起作用,而Perl在其他URL上起作用。我是Perl的新手,這里有服務器和本地版本的模塊。
服務器。 perl (v5.22.1) libwww-perl已經是最新的版本(6.15-1)
本地。 perl (v5.30.2) LWP::Simple (不確定,但它剛剛被安裝,所以是最新的)
編輯:perl (v5.30.2)
編輯。 錯誤資訊是這樣的。 500 Can't connect to eutils.ncbi.nlm.nih.gov:443 at test.pl
編輯2。 HTTPS協議是在ubuntu服務器上的 liblwp-protocol-https-perl已經是最新的版本(6.06-2)
。編輯3。 冗長的錯誤資訊看起來像這樣
DEBUG: .../IO/Socket/SSL. pm:2733: free ctx 38676848 open=38676848.
DEBUG: .../IO/Socket/SSL.pm:2738: free ctx 38676848 callback
DEBUG: .../IO/Socket/SSL.pm:2745: OK free ctx 38676848。
DEBUG: .../IO/Socket/SSL.pm:2700: new ctx 39560272?
DEBUG: .../IO/Socket/SSL.pm:612。socket not yet connected
DEBUG: .../IO/Socket/SSL.pm:614: socket已連接。
DEBUG: .../IO/Socket/SSL.pm:636: ssl handshake not started
DEBUG: .../IO/Socket/SSL.pm:669: using SNI with hostname eutils.ncbi.nlm.nih.gov
DEBUG: .../IO/Socket/SSL.pm:704: request OCSP stapling.
DEBUG: .../IO/Socket/SSL.pm:723: 設定socket為非阻塞狀態以執行timeout=180。
DEBUG: .../IO/Socket/SSL.pm:736: call Net::SSLeay::connect?
DEBUG: .../IO/Socket/SSL.pm:739: done Net::SSLeay::connect -> -1.
DEBUG: .../IO/Socket/SSL.pm:749: ssl handshake in progress
DEBUG: .../IO/Socket/SSL.pm:759: waiting for fd to become ready: SSL希望先進行讀取。
DEBUG: .../IO/Socket/SSL.pm:779: socket ready, retrying connect.
DEBUG: .../IO/Socket/SSL.pm:736: call Net::SSLeay::connect?
DEBUG: .../IO/Socket/SSL.pm:739: done Net::SSLeay::connect -> -1.
DEBUG: .../IO/Socket/SSL.pm:742: SSL connect attempt failed
DEBUG: .../IO/Socket/SSL.pm:742: local錯誤。SSL connect attempt failed error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
DEBUG: .../IO/Socket/SSL.pm:745: fatal SSL error: SSL connect attempt failed error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
DEBUG: ...erl5/Net/HTTPS. pm:69: 忽略不太嚴重的local錯誤'IO::Socket:: IP配置失敗',保持'SSL連接嘗試失敗 error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3警報握手失敗'。
DEBUG: .../IO/Socket/SSL.pm:2733: free ctx 39560272 open=39560272.
DEBUG: .../IO/Socket/SSL.pm:2738: free ctx 39560272 callback.
DEBUG: .../IO/Socket/SSL.pm:2745: OK free ctx 39560272。
我現在也嘗試使用LWP::UserAgent的等效代碼,并且不需要證書。
編輯4:
1...3。
ok 1 - 已加載
# openssl version compiled=0x1000205f linked=0x1000207f -- OpenSSL 1.0.2g 1 Mar 2016
# Net::SSLeay version=1.72
# parent IO::Socket::IP version=0.37
ok 2 - IO::Socket::SSL::DEBUG 1
ok 3 - Net::SSLeay::trace 1
來自curl的輸出,它成功了。
* Trying 130.14.29.110。
*連接到eutils.ncbi.nlm.nih.gov (130.14.29.110) 埠 443 (#0)
*在/etc/ssl/certs/ca-certificates.crt中發現129證書。
*在/etc/ssl/certs中發現516個證書。
* ALPN,提供http/1.1。
* SSL連接使用TLS1.2 / ECDHE_RSA_AES_256_GCM_SHA384
*服務器證書驗證 OK
*服務器證書狀態驗證SKIPPED
*通用名稱。*.ncbi.nlm.nih.gov (匹配)
*服務器證書的到期日期 OK
*服務器證書的激活日期 OK
*證書公鑰。RSA
*證書版本。#3
*主題。C=US,ST=Maryland,L=Bethesda,O=National Library of Medicine,CN=*.ncbi.nlm.nih.gov
*開始日期:星期二,207月2021 00:00:00 GMT
*過期日期: Wed, 10 Aug 2022 23:59: 59 GMT
*簽發人: C=US,O=DigiCert Inc,CN=DigiCert TLS RSA SHA256 2020 CA1
* 壓縮。NULL
* ALPN,服務器接受使用 http/1.1 。
> GET /entrez/eutils/efetch.fcgi?db=protein&id=YP_009724389.1&rettype=ft& retmode=text HTTP/1.1
> 主機:eutils.ncbi.nlm.nih.gov
> 用戶代理: curl/7.47.0。
> 接受。*/*
>
< HTTP/1.1 200 OK
< 日期。Fri, 17 Sep 2021 15: 27: 15 GMT
< 服務器。Finatra
< Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
< Content-Security-Policy: Upgrade-insecure-requests
< X-Test-測驗: test42
< Cache-Control: private
< NCBI-PHID: 322C09A5C8CE1A1500004CCDDDF835FE.1.1.m_5
< X-RateLimit-Remaining: 2.
< NCBI-SID: 1CC49D756062E8D4_7834SID
< X-RateLimit-Limit: 3 X-RateLimit-Limit.
< Access-Control-Allow-Origin: *
< Access-Control-Expose-Headers: X-RateLimit-Limit,X-RateLimit-Remaining
< Content-Type: text/plain
< Content-Disposition: attachment; filename="sequence.txt"1CC49D756062E8D4_7834SID; domain=.nih. gov; path=/; expires=Sat, 17 Sep 2022 15: 27: 15 GMT
< Vary: 接受編碼
< X-UA-Compatible: IE=Edge
< X-XSS-Protection: 1; mode=block
< Transfer-Encoding: chunked
uj5u.com熱心網友回復:
... OpenSSL 1.0.2g 1 Mar 2016
相當老。根據這些資訊,我認為Ubuntu 16.04或類似的系統。
服務器只支持少數密碼,而且這些密碼都不在這個舊版本中IO::Socket::SSL使用的默認密碼集中。為了解決這個問題,明確允許使用ssl_opts和SSL_cipher_list的更廣泛的密碼集:
#!/usr/bin/perl
use strict;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->ssl_opts(SSL_cipher_list => 'DEFAULT'/span>)。
my $url = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&id=YP_009724389.1&rettype=ft& retmode=text'。
my $res = $ua->get($url);
print $res-> decoded_content;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/328600.html
標籤:
