Seite anzeigenÄltere VersionenLinks hierherNach oben Diese Seite ist nicht editierbar. Sie können den Quelltext sehen, jedoch nicht verändern. Kontaktieren Sie den Administrator, wenn Sie glauben, dass hier ein Fehler vorliegt. ===== Wie kann man bei Sectigo alle Serverzertifikate per API erneuern? ===== Der folgende Python-Schnipsel nutzt die Sectigo REST-API, um alle gültigen Serverzertifikate, die der aufrufende Admin im Zugriff hat, zu erneuern. Voraussetzung: Der aufrufende Admin ist RAO_SSL oder DRAO_SSL und hat das Privileg "autoApproveCertificates". Dieses Privileg kann in SCM von einem anderen Admin gesetzt werden. Achtung: Das System von Sectigo erzeugt für jedes Zertifikat potentiell mehrere E-Mails, z.B. an den Original-Antragstellenden. Es können einige Minuten vergehen, bis die Zertifikate ausgestellt worden sind. Achtung: Der Python-Schnipsel muss noch ergänzt werden, um eine lauffähige Software abzugeben. Dies ist nur eine schnelle Skizze, die mit Sicherheit Fehler enthält. <code> import datetime import json import os import requests import string from urllib.parse import urlparse import urllib.request # Stelle sicher, dass der aufrufende Admin das Privileg autoApproveCertificates hat # und nicht in der Rolle MRAO ist. def check_admin_role(username,password): headers = { "password": password, "Content-Type": "application/json;charset=utf-8", "login": username, "customerUri": "DFN", "Accept": "application/json" } # id des Admins ermitteln admin_url = 'https://cert-manager.com/api/admin/v1?login='+username req = requests.get(admin_url,headers=headers) if req.status_code == 200: admins=json.loads(req.text) if len(admins) > 1: print("Fehler: Mehr als ein Admin mit username "+username+" gefunden") exit(-1) # Mit der Admin-id die Admin-Details ermitteln admin_url = 'https://cert-manager.com/api/admin/v1/'+str(admins[0]["id"]) admin_req = requests.get(admin_url,headers=headers) if req.status_code == 200: admin_details=json.loads(admin_req.text) # In den Admin-Details nach dem Privileg autoApproveCertificates suchen if not 'autoApproveCertificates' in admin_details["privileges"]: print(admin_details) print("") print("Fehler: Admin muss das Privileg autoApproveCertificates haben!") print(" Rechte des Admins im SCM bearbeiten!") exit(-1) # Sicherstellen, dass der Admin kein MRAO ist for cred in admin_details["credentials"]: if cred["role"] == "MRAO": print(admin_details) print("") print("Fehler: Skript nicht als MRAO aufrufen!") exit(-1) else: print("Fehler: Admin nicht gefunden "+username+" "+admin_req.text) exit(-1) else: print("Fehler: Admin nicht gefunden "+username+" "+req.text) exit(-1) # Alle SSL-Zertifikate, die im Status "Issued" sind, mit Renew erneuern. # Dadurch, dass der Admin das Privileg "autoApproveCertificates" hat, # wird mit kurzer Verzögerung das Zertifikat ausgestellt. # # Erstellt eine Datei "renewlist-<Zeitstempel>" mit einer Liste aller sslIds # der erneuerten Zertifikate. # Mit den sslIds können die Zertifikate dann abgerufen werden. def renew(username,password): # Admin prüfen check_admin_role(username,password) headers = { "password": password, "Content-Type": "application/json;charset=utf-8", "login": username, "customerUri": "DFN", "Accept": "application/json" } position=0 count=0 certlist=[] while True: report_url = 'https://cert-manager.com/api/ssl/v1?status=Issued&position='+str(position)+'&size=200' req = requests.get(report_url,headers=headers) cert_details=json.loads(req.text) for cert in cert_details: certlist.append(cert["sslId"]) if len(cert_details) < 200: break; position=position+200 now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") with open("renewlist-"+now,"w+") as outputfile: for cert_sslid in certlist: renew_url = 'https://cert-manager.com/api/ssl/v1/renewById/'+str(cert_sslid) renew_req = requests.post(renew_url,headers=headers) if renew_req.status_code == 200: res=json.loads(renew_req.text) print(res["sslId"], file=outputfile, flush=True) else: print("Fehler für "+str(cert_sslid)+":"+renew_req.text) return </code> ===== Wie können die erneuerten Zertifikate per API heruntergeladen werden? ===== Der folgende Python-Schnipsel nutzt die Sectigo REST-API, um in einzelnes ausgestelltes Serverzertifikat herunterzuladen. Der Eingabe-Parameter ''sslid'' ist genau die ID, die das Erneuerungs-Verfahren ausgibt. Das Zertifikat muss bereits ausgestellt sein. Es können einige Minuten vergehen zwischen dem Erneuern und dem Ausstellen. Achtung: Der Python-Schnipsel muss noch ergänzt werden, um eine lauffähige Software abzugeben. Dies ist nur eine schnelle Skizze, die mit Sicherheit Fehler enthält. <code> import json import os import requests import string from urllib.parse import urlparse import urllib.request # sslid: herunterzuladendes Zertifikat # outputdir: Verzeichnis, in dem das Zertifikat abgespeichert werden soll def collect(sslid,outputdir,username,password): headers = { "password": password, "Content-Type": "application/json;charset=utf-8", "login": username, "customerUri": "DFN", "Accept": "application/json" } # Zertifikatdetails abfragen, um den commonName zu ermitteln name_url = 'https://cert-manager.com/api/ssl/v1/'+str(sslid) req = requests.get(name_url,headers=headers) if req.status_code == 200: cert_details=json.loads(req.text) commonname=cert_details["commonName"] print(cert_details["commonName"]) else: print("Fehler "+str(sslid)+": "+req.text) exit(-1) # Herunterladen des Zertifikats # format=pemia bedeutet: Zertifikat mit Kette. Issuer nach dem SSL-Zertifikat collect_url = 'https://cert-manager.com/api/ssl/v1/collect/'+str(sslid)+'?format=pemia' req = requests.get(collect_url,headers=headers) if req.status_code == 200: print("Erfolg "+str(sslid)) filename=outputdir+'/'+str(sslid)+'_'+commonname+'_chain.pem' with open(filename,"w+") as outputfile: outputfile.write(req.text) else: print("Fehler "+str(sslid)+": "+req.text) return </code> Zuletzt geändert: vor 4 Monaten Anmelden