![](/img/trans.png)
[英]How do I authenticate to Azure using a Service Principal and the Python SDK?
[英]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_file
和key_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.