Aktuelle Situation Sectigo
Worum geht es?
Der Dienstleister Sectigo hat den Vertrag zwischen ihm und GÉANT gekündigt, auf dessen Basis der Trusted Certificate Service (TCS) im Rahmen der DFN-PKI erbracht wird.
Zwischen Sectigo und GÉANT gibt es Uneinigkeit über zentrale Vertragsfragen. Dies betrifft u.a. den Zeitpunkt, zu dem die Kündigung wirksam werden soll, und die Leistungserbringung an einzelne versorgte Einrichtungen.
Derzeit gehen wir davon aus, dass Sectigo die Leistungserbringung zum 10.01.2025 einstellen wird.
Wie geht es weiter?
Wir arbeiten intensiv mit GÉANT zusammen, um ein lückenloses Weiterbestehen der TCS-Dienstleistung mit einem neuen Anbieter zu ermöglichen. Selbstverständlich erkunden wir auch die Möglichkeiten für ein eigenes unabhängiges Angebot.
Zum aktuellen Zeitpunkt können wir leider keine konkreteren Angaben machen.
Kann der Vertrag mit Sectigo nicht verlängert oder neu abgeschlossen werden?
Der aktuelle Stand ist, dass Sectigo den Vertrag schriftlich gekündigt hat und die Verhandlungen über eine Verlängerung gescheitert sind. Wir gehen derzeit davon aus, dass dies keine Option ist, da Sectigo keine Bereitschaft zeigt, die aktuellen Bedingungen mit sinnvollen oder nachvollziehbaren Anpassungen fortzuführen.
Zu welchem Termin wird voraussichtlich die Ausstellung von Zertifikaten beendet?
Die aktuelle Vertragsperiode von GÉANT mit Sectigo endet Ende April 2025. Sectigo interpretiert die Vertragslage derart, dass sie bereits zum 10.01.2025 die Leistungserbringung beenden können. Wir müssen davon ausgehen, dass Sectigo spätestens zu diesem Zeitpunkt die Ausstellung von Zertifikaten einstellt.
Wir wissen derzeit nicht, ob nach dem 10.01. noch ein Login in das SCM zur Verwaltung der bestehenden Zertifikate möglich ist.
Wird Sectigo zum Ende der Leistungserbringung Zertifikate sperren?
Wir halten dies für äußerst unwahrscheinlich. Nach Aussage von GÉANT gibt es klare vertragliche Regelungen, dass nicht gesperrt werden darf.
Jenseits der vertraglichen Gründe ist eine Sperrung von Zertifikaten aus kommerziellen Gründen (z.B. zum Vertragsende) nach unserer Einschätzung nicht im Interesse von den Root-Programmen der Browser und Betriebssystemhersteller.
Warum wurde in meinem TCS-Zugang die Ausstellung von Zertifikaten deaktiviert?
Bei einigen Einrichtungen blockiert Sectigo derzeit die Zertifikatvergabe und fordert Nachweise zur Nutzungsberechtigung gemäß des Vertrags zwischen GÉANT und Sectigo. Dies äußert sich beispielsweise durch eine Fehlermeldung bei der Zertifkatausstellung: Certificate has been rejected: Pre Validation ID 123456789 is not available.
Betroffen sind Einrichtungen, von denen Sectigo nach uns nicht bekannten Parametern behauptet, dass sie weder Teil des jeweiligen Forschungsnetzes wären, noch dass sie in den Bereich „Forschung“ passten.
Selbstverständlich waren und sind alle am DFN teilnehmenden Einrichtungen, auch nach Einschätzung GÉANTs, berechtigt, den Dienst zu nutzen. Trotzdem gehen wir aktuell nicht davon aus, dass wir seitens DFN oder GÉANT etwas unternehmen können, um diese Einrichtungen zumindest bis zum 10.01. wieder freizuschalten.
Die Blockade durch Sectigo ist im Cert-Manager auch für uns nicht sichtbar. Falls Sie hiervon betroffen sind, wenden Sie sich bitte direkt an die DFN-PCA (dfnpca@dfn-cert.de).
Sind rechtliche Schritte gegen das Verhalten von Sectigo möglich?
Der Vertragspartner von Sectigo ist GÉANT. GÉANT prüft, welche Schritte sinnvoll und rechtlich möglich sind. Dies wird aber vor allem aus Zeitgründen keine Lösung für die Nichterbringung der Leistung nach dem 10.01. bringen, da eine mögliche entsprechende Rechtsklärung wohl zu spät erfolgen würde.
Werden Dokumentensignatur und CodeSigning berücksichtigt?
Dokumentensignatur ist ein sehr wichtiges Thema, dass weiterhin von uns große Beachtung findet. CodeSigning hat in der derzeitigen TCS-PKI nur eine sehr geringe Nutzung (64 gültige Zertifikate in 2024-11).
Beide Themen stehen bei einer kurzfristigen Übertragung an einen anderen Dienstleister zunächst nicht im Fokus, da die verbleibende Zeit nicht für notwendige detailliertere Betrachtungen dieser Themen ausreicht.
Kann die DFN-PKI Global wieder aktiviert werden?
Eine Wiederbelebung der DFN-PKI Global ist nicht möglich. In den wenigen Monaten seit Aussetzen der DFN-PKI Global haben sich die Anforderungen an den Betrieb in einem derart rasanten Tempo weiterentwickelt, dass eine Anpassung der Alt-Systeme nicht mehr möglich ist. Wiederaufnahme des Betriebes hätte eine sofortige Non-Compliance und Sperrung aller Zertifikate zur Folge.
Was können Sie jetzt konkret tun?
Für Server-Zertifikate
1. Statten Sie Ihre kritischen Server in den nächsten Wochen mit neuen Zertifikaten aus (auch vorzeitig).
2. Setzen Sie Automatisierung über ACME um. Jeder Anbieter in TCS wird ACME zur Verfügung stellen. Auch kurzfristig verfügbare Alternative wie Let's Encrypt oder ZeroSSL setzen ACME voraus.
3. Denken Sie daran, dass Ihre Organisation gegebenenfalls die Zertifikatausstellung per CAA auf bestimmte Zertifizierungsstellen eingeschränkt hat: https://doku.tid.dfn.de/de:dfnpki:tcs:caa
- Prüfen Sie, über welche organisatorischen Prozesse Sie die CAA-Records auf andere Anbieter ändern lassen können.
- Prüfen Sie für maximale Flexibilität, ob Sie ggf. ganz auf CAA-Records verzichten möchten.
4. Prüfen Sie, ob Sie Anwendungsfälle mit TCS-Zertifikaten realisiert haben, für die die Browserverankerung nicht notwendig ist. Dies betrifft potentiell alle Anwendungsfälle, die nicht der Absicherung von Webservern per HTTPS umfassen. https://doku.tid.dfn.de/de:dfnpki:dfnvereincommunitypki
Für User-Zertifikate
1. Prüfen Sie, ob Sie Client-Authentifizierung mit User-Zertifikaten einsetzen. Wenn ja: Stellen Sie dies auf die DFN-Verein Community-PKI oder eine andere PKI um, die nicht Bestandteil der Web-PKI ist. (https://doku.tid.dfn.de/de:dfnpki:dfnvereincommunitypki)
2. Prüfen Sie für die Anwendungsfälle S/MIME und Dokumentensignatur, ob diese ggf. auch mit DFN-Verein Community-PKI funktionieren würden. Dies kann z.B. der Fall sein, wenn das Hauptziel die verschlüsselte interne Kommunikation oder interne Verifikation von Dokumentensignaturen ist.
3. Prüfen Sie, ob in Ihrer Organisation S/MIME-Mail-Gateways im Einsatz sind, in denen eine Anbindung an Sectigo umgesetzt wurde. Für diese muss in Zusammenarbeit mit dem Hersteller des Mail-Gateways ebenfalls eine Lösung gefunden werden.
Generell
Prüfen Sie, ob in Ihrer Organisation vom Sectigo-spezifischen API Gebrauch gemacht wurde. Dieses spezifische API wird nicht mehr zur Verfügung stehen. https://doku.tid.dfn.de/de:dfnpki:tcs:restapi
Ein neuer Dienstleister wird ebenfalls ein API anbieten. Über die Ausgestaltung können wir naturgemäß derzeit nichts sagen.
Ist es sinnvoll, jetzt alle Zertifikate zu erneuern?
Durch eine zeitnahe Erneuerung der Zertifikate vor Ende der Leistungserbringung verschaffen Sie sich mehr Spielraum für Anpassungen in Ihrer Organisation. Dies empfiehlt sich auf jeden Fall für geschäftskritische Zertifikate oder Zertifikate, die bald ablaufen.
Kann man Let's Encrypt verwenden?
Es gibt eine kleine Auswahl an CAs, die ohne Vertragsbeziehung und Kosten Zertifikate ausstellen, u.a. Let's Encrypt und ZeroSSL.
Die Zertifikate aus diesen CAs beinhalten keinen Organisationsnamen (ausschließlich DV, Domain-validated). Die Zertifikatausstellung erfordert stets eine Prüfung der Kontrolle über die Domain, die aber vollautomatisch über ACME durchgeführt wird.
Die Zertifikate sind voll funktionsfähig und sicher.
Wie kann man 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-<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 now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") with open("renewlist-"+now,"w+") as outputfile: while True: # Alle SSL-Zertifikate mit Status 'Issued' holen. # In 200er Blöcken durch die Zertifikate gehen 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: # Zertifikat anhand der sslId erneuern 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: # Die neue sslId des erneuerten Zertifikats in der Ausgabedatei ablegen res=json.loads(renew_req.text) print(res["sslId"], file=outputfile) else: print("Fehler für "+cert["sslId"]+" "+cert["commonName"]) if len(cert_details) < 200: # Keine weiteren Zertifikate, Abbruch der Schleife break; # Nächster Block position=position+200 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