Linux
Debian 版本更改影響使用 curl 和 HTTPS 的腳本
最近我開始使用 Debian 9(9.4,來自 Debian 8.x)並且涉及 curl 的腳本停止工作。我通過連接到父代理的 localhost 上的 squid 代理連接到網際網路。
我的環境變數是這樣配置的
root@server:~# printenv | grep -i proxy HTTP_PROXY=http://127.0.0.1:3128 FTP_PROXY=http://127.0.0.1:3128 https_proxy=https://127.0.0.1:3128 http_proxy=http://127.0.0.1:3128 HTTPS_PROXY=https://127.0.0.1:3128 ftp_proxy=http://127.0.0.1:3128
當我使用 wget 時,它可以工作:
root@server:~# wget https://www.google.com.cu --2018-03-14 09:08:53-- https://www.google.com.cu/ Connecting to 127.0.0.1:3128... connected. Proxy request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html’ index.html [ <=> ] 11.12K --.-KB/s in 0.001s 2018-03-14 09:08:54 (14.9 MB/s) - ‘index.html’ saved [11389]
當我使用 curl 時,這就是我得到的
root@server:~# curl -v https://www.google.com.cu * Rebuilt URL to: https://www.google.com.cu/ * Trying 127.0.0.1... * TCP_NODELAY set * Connected to (nil) (127.0.0.1) port 3128 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * TLSv1.2 (OUT), TLS header, Certificate Status (22): * TLSv1.2 (OUT), TLS handshake, Client hello (1): * error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol * Curl_http_done: called premature == 0 * Closing connection 0 curl: (35) error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
我知道這兩個命令是不等價的,這只是為了說明HTTPS傳輸問題。
我需要使用 curl 因為腳本使用了 Web API,所以它需要使用 POST 而不是 GET 請求,並為 POST 請求設置一些標頭和數據。(api.dropboxapi.com 是目標站點)
這一切過去都可以在 Debian 8 上順利執行,除了 wget WORKS 之外,只有 curl 因 debian 版本更改而失敗。所有其他 HTTPS 客戶端似乎都沒有受到影響(FF、Chrome、Edge、wget 似乎都像往常一樣工作)
有誰知道這個問題?是否有任何解決方法、修復、命令行選項更改或任何使 debian 9 版本的 curl 工作的方法?
“curl -V”的輸出
root@server:~# curl -V curl 7.52.1 (x86_64-pc-linux-gnu) libcurl/7.52.1 OpenSSL/1.0.2l zlib/1.2.8 libidn2/0.16 libpsl/0.17.0 (+libidn2/0.16) libssh2/1.7.0 nghttp2/1.18.1 librtmp/2.3 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
非常感謝 Michael Hampton(見評論)。事實證明問題出在代理配置中。應該說
https_proxy=http://127.0.0.1:3128 HTTPS_PROXY=http://127.0.0.1:3128
所以 curl 試圖使用 TLS 連接到 squid,當然失敗了。