簡體   English   中英

如何驗證對Windows Azure的管理服務請求?

[英]How do I authenticate a management service request to Windows Azure?

我正在嘗試通過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/zh-cn/library/windowsazure/gg651127上的說明創建了證書,給我cert.cer 我將.cer上傳到了我的Azure帳戶,並將.cer復制到了我正在使用Python的Linux VM中。 我將代碼修改為:

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 ,並且基於這里所說的關於.pem和.cer的區別(它們是同一個東西,但兩者是不同的)擴展名) ,我只是將.cer的擴展名更改為.pem,然后再次嘗試,出現相同的錯誤。

如何正確向Azure進行身份驗證以訪問其API? 這是我上載證書的方式的問題,還是我需要對證書做一些事情以使其適合呈現給服務器? 在Windows上,我似乎可以將.cer安裝到某種證書存儲中-Linux中是否有與之等效的文件,我需要在使用它進行身份驗證之前從中檢索證書? 感謝您的幫助=)

這是一些有效的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文件, https://github.com/smarx/waz-cmd是我編寫的用於與Service Management API交互的基於Ruby的命令行工具。 請注意,您需要兩個部分( cert_filekey_file )。

您已經有了cert文件,盡管我認為您實際上可能需要通過openssl類的文件將其轉換為PEM格式。 對於密鑰文件,我認為您需要導出在Windows計算機上創建的證書,然后使用openssl將私鑰導出為PEM文件。

.publishsettings ,您可以從Windows Azure門戶下載.publishsettings文件,而不是創建自己的證書,該文件會生成並為您提供准備使用的證書。 請參閱http://blog.smarx.com/posts/calling-the-windows-azure-service-management-api-with-the-new-publishsettings-file 其中的證書采用PFX格式,但是正確的openssl魔術應該可以為您提供所需的兩塊。 實際上,我曾經解決過這個問題(在Mac上與curl配合使用),但是我不再擁有確切的命令了。 :-(今天晚上我可以旋轉一下,寫一篇關於它的博客文章。

編輯

這是一個完整的Python程序,該程序在命令行上使用.publishsettings文件,將密鑰和證書轉儲到當前目錄中的單個文件(cert.pem)中,然后使用它來調用服務管理API並打印名稱您所有的存儲帳戶中。 在運行之前,只需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

這就是我將問題中創建的證書轉換為可用於驗證對Azure服務管理API的請求的格式。 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/zh-CN/library/windowsazure/gg651127的指示。

然后,通過在搜索框中鍵入certmgr.msc打開證書管理器。 我在“ Certificates - Current User/Personal/Certificates下找到了我的Certificates - Current User/Personal/Certificates

右鍵單擊證書,轉到“所有任務”,然后單擊“導出”。 出現提示時,請確保選擇“是,導出私鑰”,然后將文件導出為.PFX(PKCS#12)。

在這里,我將.PFX移至Linux VM。

此后的所有內容均遵循http://blog.scottlowe.org/2005/12/02/certificate-conversion-using-openssl/中列出的步驟。

打開終端,輸入:

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

這將提示您輸入用於加密.pfx的密碼和用於加密.pem的新密碼。 請勿將此密碼留空! 我確實感到困惑,因為密鑰不僅被解密,而且根本沒有包含在新的.pem中

將新.pem中的密鑰和證書分離為兩個不同的文件,除去----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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM