Я сделал метод 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()