0

Python 経由で Azure にリクエストを送信して、使用しているストレージ サービスを一覧表示しようとしています。

私の基本コードはこれです:

import httplib
conn = httplib.HTTPSConnection('management.core.windows.net')
conn.request('GET', '/[subscription id]/services/storageservices/')
response = conn.getresponse()
print response.status response.reason

明らかに、私は認証しなかったため、これが出力されました403 Forbidden

そこで、http://msdn.microsoft.com/en-us/library/windowsazure/gg651127の指示に従って証明書を作成し、cert.cer. を Azure アカウントにアップロードし、 Python を使用している Linux VM に.cerコピーしました。.cerコードを次のように変更しました。

import httplib
cert_file = '/path/to/cert.cer'
conn = httplib.HTTPSConnection('management.core.windows.net', cert_file = cert_file)
conn.request('GET', '/[subscription id]/services/storageservices/')

エラーが発生しました:

ssl.SSLError: [Errno 336265225] _ssl.c:351: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

.cer.pem と.cerの違いについてここで述べられていること.pemに基づいて(拡張子が異なる同じものである)、. .cer の拡張子を .pem に変更して再試行したところ、同じエラーが発生しました。

API にアクセスするために Azure に対して自分自身を適切に認証するにはどうすればよいですか? これは、証明書をアップロードする方法に問題がありますか?それとも、証明書をサーバーに提示するのに適したものにするために何かをする必要がありますか? Windowsでは、.cerある種の証明書ストアにインストールできるようです-Linuxには、認証に使用する前に証明書を取得する必要がある同等のものがありますか? 助けてくれてありがとう =)

4

2 に答える 2

4

ここにいくつかの動作する Python コードがありますが、お気づきのように、秘訣は適切な PEM ファイルを取得することです。

import httplib

conn = httplib.HTTPSConnection('management.core.windows.net', cert_file='cert.pem', key_file='key.pem')
conn.request('GET', '/%s/services/storageservices' % subscription_id, headers={'x-ms-version': '2011-02-25'})
print conn.getresponse().read()

https://github.com/smarx/waz-cmdから PEM ファイルを取得しました。これは、Service Management API と対話するために作成した Ruby ベースのコマンドライン ツールです。cert_file両方の部分 (と)が必要であることに注意してくださいkey_file

証明書ファイルは既にありますが、実際にはopensslPEM 形式などに変換する必要があると思います。opensslキー ファイルについては、Windows マシンで作成した証明書をエクスポートし、それを使用して秘密キーを PEM ファイルとしてエクスポートする必要があると思います。

最近では、独自の証明書を作成する代わりに.publishsettings、Windows Azure ポータルからファイルをダウンロードして、すぐに使用できる証明書を生成して提供できます。http://blog.smarx.com/posts/calling-the-windows-azure-service-management-api-with-the-new-publishsettings-fileを参照してください。そこにある証明書は PFX 形式ですが、適切なopenssl魔法により、必要な 2 つの部分が得られるはずです。私は実際にこの問題を 1 回 ( curlMac で使用するために) 解決しましたが、正確なコマンドは手元にありません。:-( ちょっと試してみて、今晩ブログ記事を書くかもしれません。

編集

.publishsettingsコマンド ラインでファイルを取得し、キーと証明書を現在のディレクトリの 1 つのファイル (cert.pem) にダンプし、それを使用してサービス管理 API を呼び出し、すべての名前を出力する完全な Python プログラムを次に示します。ストレージ アカウント。実行する前に、pip install lxml pyopenssl.

import httplib
import argparse
from StringIO import StringIO
from lxml import etree
import base64
from OpenSSL.crypto import *

parser = argparse.ArgumentParser()
parser.add_argument('file', metavar='file', type=str, help='Your .publishsettings file.')
args = parser.parse_args()

tree = etree.parse(args.file)
pp = tree.find('PublishProfile')
cert = load_pkcs12(base64.decodestring(pp.get('ManagementCertificate')))
with open('cert.pem', 'w') as f:
    f.write(dump_certificate(FILETYPE_PEM, cert.get_certificate()))
    f.write(dump_privatekey(FILETYPE_PEM, cert.get_privatekey()))
subscription_id = pp.find('Subscription').get('Id')

conn = httplib.HTTPSConnection('management.core.windows.net', cert_file='cert.pem')
conn.request('GET', '/%s/services/storageservices' % subscription_id, headers={'x-ms-version': '2011-02-25'})
for e in etree.parse(StringIO(conn.getresponse().read())).iterfind('//{http://schemas.microsoft.com/windowsazure}ServiceName'): print e.text
于 2012-08-15T22:31:01.623 に答える
2

これは、質問で作成した証明書を、Azure ServiceManagementAPIへの要求を認証するために使用できる形式に変換した方法です。Smarxの答えも機能します。実際、私は、.publishsettingsファイルを含む彼の手法によって作成された証明書を使用して、変換された証明書がどのように見えるかを理解しました。

Visual Studioコマンドプロンプトを開き、次のように入力して、証明書を作成します。

makecert -r -pe -a sha1 -n "CN=My Azure Management Certificate" -ss My -len 2048 -sp   
"Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 myazuremanagementcert.cer

http://msdn.microsoft.com/en-us/library/windowsazure/gg651127の指示に従います。

certmgr.msc次に、検索ボックスに入力して証明書マネージャーを開きます。で証明書を見つけましたCertificates - Current User/Personal/Certificates

証明書を右クリックし、[すべてのタスク]に移動して、[エクスポート]をクリックします。プロンプトが表示されたら、[はい、秘密鍵をエクスポートします]が選択されていることを確認し、ファイルを.PFX(PKCS#12)としてエクスポートします。

ここでは、.PFXをLinuxVMに移動しました。

これ以降はすべて、 http://blog.scottlowe.org/2005/12/02/certificate-conversion-using-openssl/に記載されている手順に従います。

ターミナルを開くには、次のように入力します。

openssl pkcs12 -in pfxfilename.pfx -out tempfile.pem

これにより、.pfxの暗号化に使用したパスワードと、.pemの暗号化に使用する新しいパスワードの両方の入力を求められます。このパスワードを空白のままにしないでください。キーが復号化されたままになっているだけでなく、新しい.pemにまったく含まれていないため、私は混乱しました。

新しい.pemのキーと証明書を2つの異なるファイルに分割し、行以外の余分な行をすべて削除します----begin/end cert/key----

次のように入力して、キーを復号化します。

openssl rsa -in encryptedkey -out decryptedkey

そして、キーと証明書を次のように再結合します。

cat decryptedkey certificatefile > finalfile.pem

これで、この証明書はAzureへのサービス管理要求を適切に認証する必要があります。

import httplib
sub_id = [subid]
conn = httplib.HTTPSConnection('management.core.windows.net', cert_file = 'finalfile.pem')
conn.request('GET', '/%s/services/storageservices' % sub_id, headers = {'x-ms-versiojn':'2012-03-01'})

response = conn.getresponse()
print reponse.status response.reason
于 2012-08-21T23:31:21.580 に答える