У меня есть сервер сокетов, написанный на Python, принимающий такие соединения, как:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# set the socket as non-blocking
self.socket.setblocking(False)
# bind
self.socket.bind((self.host, int(self.port)))
# listen
self.socket.listen()
В отдельной асинхронной функции я вызываю:
conn, address = await self.loop.sock_accept(self.socket)
Как только соединение установлено, оно передается:
loop.connect_accepted_socket(lambda: <custom asyncio.Protocol class>, ssl=ssl_context)
Когда соединение не удается установить, ошибка обнаруживается в следующем разделе:
except ssl.SSLError as e:
print(e)
Где e
может быть диапазон ошибок SSL.
Некоторые из них:
В таких сценариях я бы хотел иметь возможность распечатать сертификат, который мы получили от клиента.
Есть ли способ сделать это?
Я попытался напечатать conn.getpeercert()
в обработчике исключений, однако получаю сообщение об ошибке:
AttributeError: объект «сокет» не имеет атрибута «getpeercert»
Принимая во внимание, что если соединение окажется успешным, я смогу получить сертификаты однорангового узла из транспортного объекта, вызвав:
transport.get_extra_info("peercert")
Я хотел бы знать, есть ли способ распечатать сертификат, полученный от клиента в случае неудачной проверки.
Если WRONG_VERSION_NUMBER, сервер не будет отправлять сертификат. При использовании SSLV3_ALERT_BAD_CERTIFICATE сертификат уже исчез, поскольку сокет закрыт, поэтому вам нужно будет перехватить его до закрытия сокета.
При взгляде на базовый OpenSSL обычный способ перехватить сертификат в этом случае — реализовать обратный вызов SSL проверки в контексте SSL. Но эта функциональность не реализована в Python, так что вам, вероятно, не повезло.
@AnirudhPanchangam: Возможно ли это теоретически: да. Но это нетривиально, поэтому лучше использовать существующий код, например cryptography.io/en/latest/x509/verification . И вам необходимо убедиться, что вы выполнили проверку перед передачей каких-либо данных приложения.
Спасибо, я приму это как ответ.
Могу ли я написать свою собственную функцию проверки сертификатов на Python. Затем передайте ssl_verify=False в контексте ssl, чтобы иметь возможность всегда читать сертификаты?