Как заставить модуль Python ssl использовать данные в памяти, а не передавать пути к файлам? - PullRequest
0 голосов
/ 13 мая 2018

Полное объяснение того, что я хочу сделать и почему потребуется время, чтобы объяснить.По сути, я хочу использовать частное соединение SSL в общедоступном приложении, а не раздавать свои личные ключи ssl, потому что это сводит на нет цель!Т.е. мне нужны безопасные удаленные операции с базой данных, которые никто не может увидеть, включая клиента.

Мой основной вопрос: как я могу заставить модуль Python ssl использовать данные, хранящиеся в памяти, содержащие содержимое файла ssl pem?жестких путей к файловой системе?

Конструктор для вызовов класса SSLSocket load_verify_locations(ca_certs) и load_cert_chain(certfile, keyfile), которые я не могу отследить, потому что это файлы .pyd.Я полагаю, что в этих черных ящиках эти файлы читаются в память.Как я могу замкнуть процесс и передать данные напрямую?(возможно, поменять .pyd? ...)

Другие мысли, которые у меня были: я мог бы использовать io.StringIO для создания виртуального файла, а затем передать дескриптор файла.Я использовал эту концепцию с классами, которые будут использовать дескриптор, а не путь.К сожалению, эти классы не разработаны таким образом.

Или, может быть, использовать виртуальную файловую систему / RAM-диск?Это может быть проблемой, потому что мне нужно, чтобы это было кроссплатформенным.Кроме того, это могло бы свести на нет то, что я пытаюсь сделать, если бы кто-то мог получить доступ к этим путям из любой внешней программы ...

Полагаю, я мог бы сохранить их как настоящие файлы, но "спрятать их где-нибудь в файловой системе.

Я не могу быть первым, у кого возникла эта проблема.

ОБНОВЛЕНИЕ

Я нашел источник для "черных ящиков" ...

https://github.com/python/cpython/blob/master/Modules/_ssl.c

Они работают какожидается.Они просто читают содержимое файла по путям, но вам нужно копаться в слое C, чтобы добраться до этого.

Я могу написать на C, но я никогда не пытался перекомпилировать исходный код Python.Похоже, мне следует следовать указаниям https://devguide.python.org/, чтобы получить репозиторий Python и внести изменения в.Думаю, я смогу затем представить свое обновление сообществу Python, чтобы узнать, не хотят ли они создать новую стандартизированную функцию, как я описываю ... Кажется, впереди много работы ...

1 Ответ

0 голосов
/ 04 июня 2018

Потребовалось некоторое усилие, но я действительно решил это так, как я предложил. Я пересмотрел базовый код в модуле / расширении _ssl.c Python и перестроил Python в целом. После выяснения процесса сборки Python из исходного кода мне пришлось изучить детали того, как передавать переменные между Python и C, и мне нужно было копаться в кишках OpenSSL (над которым модуль Python является оберткой).

К счастью, в OpenSSL уже есть функции для этой конкретной цели, так что это был всего лишь вопрос об обмене тем, как Python пытается передать пути к файлам в C, и вместо этого обойти процесс чтения файлов и перейти прямо к реализации вместо этого напрямую используйте данные ca / ​​cert / key.

На данный момент я сделал это только для Windows. Так как я в конечном итоге создаю кроссплатформенную программу, мне придется повторить процесс сборки для других платформ, которые я буду поддерживать, так что это хлопотно. Подумай, как сильно ты этого хочешь, если собираешься заняться этим сам ...

Обратите внимание, что когда я перестраивал Python, я не использовал его в качестве фактической установки Python. Я просто держал его в стороне.

Одна вещь, которая была действительно приятной в этом процессе, заключалась в том, что после этой перестройки все, что мне нужно было сделать, - это поместить новый _ssl.pyd в мой рабочий каталог. Имея этот файл, я мог передать свои прямые данные сертификата. Если бы я удалил его, я мог бы вместо этого передать нормальные пути к файлам. Он будет использовать либо обычный исходный код Python, либо неявно использовать переопределение, если файл .pyd просто помещается в каталог программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...