2011-12-01 13 views
15

最近、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のバグが原因であると思います。そこにいるどんな指導者?

+0

あなたのマシンにFiddlerなどのプロキシのようなプロセスがありますか? –

+0

ローカルプロキシまたはスニファがありません。 – Blairo

答えて

2

私はこのための決定的な説明を突き止めることができませんでしたが、試行錯誤のビットの後、私は問題が産む場所の自信...

短い答え:それはですWindowsバンドルのhttp://www.python.org/にsslを実装しました。代わりにActiveState Pythonを使用してください。

ロング回答:CPythonのに基づいていますが、(とりわけ)されているActiveStateのPythonのディストリビューションと比較http://www.python.org/download/バンドルのOpenSSLのかなり古いバージョン(0.9.8l)から入手可能 のWindows CPythonのディストリビューション、第三に定期的なアップデートを提供OpenSSL(現在は0.9.8r)などの党内封入物。

私は例えば、OpenSSLののWindowsバイナリをダウンロードしてのopenssl s_clientインタフェースを介してテスト:

opensslのs_client -connect management.core.windows.net:443 -cert /ホーム/ブレア/ニムロッド-devの/ BlairBethwaiteAzure1.pfx.pem

現在のバージョンは期待通りに機能します。残念ながら、Windows用の古いOpenSSLバイナリを手に入れるのは難しいようですが、おそらくそれはセキュリティライブラリなので驚くことではないでしょう...しかし、とにかく、私はUbuntu 10.04でソースから0.9.8lをビルドし、HTTPリクエストを送信した後にハングすることがわかりましたパイプダウン、おそらくサーバは静かに何らかの理由で接続ドロップ:新規の方、少しでも古いの下

[email protected]:~/Downloads/openssl-0.9.8l/apps$ ./openssl s_client -connect management.core.windows.net:443 -cert ./BlairAzure.pem 
CONNECTED(00000003) 
depth=2 /CN=Microsoft Internet Authority 
verify error:num=20:unable to get local issuer certificate 
verify return:0 
--- 
Certificate chain 
0 s:/CN=management.core.windows.net 
    i:/DC=com/DC=microsoft/DC=corp/DC=redmond/CN=Microsoft Secure Server Authority 
1 s:/DC=com/DC=microsoft/DC=corp/DC=redmond/CN=Microsoft Secure Server Authority 
    i:/CN=Microsoft Internet Authority 
2 s:/CN=Microsoft Internet Authority 
    i:/C=US/O=GTE Corporation/OU=GTE CyberTrust Solutions, Inc./CN=GTE CyberTrust Global Root 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
MIIGhDCCBWygAwIBAgIKFnL3ogAIAAIjlDANBgkqhkiG9w0BAQUFADCBizETMBEG 
CgmSJomT8ixkARkWA2NvbTEZMBcGCgmSJomT8ixkARkWCW1pY3Jvc29mdDEUMBIG 
CgmSJomT8ixkARkWBGNvcnAxFzAVBgoJkiaJk/IsZAEZFgdyZWRtb25kMSowKAYD 
VQQDEyFNaWNyb3NvZnQgU2VjdXJlIFNlcnZlciBBdXRob3JpdHkwHhcNMTEwNjE2 
MDg0MjI3WhcNMTMwNjE1MDg0MjI3WjAmMSQwIgYDVQQDExttYW5hZ2VtZW50LmNv 
cmUud2luZG93cy5uZXQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCS 
Z9PTUqQLh5keX/IRJ6JxaQkVBIy/iyoCIx2Y0zy5F5tll8CRydGzFDjXMLWEG425 
EuuRDQrBgQnmVtlZ2t42QfIRBSvfJheZVh8k27g/tH5wpchZ47gxxatUKsVJ84P8 
Me2S0RP9xtk3P14dVqTDJIhUC3k8JYdBiTTtk64EB5Dbq8sxEtjVb/68XDgTZKek 
te/vqWSW/KcduKEjsfjOwNSM9UbYrFOTbelac+mf/L+CluAJpYAlIhOMUP2afy5e 
tYIg6zK04pDNjPjizpfN3xrGX7NRY16kaafrdqJQixfmEVlMDN8FsXLWDweXWfMM 
XRh4vuAVb6tA9wBkPDhZAgMBAAGjggNMMIIDSDALBgNVHQ8EBAMCBLAwHQYDVR0l 
BBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMHgGCSqGSIb3DQEJDwRrMGkwDgYIKoZI 
hvcNAwICAgCAMA4GCCqGSIb3DQMEAgIAgDALBglghkgBZQMEASowCwYJYIZIAWUD 
BAEtMAsGCWCGSAFlAwQBAjALBglghkgBZQMEAQUwBwYFKw4DAgcwCgYIKoZIhvcN 
AwcwHQYDVR0OBBYEFEaKqx6Auvu3fvHS6KqQl8KXoOoAMB8GA1UdIwQYMBaAFAhC 
49tOEWbztQjFQNtVfDNGEYM4MIIBCgYDVR0fBIIBATCB/jCB+6CB+KCB9YZYaHR0 
cDovL21zY3JsLm1pY3Jvc29mdC5jb20vcGtpL21zY29ycC9jcmwvTWljcm9zb2Z0 
JTIwU2VjdXJlJTIwU2VydmVyJTIwQXV0aG9yaXR5KDgpLmNybIZWaHR0cDovL2Ny 
bC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL01pY3Jvc29mdCUyMFNlY3Vy 
ZSUyMFNlcnZlciUyMEF1dGhvcml0eSg4KS5jcmyGQWh0dHA6Ly9jb3JwcGtpL2Ny 
bC9NaWNyb3NvZnQlMjBTZWN1cmUlMjBTZXJ2ZXIlMjBBdXRob3JpdHkoOCkuY3Js 
MIG/BggrBgEFBQcBAQSBsjCBrzBeBggrBgEFBQcwAoZSaHR0cDovL3d3dy5taWNy 
b3NvZnQuY29tL3BraS9tc2NvcnAvTWljcm9zb2Z0JTIwU2VjdXJlJTIwU2VydmVy 
JTIwQXV0aG9yaXR5KDgpLmNydDBNBggrBgEFBQcwAoZBaHR0cDovL2NvcnBwa2kv 
YWlhL01pY3Jvc29mdCUyMFNlY3VyZSUyMFNlcnZlciUyMEF1dGhvcml0eSg4KS5j 
cnQwPwYJKwYBBAGCNxUHBDIwMAYoKwYBBAGCNxUIg8+JTa3yAoWhnwyC+sp9geH7 
dIFPg8LthQiOqdKFYwIBZAIBCjAnBgkrBgEEAYI3FQoEGjAYMAoGCCsGAQUFBwMC 
MAoGCCsGAQUFBwMBMCYGA1UdEQQfMB2CG21hbmFnZW1lbnQuY29yZS53aW5kb3dz 
Lm5ldDANBgkqhkiG9w0BAQUFAAOCAQEAsqHBR/JxRnGQMTXxJzCau49dDgeum1JH 
heA38lzsoUaRELHxxrQZskjSqc0HrI7cnJPSipWQseDDwKtLwXzukCdZNk84u7xo 
uHa7/dmxo1m+z353HSvEr85ZE2mzwF6qmwGMmvvVzIJ94M8fcN55yoF64vQsAWFF 
k2QJC9ccb8eDoTs5NX4ntpz02xf8eEBQ5yKZySfi3+oFJEUnLmXcvHTTMl/1N/NI 
fWiKIZ9PDTBlPxL5kNJ/aDGIgiqCi7Vm7KfjvWSFhopUPtVeeItgW9wMLEkuQsw6 
sViSbU50CMPWTJAslLZgCju6cxszgpLl19xrgNteHRw2HouwTTsJnA== 
-----END CERTIFICATE----- 
subject=/CN=management.core.windows.net 
issuer=/DC=com/DC=microsoft/DC=corp/DC=redmond/CN=Microsoft Secure Server Authority 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 4691 bytes and written 450 bytes 
--- 
New, TLSv1/SSLv3, Cipher is AES128-SHA 
Server public key is 2048 bit 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : TLSv1 
    Cipher : AES128-SHA 
    Session-ID: <SNIP> 
    Session-ID-ctx: 
    Master-Key: <SNIP> 
    Key-Arg : None 
    Start Time: 1324443511 
    Timeout : 300 (sec) 
    Verify return code: 20 (unable to get local issuer certificate) 
--- 
GET /<SUBSCRIPTION_ID>/locations HTTP/1.1 
Accept-Encoding: identity 
X-Ms-Version: 2011-10-01 
Host: management.core.windows.net 
Connection: close 

を(例えば、Ubuntu10.04の0.9.8e)は、サーバが期待されるとの要求に応答OpenSSLs:

<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>Anywhere Europe</Name><DisplayName>Anywhere 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><Location><Name>North Central US</Name><DisplayName>North Central US</DisplayName></Location><Location><Name>North Europe</Name><DisplayName>North Europe</DisplayName></Location></Locations> 

しかし、OpenSSL 0.9.8lでは何も得られません。

0

私はPython開発者ではありません。しかし、私はiPhoneとWindows PhoneのしなさいからAzureのサービスを扱うときに証明書が正しい.IEで次

  • を確保する証明書は、あなたがヒットしている適切なURLが含まれている必要がありますので、多くの問題に直面しています。
  • pythonで証明書チェックを除外する方法はありますか?ネットのように? http://www.west-wind.com/weblog/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errorsもしそうなら、URLが機能していることを確認してください。
  • 取得した証明書が正しい証明書ストアのものであることを確認してください。
+0

証明書やキーに問題はありません(特定のバージョンのOpenSSLでエンコードされている問題に関係しない限り)。それらはPEMでエンコードされているため、URLはありません。気にする証明書ストアはありません。これは、ファイルを使用する単純なクロスプラットフォームのPythonで、.NETのエンタングルメントはありません。 – Blairo

2

次作品OS X 10.6.8上でWindows 7とCPythonの2.6.6にIronPythonの2.7.1を使用して期待通り:

import socket, ssl, sys 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.connect(('management.core.windows.net',443)) 

s = ssl.wrap_socket(sock, certfile=sys.argv[1]) 
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') 

print(s.read(4096)) 

[注:私はコマンド - としてMYKEYFILENAME.pemを渡しています]

ハッピーアズールハッキング!

関連する問題