Python выдает данные сертификата из списка URL - PullRequest
0 голосов
/ 20 октября 2019

Я сделал метод get_certificate для очистки всех данных сертификата из списка URL-адресов, но моя проблема заключается в том, что эти 5 URL-адресов добавляются в базу данных, но информация о сертификате из одного из URL-адресов дублируется.

Вот также изображение, которое показывает дубликаты вставленных данных Данные Sql

Как очистить данные для каждого URL?

import urllib.request as urllib
import socket
import pyodbc
from datetime import datetime
import ssl
import OpenSSL
import requests
import grequests

timestamp = datetime.now().strftime('%d-%m-%Y %H:%M:%S')

#Contains 5 URLs
List = open("C:\\Users\\Farzad\\Desktop\\hosts.txt").read().splitlines()

rs = (grequests.get(url) for url in List)

requests = grequests.map(rs)


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)


for response in requests:
    certificate = get_certificate(response.url.replace("http://www.", "").replace("https://www.", "").replace("/", "").replace("https:", ""))
    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 = str(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 = str(x509.get_subject().CN)
subjCN = str(x509.get_subject().CN)
subjAlt = extension_data[b'subjectAltName']
serial = str(x509.get_serial_number())
issuerCN = str(x509.get_issuer().CN)
sign = str(x509.get_signature_algorithm())


for response in requests:
    con = pyodbc.connect('Driver={SQL Server Native Client 11.0};'
                      'Server=DESKTOP-THV2IDL;'
                      'Database=host;'
                      'Trusted_Connection=yes;')
    cursor = con.cursor()

    cursor.execute('INSERT INTO host.dbo.certificate (host, ssubject, CommonName, AlternativeNames, PublicKey, SerialNumber, [KeyLength(BITS)], Validfrom, Validtill, [Issuer(CN)], CSA, Timestamp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', 
          (response.url, subj, subjCN, subjAlt, pubkey, serial, keylength, certvalidfrom, certvalidtill, issuerCN, sign, timestamp))

    con.commit()
...