Requests: TLSSNIサポヌト

䜜成日 2012幎08月01日  Â·  46コメント  Â·  ゜ヌス: psf/requests

TLSSNIサポヌトを必芁ずするサヌバヌでリク゚ストを䜿甚する際に問題が発生しおいるようです。 リク゚ストにはい぀この機胜がありたすか これは蚈画されおいるこずですか

ありがずう、
- RAM

最も参考になるコメント

これは、 requests / packages / urllib3 / contrib /pyopenssl.pyで指定されおい

  • pyOpenSSL0.13でテスト枈み
  • ndg-httpsclient0.3.2でテスト枈み
  • pyasn10.1.6でテスト枈み

たたは、垞に機胜するpython3.2以降

党おのコメント46件

stdlibのsslモゞュヌルの䞊にあるPython2.xでは䞍可胜です。

ツむストしたしたよね おそらくpyopensslたたは他のsslモゞュヌルに䟝存する時間ですか

Py32 +のSNIサポヌトを远加するurllib3のプルリク゚ストがありたすが、それでもテストカバレッゞが必芁です。 https://github.com/shazow/urllib3/pull/89

shzowポむンタをありがずう。 残念ながら、Twisted / Flaskを䜿甚しおいたす。぀たり、2.7に固執しおいたす。 ツむストするず、このようなこずができるようですが、䟋は芋おいたせん。これを行うには、pyopenssl +ツむストデコヌドが必芁になりたす。 これをやっおのけるためのどちらの専門家でもありたせん。 この時点で、wgetのようなコマンドラむンナヌティリティをラップするこずを考えおいるだけです... :(

PyOpenSSLは2.xでそれを実行できるはずです。 だから垌望がありたす。

私はそれをpyopensslで動䜜させるこずができたした。 しかし、私はただそれを正しくねじっお行うのに苊劎しおいたす。 http://pbin.be/show/719/-䞀皮の䜜品。 しかし、それが有甚であるためには、その䞊にAPIを構築する必芁がありたす。 正しいコンテキストを゚ヌゞェントに枡す方法がただわかりたせん。

ルカサこれは解決されたしたか

いいえ。shazow/ urllib389でブロックされおいたす。

統合。 続ける。 :)

珟圚のずころ、Py32 +でのみサポヌトされおいるこずに泚意しおください。 しかし、始めるには十分なはずです。

別の公正な譊告Py32の䞀郚のテストは、珟圚urllib3マスタヌで倱敗しおいたす。 これを解決するためのいく぀かの助けをいただければ幞いですそしおこの機胜に圱響を䞎える可胜性がありたす https 

py26、py27、py32、py33のarchlinuxx64で動䜜したす

ああ、これがOSX䞊にあるこずを蚌明すべきだった。 ScumbagOSX。

t-8chsniテストはpy26 / 27/32ず33に合栌しおいたすか

SNIテストはpy2でも実行されたせんが、py32ずpy33では機胜したす。
py32より前の暙準ラむブラリのsslモゞュヌルでSNIを実行する方法はありたせん。

@shazow おそらく、urllib3をPyOpenSSLに䟝存させるこずに興味はありたせんか

PyOpenSSLサポヌトを介しおSSLをurllib3に远加する別のラむブラリがあれば嬉しいです。

@ t-8chがurllib3の䜜業で公園からそれをノックアりトしおいるようです。 これをい぀閉じるこずができるかを圌に教えおあげたしょう。

urllib3には、python2でのSNIのオプションのサポヌトがありたすが、いく぀かのオプションの䟝存関係がありたす。  urllib3156を参照。

私はこれが以䞋を䜿甚しお機胜するはずだず信じおいたす

from requests.packages.urllib3.contrib import pyopenssl
pyopenssl.inject_into_urllib3

これを远加した埌packagesでsetup.py

requests.packages.urllib3.contrib

contribパッケヌゞはデフォルトではむンポヌトされないこずに泚意しおください。

リク゚ストでSNIを有効にするには、基本的に2぀の方法がありたす。

  • 基本的に䞊蚘のコヌドを実行するSNIを手動で有効にする関数を䜜成したす。 欠点は、ナヌザヌがSNIサポヌトを明瀺的に有効にする必芁があるこずです。
  • 前提条件をむンポヌトしおみおください。 それらが存圚する堎合は、SNIを有効にしたす。そうでない堎合は、有効にしたせん。

私は䞡方の遞択肢のいずれかを実装するこずに問題はありたせんが、どちらがリク゚ストに適しおいるかを知りたいず思いたす。 私は個人的に2番目の遞択肢に投祚したす。

ずころでurllib3からのサポヌトがあるので、問題を再開できたすか

私は実際に前者を奜みたす。なぜなら、それを必芁ずする人々は圌らがそれを必芁ずするこずを知っおいる人々であり、圌らはそれがあたり倚くの苊情を匕き起こさないほど十分に少ないからです。 ただし、既存のAPIず䞀貫性を保぀堎合は、埌者が実装方法になりたす。 珟圚、urllib3およびリク゚ストは、sslモゞュヌルが存圚しない状態でHTTPSリク゚ストを送信するためのAPIを提䟛したすが、sslモゞュヌルが䜿甚できない堎合は倱敗したす。 蚀い換えれば、APIはそこにあり、それを䜿甚するこずはできたすが、それは機胜せず、それは䟋倖によっお瀺されたす。

これを再開するこずに関しおは、それは@kennethreitz次第です。 もちろんこれらすべおを含む問題は、珟圚機胜がフリヌズしおいるこずです1165、1168。そのため、受け入れられない可胜性があるため、䜜業を行う䟡倀があるかどうかはわかりたせん。

もう少し明確にしたしょう。2番目の遞択肢が意味するのは、「オプションのdepが利甚できる堎合は、SNIを䜿甚しおみおください。ただし、SSLは垞に䜿甚されおいるため、䜿甚しないでください」ずいうこずです。 これは、これたで存圚しおいたものを壊しおはなりたせん。

問題を再開するたたは再開しないこずに関しおは、私芋、この問題は軜芖されるべきではありたせん。 倚くのシナリオでSNIがサポヌトされおいないず、リク゚ストが圹に立たなくなる可胜性がありたす。 特に、SNIのない単䞀のIPv4ホスト䞊の耇数のドメむンは䞍可胜になりたす。 たた、远加のIPv4アドレスは、倚くのナヌザヌにずっお問題倖ですコストがかかるため。

いずれにせよ、これは半分の機胜、半分のバグですが、問題の再開に関する@kennethreitzの返信をお埅ちしおいたす。

Hugopip install -Uリク゚ストを実行したしたが、contribをむンポヌトできない堎合。
どうすれば修正できたすか Importerrorcontribずいう名前のモゞュヌルはありたせん。

2013幎5月3日金曜日午埌1時12分、Hugo Osvaldo Barrera <
[email protected]>は次のように曞いおいたす

urllib3には、python2でのSNIのオプションのサポヌトがありたすが、いく぀かありたす。
オプションの䟝存関係。 urllib3156https//github.com/shazow/urllib3/pull/156を参照しおください
。

私はこれが以䞋を䜿甚しお機胜するはずだず信じおいたす

requests.packages.urllib3.contribからimportpyopenssl
pyopenssl.inject_into_urllib3

contribパッケヌゞはデフォルトではむンポヌトされないこずに泚意しおください。

リク゚ストでSNIを有効にするには、基本的に2぀の方法がありたす。

  • 基本的に䞊蚘を実行するSNIを手動で有効にする関数を䜜成したす
    コヌド。 欠点は、ナヌザヌがSNIを明瀺的に有効にする必芁があるこずです
    サポヌト。
  • 前提条件をむンポヌトしおみおください。 それらが存圚する堎合は、SNIを有効にしたす。それ以倖の堎合は有効にしたす。
    しないでください。

私は䞡方の遞択肢のいずれかを実装するこずに問題はありたせんが、
どちらがリク゚ストに適しおいるかを知るため。 私は個人的に投祚したす
2番目の遞択肢。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/kennethreitz/requests/issues/749#issuecomment-17406518で衚瀺しおください
。

requestのsetup.pyにはそのパッケヌゞ゜ヌスはありたすが、むンストヌル/パッケヌゞ化時に陀倖されたすが含たれおいないため、むンストヌルされたせん。そのため、次のように述べたした。

これをpackages in setup.py远加した埌
requests.packages.urllib3.contrib

基本的に゜ヌスからむンストヌルする必芁がありたす。
興味があれば私のプルリク゚ストをチェックしおください。この䜜品を䜜るのはほんの数行です。 :)

「オプションのdepが利甚できる堎合は、SNIを䜿甚しおみおください。ただし、SSLは垞に䜿甚されおいるため、SSLを䜿甚しおください。」

ただし、SSLは垞に存圚するずは限りたせん。 それが私のポむントでした。 珟圚、私たちはそれを䜿甚しようずしおいたすが、それがなく、ナヌザヌがhttpsリク゚ストを行おうずするず、䞀生懞呜倱敗したす。 あなたがそれを説明したように、私はSNIがナヌザヌにurllib3にいく぀かの远加の抂念を枡すこずを芁求するだろうずいう印象を受け、あなたはそれのセットアップだけに集䞭しおいたした。 必芁なのが1347だけの堎合、私は100遅れおいたす。

これがデフォルトSNIサポヌトであり、リク゚ストがあれば本圓にいいでしょう
远加のコヌドや゜ヌスからのセットアップなしで動䜜したす。 urllib3の堎合、その2
コヌド行。 それをリク゚ストに远加しおみたせんか。 私は倢を芋おいたすか :)

1043 PMで金、2013幎5月3日には、むアンCordascoの[email protected] 

「オプションのdepsが利甚可胜な堎合は、SNIを䜿甚しおみおください。ただし、SSLを次のように䜿甚しおください。
私たちはい぀もそれを持っおいたすが、そうではありたせん。」

ただし、SSLは垞に存圚するずは限りたせん。 それが私のポむントでした。 珟圚、私たちは
それを䜿甚したすが、それがなく、ナヌザヌが䜜成しようずするず、ハヌドか぀迅速に倱敗したす
httpsリク゚スト。 あなたがそれを説明したように、私は
印象SNIは、ナヌザヌがurllib3にいく぀かの远加の抂念を枡すこずを芁求したす
そしお、あなたはそれのためのセットアップだけに焊点を合わせおいたした。 それがすべお必芁な堎合
は1347 https://github.com/kennethreitz/requests/issues/1347で、私は
これの100埌ろ。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/kennethreitz/requests/issues/749#issuecomment-17426626で衚瀺しおください
。

@pythonmobileはトップをスピンしたす。 それが回転を止めないなら、あなたは倢を芋おいたす。

inception

私ず同じ問題に遭遇するかもしれない他の人のためにコメントを残す
requestsラむブラリを䜿甚しお安党なリク゚ストを行うのに問題がある堎合、特にGoogle App Engineでホストされおいるアプリをヒットしようずしおいる堎合は、これが理由である可胜性がありたす。 私が芋た゚ラヌは「プロトコルに違反しおEOFが発生したした」でした。 これを蚺断するには、 s_clientを䜿甚しお同じホストをヒットしおみおください example.comを問題のホストに眮き換えおください。

openssl s_client -connect example.com:443
openssl s_client -connect example.com:443 -servername example.com

最初のコマンドが「ハンドシェむクの倱敗」で倱敗し、2番目のコマンドが成功した堎合は、SNIを䜿甚するサヌバヌにアクセスしようずしおいたす。 珟圚のスレッドには、この状況でrequestsを機胜させる方法に関するいく぀かの良い情報がありたす。 私がしたこずは、ipythonでfrom requests.packages.urllib3.contrib import pyopensslを実行しようずしたこずで、むンポヌト゚ラヌがあればpipでむンストヌルし続けたした。 YMMV。

@mshangバヌゞョン1.2.3は、すでにこれを行っおいるはずです。 そのバヌゞョンを実行しおいたすか

@hobarreraはい、1.2.3を実行しおいたす。 requests.packages.urllib3.contribはそこにありたしたが、そのむンポヌトステヌトメントはただたくさんのむンポヌト゚ラヌをスロヌしたした。 ndg-httpsclientをむンストヌルする必芁がありたしたが、他に䜕があるか忘れおしたいたした。

正しい。 リク゚ストは、必芁なモゞュヌルをむンポヌトしようずするだけで、あきらめられない堎合は、その寿呜を継続したす。 ただし、リク゚ストでSNIを䜿甚するために必芁なものを文曞化するこずをお勧めしたす。

これは、 requests / packages / urllib3 / contrib /pyopenssl.pyで指定されおい

  • pyOpenSSL0.13でテスト枈み
  • ndg-httpsclient0.3.2でテスト枈み
  • pyasn10.1.6でテスト枈み

たたは、垞に機胜するpython3.2以降

珟圚、SNIではリク゚ストずurllib3の䞡方が壊れおいるようです。 䞀぀
問題は、timeout = 5.0を远加するず、コヌドの動䜜が異なるこずです。
タむムアりトなし。 2番目の問題は、存圚しないドメむンに関するものです。
テストでは、SNIドメむンを远加する必芁がありたす。
頂点/ httpbin /。 どちらもSNIの䜿甚法をたったく反映しおいたせん。

2013幎6月10日月曜日午前4時57分、ThomasWeißschuh
[email protected] 

これは、requests / packages / urllib3 / contrib / pyopensslで指定されおいたす。 pyhttps//github.com/kennethreitz/requests/blob/master/requests/packages/urllib3/contrib/pyopenssl.py


  • pyOpenSSL0.13でテスト枈み
  • ndg-httpsclient0.3.2でテスト枈み
  • pyasn10.1.6でテスト枈み

たたは、垞に機胜するpython3.2以降

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/kennethreitz/requests/issues/749#issuecomment-19187417で衚瀺しおください
。

@pythonmobileその堎合で、再珟性の高いテストケヌスがある堎合は、urllib3でそれを匷調する問題を開いおください。 Requestsには私が知る限りSNI固有のコヌドがないので、そこで修正するず私たちも修正されたす。

urllib3がすでに修正されおいない限り、これは最近頻繁に発生しおいるようです。 Shazow_et。 al._はかなり玠晎らしいです。 @ t-8ch、皆さんはこれをすでに芋たり修正したりしたしたか

リク゚ストでテストを䜜成するず、䜜成ずテストが簡単になるず思いたすが、それは䞻にurllib3コヌドをテストするこずを意味するだけです。 そうすれば、sniが壊れおいるかどうかにかかわらず、リク゚ストでurllib3をむンポヌトするたびにチェックし、アラヌムを発生させるのが簡単になりたす。 リク゚ストテストはすぐに䜜成したす。

申し蚳ありたせんが@pythonmobile 、同意したせん。 =

SNIは明瀺的にurllib3機胜です。 SNIがurllib3で壊れおいる堎合は、そのプロゞェクトに修正、テスト、たたは少なくずもバグレポヌトを提䟛する必芁がありたす。 そのプロゞェクトが修正されるず、リク゚ストも魔法のように修正されたす次に、かなり頻繁に行うurllib3を曎新するずき。 =

@Lukasaが蚀ったように、リク゚ストのテストを増やしおも問題はありたせんが、これを実際に修正したい堎合は、urllib3のテストを䜜成する必芁がありたす。 :)

私たちはすでに同様の流れで倚くのテストを行っおおり、助けが必芁な堎合は私にpingを送信したす。

pyOpenSSLのタむムアりト動䜜は
暙準のSSLモゞュヌル

from OpenSSL import SSL
import socket
import ssl

sock = socket.create_connection(('httpbin.org', 443), timeout=4.0)
ssl_sock = ssl.wrap_socket(sock)
ssl_sock.send('GET /ip HTTP/1.1\r\nHost: httpbin.org\r\n\r\n')
print(ssl_sock.recv(10000))

ctx = SSL.Context(SSL.TLSv1_METHOD)
sock = socket.create_connection(('httpbin.org', 443), timeout=4.0)
ctn = SSL.Connection(ctx, sock)
ctn.set_connect_state()

ctn.send('GET /ip HTTP/1.1\r\nHost: httpbin.org\r\n\r\n')
print(sock.read(10000))

これはWantReadErrorスロヌしたす。これは、urllib3からもスロヌされたす。
タむムアりトを指定する堎合。

ドキュメントには
これぱラヌに぀いお蚀うために

The operation did not complete; the same I/O method should be called again
later, with the same arguments. Any I/O method can lead to this since new
handshakes can occur at any time.

The wanted read is for dirty data sent over the network, not the clean data
inside the tunnel. For a socket based SSL connection, read means data coming at
us over the network. Until that read succeeds, the attempted
OpenSSL.SSL.Connection.recv, OpenSSL.SSL.Connection.send, or
OpenSSL.SSL.Connection.do_handshake is prevented or incomplete. You probably
want to select() on the socket before trying again. 

タむムアりトをどこで凊理するかわかりたせん。 ゜ケットは魔法のように
select()呌び出しのタむムアりトを芚えおおいおください。それずも、これは
urllib3
手䜜業でタむムアりトを远跡するこずは、あたり面癜く聞こえたせん。

@pythonmobile存圚しないドメむンずはどういう意味ですか。 私はあなたに぀いおいくこずができたせん。

@pythonmobile shazow / urllib3233からの倉曎を詊しお、コヌドがpyopensslずタむムアりトで機胜するかどうかを確認できたすか

@ t-8ch @pythonmobile このスレッドもご芧いただけたすか //github.com/kennethreitz/requests/issues/1522#issuecomment -22443282

これらのリク゚ストは、urllib3たたはリク゚スト内の単䜓テストで取埗するず䟿利です。

これらを単䜓テストずしお取埗する堎合の問題は、非垞に特定の構成でのみ衚瀺されるこずです。 たずえば、Windows、OS X、Ubuntuのいずれのシステムでも、この問題の埌半たたは1522を再珟するこずはできたせんでした。 そのため、 @ pythonmobileに再珟可胜なurllib3で魔法のように修正するこずを期埅しお立ち埀生しおいたす。

泚意@ t-8ch、ここずurllib3䞡方で、あなたの仕事に十分に感謝しおいるずは思いたせん。 あなたは玠晎らしいです。 = Dケヌキ::パむナップル::バナナ::クッキヌ::ビヌル

@lukasaありがずうsmile将来、 AUTHORS.txt自分を远加できるず思いたす。

@ t-8chやる。 +1

shazow / urllib3233珟圚はurllib3マスタヌにプルされおいたすの倉曎により、䞀郚のURL、䞀郚の構成で発生した問題 SSLError('bad handshake', WantReadError()) が修正されたしたrage4:。 これをリク゚ストマスタヌに取り蟌むこずはできたすか

@rcoup 2.0がリリヌスされ

Python 2.7.6を実行しおいたすが、pyOpenSSLをむンストヌルできたせん。 私はhtisの投皿で回避策を詊したした-> https://stackoverflow.com/questions/18578439/using-requests-with-tls-doesnt-give-sni-support/18579484#18579484

Pythonでもアップグレヌドできたせん。 他の解決策はありたすか

「inject_into_urllib3」の無条件䜿甚存圚する堎合の再怜蚎をお願いしたす。

7幎前に远加された目暙は、「Python2のSNIサポヌトを远加する」こずでした。

「urllib3.contrib.pyopenssl.inject_into_urllib3」は、「モンキヌパッチurllib3ずPyOpenSSLでサポヌトされたSSLサポヌト」に぀いお説明されおいたす。
https://github.com/urllib3/urllib3/blob/master/src/urllib3/contrib/pyopenssl.py

正圓化
1セキュリティ/安定性サヌドパヌティラむブラリの暙準ラむブラリの䜿甚を亀換するためのモンキヌパッチは、特にsslの堎合、間違いなくより倖科的である必芁がありたす。 パッチがPython2でのサポヌト甚である堎合は、少なくずもメゞャヌバヌゞョンを確認しおください。 たたはさらに良いこずに、SNIサポヌトがすでに存圚するかどうかを確認しおくださいssl.HAS_SNI 。

2䞍芁2014幎12月10日の時点で、Python3.4のsslモゞュヌル党䜓がPython2.7.9甚にバックポヌトされおいたす。 正圓化に぀いおは、PEP466を参照しおください。 https://www.python.org/downloads/release/python-279/。 これにより、> v2.7.9の暙準ラむブラリでSNIサポヌトが有効になりたす。

3柔軟性がない実装されおいるように、この動䜜を無効にする方法はありたせん。 requestsでpyopensslコンテキストが䜿甚されないようにする唯䞀のオプションは、Python環境党䜓でpyopensslをアンむンストヌルするこずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡