Python Неверный тип параметра при попытке выполнить запрос вставки - PullRequest
0 голосов
/ 19 октября 2019

Я пытаюсь выполнить этот запрос, однако получаю ошибку и использую Microsoft SQL Server в качестве базы данных.

import urllib.request as urllib
import socket
import pyodbc
from datetime import datetime
import ssl
import OpenSSL
import re


#Timestamp for undersøgelse
timestamp = datetime.now().strftime('%d-%m-%Y %H:%M:%S')



#Responseheader request
request = urllib.Request('http://ucn.dk')
request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36')
response = urllib.urlopen(request)
rdata = response.info()
ipaddr = socket.gethostbyname(request.origin_req_host)


def get_certificate(host, port=443):
    context = ssl.create_default_context()
    conn = socket.create_connection((host, port))
    sock = context.wrap_socket(conn, server_hostname=host)
    der_cert = sock.getpeercert(True)
    sock.close()
    return ssl.DER_cert_to_PEM_cert(der_cert)


certificate = get_certificate(request.origin_req_host)
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, certificate)
Pubkeyobj = x509.get_pubkey()
pubKeyString = OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM, Pubkeyobj)
pubkey = b'\n'.join(pubKeyString.splitlines()[1:-1])
keylength = Pubkeyobj.bits()
certvalidfrom = datetime.strptime(x509.get_notBefore().decode('ascii'), '%Y%m%d%H%M%SZ')
certvalidtill = datetime.strptime(x509.get_notAfter().decode('ascii'), '%Y%m%d%H%M%SZ')
extensions = (x509.get_extension(i) for i in range(x509.get_extension_count()))
extension_data = {e.get_short_name(): str(e) for e in extensions}


subj = x509.get_subject()
subjCN = x509.get_subject().CN
subjAlt = extension_data[b'subjectAltName']
serial = x509.get_serial_number()
issuerCN = x509.get_issuer().CN
sign = x509.get_signature_algorithm()





#SQL Connection til local database
con = pyodbc.connect('Driver={SQL Server Native Client 11.0};'
                      'Server=DESKTOP-THV2IDL;'
                      'Database=host;'
                      'Trusted_Connection=yes;')

cursor = con.cursor()


con.execute('INSERT INTO host.dbo.certificate (host, Subject, CommonName, AlternativeNames, PublicKey, KeyLength(BITS), SerialNumber, Validfrom, Validtill, Issuer(CN), CSA, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
           (request.full_url, subj, subjCN, subjAlt, pubkey, keylength, serial, certvalidfrom, certvalidtill, issuerCN, sign, timestamp))

con.commit()

Я получаю эту ошибку:

Файл "c: /Users/Farzad/Desktop/Python/Webscraping/Responseheaderinfo.py", строка 76, в
(request.full_url, subj, subjCN, subjAlt, pubkey, keylength, serial, certvalidfrom, certvalidtill,isserCN, sign, timestamp))
pyodbc.ProgrammingError: ('Недопустимый тип параметра. param-index = 1 param-type = X509Name', 'HY105')

1 Ответ

0 голосов
/ 19 октября 2019

doc говорит, что метод X509Req get_subject() возвращает объект X509Name. Этот объект не может быть использован как Subject поле вашего запроса;потому что они являются объектами Python, а ваш MSSQL-сервер не может этого понять.

Возможно, вы создали это поле для VARCHAR или чего-то подобного;поэтому вам нужно использовать один из методов этого X509Name объекта, чтобы получить фактическое значение, которое вы хотите сохранить (строка, может быть?) в вашей базе данных. Взгляните на характеристики X509Name здесь .

Или вы можете захотеть преобразовать весь этот объект в байтовый массив, используя метод Python pickle.dumps()и сохраните его в своей БД в двоичном виде .

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