2016-02-03 4 views
2

Я пытаюсь POST xml на сайт с использованием python. Я должен включить сертификат, но не знаю, как это сделать. Достаточно ли указать путь к файлу сертификата локально на моем компьютере?Пример включения certficate в почтовый запрос с python и http.client

Может ли кто-нибудь показать мой пример того, как включить сертификат в запрос?

import http.client, urllib.parse 

xml="""<?xml version="1.0" encoding="UTF-8"?> 
<home> 
    <bathroom>1</bathroom> 
    <kitchen>1</kitchen> 
    <street>515</street> 
</home>);""" 

headers = {"username": "password"} 

conn = http.client.HTTPSConnection("someurl.com", cert_file="D:\Users\Username\certificate.p12") 
conn.request("POST", "/to/this/place", xml, headers) 
response = conn.getresponse() 
print(response.status, response.reason) 
data = response.read() 
print(data) 
conn.close() 

ответ

3

Если вы не используете самозаверенные сертификаты и ваш сертификат подписывается относительно надежным органом (т.е. к нормальному someurl.com в Интернете), то вы должны использовать сертификаты системы CA, делая ваш подключение.

Вы можете сделать это, просто вызвав HTTPSConnection(), не предоставив ему файл сертификата или контекст в Python 3.4.3 или выше.

Если вы используете самоподписанные сертификаты, тогда да, вы можете загрузить сертификаты с локального жесткого диска. Вам нужно будет иметь закрытый ключ, включенный в файл сертификата или указанный в качестве файла ключа. Вы также захотите выполнить проверку хоста, если это возможно в вашей среде. См. Параметры verify_mode и check_hostname.

import http.client 
import ssl 

password = input("Key password (enter for none):") or None 

xml = """<?xml version="1.0" encoding="UTF-8"?> 
<home> 
    <bathroom>1</bathroom> 
    <kitchen>1</kitchen> 
    <street>515</street> 
</home>);""" 

headers = {"username": "password"} 

context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
context.load_cert_chain("cert.pem", "key.pem", password=password) 
context.verify_mode = ssl.CERT_REQUIRED 
context.check_hostname = True 

conn = http.client.HTTPSConnection("someurl.com", port=443, context=context) 

conn.request("POST", "/to/this/place") 
response = conn.getresponse() 
print(response.status, response.reason) 
data = response.read() 
print(data) 
conn.close() 
+0

Должен ли я иметь сертификат как .pem-файлы? У меня есть файл .p12. Как сделать конверсию? – user3632362

+0

Ничего себе. Получил его для работы с использованием .pem. Спасибо вам за помощь! : D – user3632362