この記事 http://b.ytyng.com/a-61/ で書きましたが、OpenSSL 1.0.1f で https 接続した場合、TLS1.2 で 接続しようとして hello を発行した時、特定のサイトが応答で固まることがあります。
(OpenSSL 1.0.1f は、ubuntu 14.04, 15.04 などの最新のデフォルトバージョンです。1.0.1g を使っていれば解決されているかもしれません)
その場合、TLS1.2 を使わないように接続することで、回避することができます。
curl, Python, PHP で、TLS1.2 を使わない (TLS1.0を強制する) 方法です。
$ curl -vv "https://hoge.example.com/" # URLは仮 * Hostname was NOT found in DNS cache * Trying xxx.xxx.xxx.xxx... * Connected to hoge.example.com (xxx.xxx.xxx.xxx) port 443 (#0) * successfully set certificate verify locations: * CAfile: none CApath: /etc/ssl/certs * SSLv3, TLS handshake, Client hello (1): ここで固まる
↓
TLS1.2 を使わない (TLS1.0を強制)
$ curl -vv "https://hoge.example.com/" --tlsv1.0 固まらない!
# import requests r = requests.get('https://hoge.example.com/') 固まる!
↓ TLS1.2 を使わない (TLS1.0を強制)
import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.poolmanager import PoolManager import ssl class MyAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1) s = requests.Session() s.mount('https://', MyAdapter()) r = s.get("https://hoge.example.com/") 固まらない!
参考:
Choosing The SSL Version In Python Requests • Lukasa's Echochamber https://lukasa.co.uk/2013/01/Choosing_SSL_Version_In_Requests/
$html = file_get_contents('https://hoge.example.com/'); 固まる!
↓ TLS1.2 を使わない (TLS1.0を強制)
$ctx = stream_context_create([ 'ssl' => [ 'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT, ], ]); $html = file_get_contents('https://hoge.example.com/', false, $ctx); 固まらない!
参考:
PHP: PHP 5.6.x における OpenSSL 関連の変更 - Manual http://php.net/manual/ja/migration56.openssl.php
コメント