Как заставить модуль Python ssl использовать данные в памяти, а не передавать пути к файлам?

Полное объяснение того, что я хочу сделать и почему потребуется время, чтобы объяснить. По сути, я хочу использовать частное соединение 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 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам