最近、Windows AzureストレージAPI(PyAzure)のPython APIを拡張してサービス管理APIのサポートを追加しました。 https://github.com/bmb/pyazureを参照してください。Azureサービス管理APIに対するPython HTTPSがWindowsで失敗する
using pyOpenSSL to create urllib custom openerで提案されているようなHTTPSClientAuthHandlerを使用しています。 Linuxでは、さまざまなバージョンのPython 2.6と2.7がうまくいきます。しかし、Windowsは別の話です。 Azureの管理ホストアドレスに対するすべての要求をして失敗:
既存の接続はリモートホストによって強制的に私は思う
を閉鎖した[errnoが10054]によるソケットのerrno 10054「接続がリセットされピア "をドラッグします。
これは私のAPIコードでは問題ありません(私が使用しているクライアント証明書認証方法は何とかやっかいですが)。 urllib2やhttplibを使わずに、SSLソケットを設定し、同じHTTPリクエストをurllib2のようにパイプの下に送るだけで問題を再現できます。有効Azureのデータセンターの場所をリストします。
>>> import socket, ssl, sys
>>> sys.version
'2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)]'
>>> s = ssl.wrap_socket(socket.socket(), certfile='c:\\users\\blair\\research\\clouds\\azure\\BlairBethwaiteAzure1.pfx.pem')
>>> s.connect(('management.core.windows.net',443))
>>> s.send("GET /SUBSCRIPTION_ID/locations HTTP/1.1\r\nAccept-Encoding: identity\r\nX-Ms-Version: 2011-10-01\r\nHost: management.core.windows.net\r\nConnection: close\r\nUser-Agent: Python-urllib/2.6\r\n\r\n")
202
>>> s.read()
Traceback (most recent call last):
c:\Users\blair\research\clouds\azure\pyazure\<ipython-input-63-3306c981d8a7>
in <module>()
----> 1 s.read()
C:\Python27\lib\ssl.pyc in read(self, len)
136
137 try:
--> 138 return self._sslobj.read(len)
139 except SSLError, x:
140 if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
error: [Errno 10054] An existing connection was forcibly closed by the remote host
があなたのAzureサブスクリプションIDと、上記SUBSCRIPTION_IDを交換してください。 SSLSocket.readを呼び出してから45秒後に例外が発生します。証明書は、秘密鍵と証明書の両方を含む適切な形式のPEMファイルで、それが使用する(Ubuntuの10.04で)PFXから変換された:
のopensslのpkcs12 -in pfxfile -out pemfile -nodes
ここでは問題はないと思っていますが、PEMファイルをunix2dosingしてみましたが、無駄です。
「HTTP/1.1 403禁止\ rを\ nContent長::0私は任意の証明書を提供していますが、Linux上でそれやってはサーバから適切なAPIのエラーが発生していない場合でも、私は同じ動作を取得しますこれはされている近くに\ rをする\ n個ます\ r \ n」
:\ rを\ nServer:マイクロソフト-HTTPAPI/2.0 \ rを\ nDate:\ nConnection木、2011年12月1日13時59分29秒GMTの\ rをWindows 7(私と同じ)を使用して別の人が独自に検証します。クライアント側のファイアウォールの問題ではありません。同じコードは、同じホスト上で動作するNAT対応のLinux VMで動作します。
私は困惑しています。ここで助けてくださった方々に本当に感謝しています。
更新: これは、Pythonの基礎となるSSL実装に関連しているようです。 CPythonの2.7.1は、上記のようにエラー動作を持っていますが、私は以来、テストされ、ActiveStateのPythonの(両方の2.7および2.6)、例えばで成功を収めてきました:
>>> import sys, socket, ssl
>>> sys.version
'2.7.1 (r271:86832, Feb 7 2011, 11:30:38) [MSC v.1500 32 bit (Intel)]'
>>> s = ssl.wrap_socket(socket.socket(), certfile='\\\\VBOXSVR\\azure\\BlairBethwaiteAzure1.pfx.pem')
>>> s.connect(('management.core.windows.net',443))
>>> s.send('GET /SUBSCRIPTION_ID/locations HTTP/1.1\r\nAccept-Encoding: identity\r\nX-Ms-Version: 2011-10-01\r\nHost: management.core.windows.net\r\nUser-Agent: Python-urllib/2.6\r\n\r\n')
183
>>> s.read(4096)
'HTTP/1.1 200 OK\r\nContent-Length: 908\r\nContent-Type: application/xml; charset=utf-8\r\nServer: Microsoft-HTTPAPI/2.0\r\nx-ms-request-id: 08ca048cda6b445da6b3a8f3e4890197\r\nDate: Fri, 02 Dec 2011 03:02:14 GMT\r\n\r\n<Locations xmlns="http://schemas.microsoft.com/windowsazure" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Location><Name>Anywhere US</Name><DisplayName>Anywhere US</DisplayName></Location><Location><Name>South Central US</Name><DisplayName>South Central US</DisplayName></Location><Location><Name>North Central US</Name><DisplayName>North Central US</DisplayName></Location><Location><Name>Anywhere Europe</Name><DisplayName>Anywhere Europe</DisplayName></Location><Location><Name>North Europe</Name><DisplayName>North Europe</DisplayName></Location><Location><Name>West Europe</Name><DisplayName>West Europe</DisplayName></Location><Location><Name>Anywhere Asia</Name><DisplayName>Anywhere Asia</DisplayName></Location><Location><Name>Southeast Asia</Name><DisplayName>Southeast Asia</DisplayName></Location><Location><Name>East Asia</Name><DisplayName>East Asia</DisplayName></Location></Locations>'
をそして予想通り、私のAPIは、あまりにも動作します:
CPython2.7とActivePython2.7のLib \ ssl.pyファイルは同じですので、これは基礎となるCライブラリの多少の違い、おそらくCPythonのバグが原因であると思います。そこにいるどんな指導者?
あなたのマシンにFiddlerなどのプロキシのようなプロセスがありますか? –
ローカルプロキシまたはスニファがありません。 – Blairo