web-dev-qa-db-ja.com

TLSでリクエストを使用しても、SNIサポートは提供されません。

Djangoアプリと通信するためにリクエストを使用していますが、

しようとすると

requests.get('https://mysite.com', verify=True)

エラーが表示されます:

ホスト名「mysite.com」は「* .myhost.com」、「myhost.com」のいずれとも一致しません

ただし、ブラウザ、または http://www.digicert.com/help/ を見ると、証明書は正常に見えます。

私のホストは、リクエストからのSNIサポートがないことを示唆しました(そしてGithubは https://github.com/kennethreitz/requests/issues/749 を確認しているようです)。誰かがリクエストを使用して回避策を見つけましたか?

61
Massagran

Requestsの現在のバージョンは、SNIでは問題ないはずです。 GitHubの問題をさらに下に 要件を確認できます。

それらのパッケージをインストールしてから、もう一度試してください。

[〜#〜] edit [〜#〜]:リクエストv2.12.1の時点で、ndg-httpsclientおよびpyasn1は不要になりました。必要なパッケージの完全なリストは次のとおりです。

  • pyOpenSSL
  • イドナ
125
Lukasa

受け入れられた答えを機能させるために、他のパッケージを次の順序でインストールする必要がありました。

  • libffi-develのインストール
  • yum install gcc
  • yum install openssl-devel
  • pip install urllib3
  • pip install pyopenssl
  • pip install ndg-httpsclient
  • pip install pyasn1
22
Shane N

このようなリクエストモジュールをインストールします。これにより、セキュリティパッケージエクストラがインストールされます。

pip install requests[security]

11
Nandeesh

または、Python 2.7.9以降:

「Python 3.4のsslモジュールは、Python 2.7.9。正当化についてはPEP 466を参照してください。

https://www.python.org/downloads/release/python-279/

6
stantonk

現在の(githubからの)リクエストでは、@ Lukasaの回答は正しいです。彼が言及したpip依存関係とは別に、システムにOpenSSLを追加することを忘れないでください。

デプロイメント上の理由で、pipの1.2.3のような安定したリクエストバージョンを好む場合は、次のようにSNIで動作するようにパッチを適用できます。

import requests


def fileno(self):
    return self.socket.fileno()


def close(self):
    return self.connection.shutdown()


requests.pyopenssl.WrappedSocket.close = close
requests.pyopenssl.WrappedSocket.fileno = fileno
4
AntonioMO

IPアドレスを使用してhttpsサイトにアクセスする から回答をコピーする

MAC High SierraでPython 3.6.4、私は解決策を試しました: requests toolbelt:HostHeaderSSLAdapter 1つ目、残念なことに、それは私にとってはうまくいきませんでした。 forcediphttpsadapter 、最終的に動作するようになりました。

著者は、readmeパートのすべてを説明し、サンプルスクリプトを提供しており、簡単にフォローできます。

1. pip install requests[security] forcediphttpsadapterでライブラリをインストールします

2.サンプルスクリプトを実行します。

import requests
from forcediphttpsadapter.adapters import ForcedIPHTTPSAdapter
session = requests.Session()
session.mount("https://example.com", ForcedIPHTTPSAdapter(dest_ip='1.2.3.4'))
response = session.get(
    '/some/path', headers={'Host': 'example.com'}, verify=False)

注:場合によっては、URLからプレフィックス「www」を削除する必要があります。

1
Xb74Dkjb