gpt4 book ai didi

python - 如何验证向 Windows Azure 发出的管理服务请求?

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:46 27 4
gpt4 key购买 nike

我正在尝试通过 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。我将 .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,并且基于所说的 here关于 .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 文件是我编写的一个基于 Ruby 的命令行工具,用于与服务管理 API 进行交互。请注意,您需要这两部分(cert_filekey_file)。

您已经有了证书文件,但我认为您实际上可能需要通过 openssl 之类的方式将其转换为 PEM 格式。对于 key 文件,我认为您需要导出在 Windows 计算机上创建的证书,然后使用 openssl 将私钥导出为 PEM 文件。

现在,您可以从 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 文件,将 key 和证书转储到当前目录中的单个文件 (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

关于python - 如何验证向 Windows Azure 发出的管理服务请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977725/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com