Ответ 1
Отказ
Прежде чем я начну, я хотел бы отметить комментарий @Emanuel Ey. Это вы хотели бы рассмотреть, если это было сделано на сервере производства или разработки. Например; если вы используете Apache WebServer, компонент HTTPS можно сделать из Apache. Единственное, что вы делаете по-другому, - это передать данные сертификата в качестве параметров, и ваше серверное приложение затем проверит серийный номер в самом приложении.
Возможно
Но это так, как это возможно, не считается хорошей практикой программирования. К сожалению, он недоступен из flask.request
и невозможен с пакетом Flask. Тем не менее, Flask использует Werkzeug, и это возможно, исправляя пакет werkzeug.serving
, где будет записываться ваш основной код фляги. Это не рекомендуется, потому что позже вы захотите обновить Flask или Werkzeug, и ваш патч может сломаться и его нужно будет переустановить. т.е. от 0,9 до 1,0.
Это обеспечивает решение без использования веб-сервера. Но я бы рекомендовал комбо-версию веб-сервера/среды. Это более чистая и сравнительно хорошая практика.
Я провел некоторое тестирование, чтобы убедиться, что это легко реализовать. Я смог подтвердить, что этот метод может работать с использованием последней версии codebase 'Werkzeug-0.10_devdev_20141223-py2.7'.
Вероятно, вы захотите проверить серийный номер (номер семени), найденный в каждом сертификате (и, возможно, даже некоторые другие переменные). Как вы знаете, серийный номер уникален для каждого сертификата и определяется во время процесса создания сертификата на стороне сервера. Это помогает хранить это вместе с записью клиентов и информацией о сертификате (где это необходимо), чтобы впоследствии проверить серийный номер сертификата клиента. Примечание. Может потребоваться изменение между шестнадцатеричным и десятичным десятичным значением.
Werkzeug dev_2014122
Что я сделал, так это добавить следующие опции в вызов werkzeug.serving.BaseWSGIServer.__init__
на wrap_socket()
.
Используйте их;
server_side=True, ca_certs= '/etc/apache2/ssl/ca.pem', cert_reqs=ssl.CERT_REQUIRED
- ca_certs: используйте это для проверки, это сертификат CA, используемый для создания клиентских сертификатов)
- ssl.CERT_REQUIRED: требуется проверка сертификата клиента на ca_certs
Примечание. Если сертификат клиента не проходит первоначальную проверку, вы не сможете получить сертификат клиента. Это будет None.
Затем в моем классе теста Flask я исправил verify_request
где
def verify_request(self, request, client_address):
cert = request.getpeercert(True)
raw = decoder.decode(cert)[0]
print "Serial Number of your certificate is: % " % str(raw[0][1])
# todo: do checks & if serial no is ok then return true
return True
werkzeug.serving.BaseWSGIServer.verify_request = verify_request
Это оказалось возможным, но вы, вероятно, захотите исследовать обработчики запросов класса HTTPServer, которые наследует BaseWSGIServer, чтобы найти лучший способ сделать обратный вызов или переопределить.
Werkzeug 0.9.X
Если вы используете Werkzeug 0.9.X, я предполагаю, что вы используете импорт from OpenSSL import SSL
. см. фрагмент кода здесь. Я не тестировал это.
Некоторые из вызовов, которые могут вас заинтересовать для этой версии;
- Context.set_verify(mode, callback)
- Connection.get_peer_certificate()
Разъяснение
То, что я не понимаю, - это ваша ссылка на отправку CSR во время первого рукопожатия. Если это ваш процесс генерации клиентских сертификатов, вам может потребоваться переосмыслить, как вы это делаете в контексте своей системы и среды. Если бы я мог получить дополнительную информацию, я мог бы прокомментировать дальше.
Кроме того, "рукопожатие" в контексте SSL/TLS обычно относится к действию создания безопасного соединения в первую очередь с использованием существующего сертификата. Сразу после установления связи, свободно говоря, устанавливается связь.