8

私は以下のようなコードを持っています:

headers = {'content-type': 'ContentType.APPLICATION_XML'}
uri = "www.client.url.com/hit-here/"
clientCert = "path/to/cert/abc.crt"
clientKey = "path/to/key/abc.key"
PROTOCOL = ssl.PROTOCOL_TLSv1
context = ssl.SSLContext(PROTOCOL)
context.load_default_certs()
context.load_cert_chain(clientCert, clientKey)
conn = httplib.HTTPSConnection(uri, some_port, context=context)

私は実際にはネットワークプログラマーではないので、ハンドシェイク接続についてグーグルで調べたところssl.SSLContext(PROTOCOL)、必要な機能としてコードが正常に機能することがわかりました。

私のローカルにはバージョン 2.7.10 がありますが、すべての製品ボックスには 2.7.3 が含まれているため、SSLContextサポートされておらず、python バージョンのアップグレードはオプションではありません。

ssl — ソケット オブジェクトの SSL ラッパーを読んでみましたが、意味がわかりませんでした。

私が試したこと(無駄に):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED)
new_conn = s.connect((uri, some_port))

しかし、戻ります:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)')

質問- 安全な https 接続を確立するために、古いバージョンで SSL コンテキストを生成する方法を教えてください。

4

2 に答える 2

0

requests ライブラリを使用して完璧なソリューションを手に入れました。requests ライブラリは、私がこれまでに使用したライブラリの中で最も気に入っているライブラリです。これは、Python では本質的に実行が困難な処理 (SSL および REST 要求) を必要とし、信じられないほど単純にするためです。バージョンのサポートを確認したところ、Python 2.6+ がサポートされています。

これは、ライブラリの使用方法の例です。

>>> requests.get(uri)

そして、それはあなたがしなければならないすべてです。requests ライブラリは、ssl 接続の確立を処理します。


これをさらに一歩進めます。リクエスト間で Cookie を保持する必要がある場合は、次のようにできます。

>>> sess = requests.Session()
>>> credentials = {"username": "user", 
                   "password": "pass"}
>>> sess.post("https://some-website/login", params=credentials)
<Response [200]>
>>> sess.get("https://some-website/a-backend-page").text
<html> the backend page... </html>

編集:必要に応じて、証明書へのパスとキーを次のように渡すこともできますrequests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


願わくば、プロダクション ボックスに requests ライブラリをインストールするように彼らを説得できることを願っています。これがうまくいくかどうか教えてください。

于 2016-03-29T06:12:40.217 に答える