Potrzebuję zeskanować listę adresów IP i pobrać nazwę pospolitą z certyfikatu na tym IP (dla każdego IP, który pozwala na połączenia portu 443). Udało mi się to zrobić z użyciem gniazd i modułów ssl. Działa dla wszystkich adresów IP z ważnymi, podpisanymi certyfikatami, ale nie działa dla certyfikatów z podpisem własnym.Jak mogę pobrać certyfikat równorzędny TLS/SSL zdalnego hosta przy użyciu Pythona?
Gdybym użyć tej metody, wymaga ważnego cert, który jest potwierdzony przez moją CA-wiązki:
from socket import socket
import ssl
s = socket()
c = ssl.wrap_socket(s,cert_reqs=ssl.CERT_REQUIRED, ca_certs='ca-bundle.crt')
c.connect(('127.0.0.1', 443))
print c.getpeercert()
Jeśli usunąć cert_reqs=ssl.CERT_REQUIRED
następnie łączy, ale nie dostać certyfikat w ogóle.
Jak mogę odzyskać nazwę pospolitą dla certyfikatu na IP, czy sprawdza się przed pakietem ca, czy nie?
Warto również zauważyć, że jeśli wyodrębnisz certyfikat za pośrednictwem ssl.getpeercert (True), musisz załadować go za pomocą OpenSSL.crypto.FILETYPE_ASN1 zamiast FILETYPE_PEM –
Od czasu usterki "Poodle" w SSLv3 wiele serwerów internetowych ją wyłączyło. Może być konieczne dodanie 'ssl_version = ssl.PROTOCOL_TLSv1' do twojego wywołania' get_server_certificate (..) ', jeśli zobaczysz coś takiego jak" niepowodzenie uśpienia alertu sslv3 " –
Wywołanie M2Crypto SocketServer, które zmieni się na socketserver pod python3. M2Crypto zostanie złamane w python3. – mootmoot