2016-12-27 4 views
0

Я пытаюсь загрузить сертификат удаленного сервера и сохранить его на локальном диске. Это сценарий Python Я использую:Не удается сохранить сертификат на локальный диск с помощью python

from M2Crypto.X509 import FORMAT_PEM 

import StringIO 
import traceback 
from M2Crypto.Err import SSLError 
import ssl 
import socket 
import pprint 
import M2Crypto 
from M2Crypto import X509, RSA 
from datetime import datetime 

context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
context.verify_mode = ssl.CERT_NONE 
context.check_hostname = False 
context.verify_mode = ssl.CERT_NONE 
port = 443 
host='216.58.212.67' #google 

#creating ssl socket 
ssock = context.wrap_socket(socket.socket(socket.AF_INET), server_hostname=host) 

#ssl connection 
try: 
    ssock.connect((host, port)) 
except socket.error: #if tls connection is not possible 
    print "Faile connection with: " + host 

#get the certificate 
cert = ssock.getpeercert(True) 
x509 = M2Crypto.X509.load_cert_der_string(cert) 
x509_file= M2Crypto.X509.load_cert('C:/Users/xxx/Documents/temp',format=FORMAT_PEM) 

Когда я бегу, я получаю эту ошибку:

Traceback (most recent call last): 
    File "C:/Users/ealas/PycharmProjects/tlsScan/test.py", line 36, in <module> 
    x509_file= M2Crypto.X509.load_cert('C:/Users/xxx/Documents/temp',format=FORMAT_PEM) 
    File "C:\Python27\lib\site-packages\M2Crypto\X509.py", line 609, in load_cert 
    bio = BIO.openfile(file) 
    File "C:\Python27\lib\site-packages\M2Crypto\BIO.py", line 186, in openfile 
    return File(open(filename, mode)) 
IOError: [Errno 13] Permission denied: 'C:/Users/xxx/Documents/temp' 

Что неправильно в моем коде, пожалуйста?

+1

Ну, какие разрешения для этого файла? Кажется, что нет никаких проблем с вашим кодом. –

+0

Это папка. Сценарий должен написать сертификат на нем. – user2192774

+0

В этом проблема. Вы не можете записывать данные в папку, вы должны указать файл в этой папке. –

ответ

0

Вы указываете папку, когда должны указывать файл. Согласно documentation for the M2Crypto.X509.load_cert function, вы должны указать путь к файлу, а не папка:

Load certificate from file.

@type file: string
@param file: Name of file containing certificate in either DER or PEM format.

Если вы пытаетесь загрузить данные из или записи данных в папку, а не файл, вы получите «разрешение отказали ", по крайней мере, в Windows. Чтобы проверить это, я создал папку под названием temp, и пытался читать данные из него и записывать данные на него, и я получил точно такую ​​же ошибку, как в вашем вопросе:

Traceback (most recent call last): 
    File "test.py", line 4, in <module> 
    with open(r'C:\Users\Random\Documents\temp', 'w') as f: 
IOError: [Errno 13] Permission denied: 'C:\\Users\\Random\\Documents\\temp' 

Traceback (most recent call last): 
    File "test.py", line 4, in <module> 
    with open(r'C:\Users\Random\Documents\temp', 'r') as f: 
IOError: [Errno 13] Permission denied: 'C:\\Users\\Random\\Documents\\temp' 

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

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

Смежные вопросы