この記事 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