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-<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
 

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
  • Zuletzt geändert: vor 3 Tagen