Аз съм потребител на Windows. Използвам Python 3.6.5
и импортирам тази версия на OpenSSL OpenSSL 1.0.2k
.
Трябва да напиша скрипт за Python TLS клиент, който мога да персонализирам по отношение на поддържаните TLS версии и шифрови пакети и други конфигурации. Клиентът трябва да може да прави връзки със самоподписани сертификати. Затова смятам, че трябва да използвам: ssl.SSLContext()
, за да създам своя контекст, а не ssl.create_default_context()
.
Със следния скрипт обаче никога не мога да получа сертификата на партньора. Моля, дайте ясни отговори с код, тъй като в противен случай опитах много решения и погледнах предишните публикации без надежда.
context = ssl.SSLContext() # ssl.create_default_context()
#context.verify_mode = ssl.CERT_NONE
#context.check_hostname = True
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
domain="google.com"
ssl_sock = context.wrap_socket(s, server_hostname=domain)
ssl_sock.connect((domain, 443))
print("====== peer's certificate ======")
try:
cert = ssl_sock.getpeercert()
print ("issued to:", dict(itertools.chain(*cert["subject"]))["commonName"])
print ("issued by:", dict(itertools.chain(*cert["issuer"]))["commonName"])
print("issuance date:", cert["notBefore"])
print("expairy date: ", cert["notAfter"])
if (cert == None):
print("no certificate")
except Exception as e:
print("Error:",e)
ssl_sock.close()
Проблемът е, че не получавам сертификата на партньора, когато използвам ssl.SSLContext()
, но когато използвам ssl.create_default_context()
, той се получава правилно. Трябва обаче да мога да получавам самоподписани сертификати (т.е. непроверени сертификати), затова трябва да използвам ssl.SSLContext()
.
Благодаря за публикуваното решение. Но трябва да анализирам сертификата, дори ако не е проверен (самоподписан). Вярвам на този сертификат и имам нужда от информацията за него. Разгледах няколко публикации, включително тази. Направих тези стъпки:
- Взех
.pem
съдържанието на сертификата на моя сървър. - Навигирах до:
C:\Python36\Lib\site-packages\certifi
- Отворих
cacert.pem
, който е поставен в директорията (стъпка 2) - Добавих .pem съдържание на сертификата на моя сървър, което започва с:
-----BEGIN CERTIFICATE-----
и завършва с-----END CERTIFICATE-----
Получавам тази грешка:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)