Как связать cn в ssl-сертификате pyOpenSSL verify_cb с сгенерированным сокетом - PullRequest
5 голосов
/ 19 сентября 2008

Я немного новичок в pyOpenSSL. Я пытаюсь выяснить, как связать сгенерированный сокет с SSL-сертификатом. Вызывается verify_cb, который дает мне доступ к сертификату и соединению, но как мне связать эти вещи, когда это происходит:

cli, addr = self.server.accept ()

1 Ответ

5 голосов
/ 19 сентября 2008

После того, как рукопожатие завершено, вы можете получить сертификат клиента. Хотя сертификат клиента также доступен в обратном вызове проверки (verify_cb), на самом деле нет никаких причин пытаться что-либо делать, кроме проверки сертификата в этом обратном вызове. Настроить сопоставление для конкретного приложения лучше после успешного завершения рукопожатия. Итак, рассмотрите возможность использования экземпляра OpenSSL.SSL.Connection, возвращаемого методом accept, для получения сертификата (и оттуда commonName) и связывания его с объектом подключения в этой точке. Например,

client, clientAddress = self.server.accept()
client.do_handshake()
commonNamesToConnections[client.get_peer_certificate().commonName] = client

Возможно, вы захотите проверить сопоставление, чтобы убедиться, что вы не перезаписываете любое существующее соединение (возможно, используя список соединений вместо простого сопоставления каждого общего имени с одним). И, конечно, вам нужно удалить записи, когда соединения потеряны.

Вызов do_handshake заставляет рукопожатие действительно произойти. Без этого рукопожатие произойдет при первой передаче данных приложения через соединение. Это нормально, но это немного усложнит настройку этого отображения.

...