Файловый объект в памяти с использованием Python - PullRequest
1 голос
/ 08 августа 2010

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

Для этого мне нужно скачать сертификаты CA,В настоящее время я записываю их во временный файл в каталоге / tmp и читаю его позже, но я уверен, что должен быть способ сделать это без записи на диск.

Вот часть, которая загружает сертификаты

CA_FILE = '/tmp/ca_certs.txt'

root_cert = urllib.urlopen('https://www.cacert.org/certs/root.txt')
class3_cert = urllib.urlopen('https://www.cacert.org/certs/class3.txt')

temp_file = open(CA_FILE, 'w')    
temp_file.write(root_cert.read())
temp_file.write(class3_cert.read())
temp_file.close()

РЕДАКТИРОВАТЬ

Вот часть, которая использует файл для получения сертификата

 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 ssl_sock = ssl.wrap_socket(s, ca_certs=CA_FILE, cert_reqs=ssl.CERT_REQUIRED)
 ssl_sock.connect(('mail.google.com', 443))

 date = ssl_sock.getpeercert()['notAfter']

Ответы [ 3 ]

4 голосов
/ 08 августа 2010

Ух ты, не делай этого. Ты заходишь на сайт cacert каждый раз? Это НЕВЕРОЯТНО грубо и без надобности кушает свои ресурсы. Это также смехотворно плохая практика безопасности. Вы должны получить корневой сертификат один раз и подтвердить, что это правильный корневой сертификат, а не подделка, иначе вы не можете полагаться на действительность подписанных им сертификатов.

Кэшируйте их корневой сертификат или, что еще лучше, установите его вместе с остальными корневыми сертификатами в вашей системе, как вы и предполагали.

4 голосов
/ 08 августа 2010

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

1 голос
/ 08 августа 2010

В следующей строке:

temp_file.write(root_cert.read())

вы фактически читаете сертификат в память и снова записываете его.Эта строка эквивалентна:

filedata = root_cert.read()
temp_file.write(filedata)

Теперь filedata - это переменная, содержащая байты корневого сертификата, которую вы можете использовать любым удобным вам способом (в том числе не записывать ее в temp_file и делатьвместо этого что-то еще).

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