===== 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. 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-" 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 ===== 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. 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