Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
de:dfnpki:tcsfaq:aktuellesituation [2024/11/15 19:42] – Juergen Brauckmann | de:dfnpki:tcsfaq:aktuellesituation [2025/02/21 09:17] (aktuell) – Juergen Brauckmann | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Aktuelle Situation | + | ===== Aktuelle Situation |
===== Worum geht es? ===== | ===== Worum geht es? ===== | ||
- | Der Dienstleister | + | Der bisherige |
- | + | ||
- | 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 | + | |
===== Wie geht es weiter? ====== | ===== 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. | + | Der DFN hat zum Dezember 2024 HARICA, einen griechischen Vertrauensdiensteanbieter, mit der Bereitstellung |
- | + | ||
- | 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 | + | |
- | + | ||
- | ===== 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 | + | |
- | + | ||
- | 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: | + | |
- | + | ||
- | Betroffen sind Einrichtungen, | + | |
- | + | ||
- | Selbstverständlich waren und sind alle am DFN teilnehmenden Einrichtungen, | + | |
- | + | ||
- | 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, | + | |
- | + | ||
- | + | ||
- | + | ||
- | ===== Was können Sie jetzt konkret tun? ===== | + | |
- | + | ||
- | === Für Server-Zertifikate === | + | |
- | + | ||
- | 1. Statten Sie Ihre kritischen Server in den nächsten Wochen | + | |
- | + | ||
- | 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:// | + | |
- | + | ||
- | - 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, | + | |
- | + | ||
- | 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, | + | |
- | + | ||
- | + | ||
- | + | ||
- | === Für User-Zertifikate === | + | |
- | + | ||
- | 1. Prüfen Sie, ob Sie Client-Authentifizierung mit User-Zertifikaten | + | |
- | + | ||
- | 2. Prüfen Sie für die Anwendungsfälle S/MIME und Dokumentensignatur, | + | |
- | + | ||
- | 3. Prüfen Sie, ob in Ihrer Organisation S/ | + | |
- | + | ||
- | === 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:// | + | |
- | + | ||
- | 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, | + | |
- | + | ||
- | ===== Kann man Let' | + | |
- | + | ||
- | 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, | + | |
- | + | ||
- | Voraussetzung: | + | |
- | + | ||
- | 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, | + | |
- | + | ||
- | headers = { | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | } | + | |
- | + | ||
- | # id des Admins ermitteln | + | |
- | admin_url = ' | + | |
- | req = requests.get(admin_url, | + | |
- | if req.status_code == 200: | + | |
- | | + | |
- | if len(admins) > 1: | + | |
- | print(" | + | |
- | exit(-1) | + | |
- | + | ||
- | # Mit der Admin-id die Admin-Details ermitteln | + | |
- | | + | |
- | | + | |
- | if req.status_code == 200: | + | |
- | | + | |
- | # In den Admin-Details nach dem Privileg autoApproveCertificates suchen | + | |
- | if not ' | + | |
- | print(admin_details) | + | |
- | print("" | + | |
- | print(" | + | |
- | print(" | + | |
- | exit(-1) | + | |
- | # Sicherstellen, | + | |
- | for cred in admin_details[" | + | |
- | if cred[" | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | else: | + | |
- | | + | |
- | | + | |
- | + | ||
- | # Alle SSL-Zertifikate, | + | |
- | # Dadurch, dass der Admin das Privileg " | + | |
- | # wird mit kurzer Verzögerung das Zertifikat ausgestellt. | + | |
- | # | + | |
- | # Erstellt eine Datei " | + | |
- | # der erneuerten Zertifikate. | + | |
- | # Mit den sslIds können die Zertifikate dann abgerufen werden. | + | |
- | def renew(username, | + | |
- | + | ||
- | # Admin prüfen | + | |
- | check_admin_role(username, | + | |
- | headers = { | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | } | + | |
- | position=0 | + | |
- | count=0 | + | |
- | now = datetime.datetime.now().strftime(" | + | |
- | with open(" | + | |
- | while True: | + | |
- | # Alle SSL-Zertifikate mit Status ' | + | |
- | # In 200er Blöcken durch die Zertifikate gehen | + | |
- | report_url = ' | + | |
- | req = requests.get(report_url, | + | |
- | cert_details=json.loads(req.text) | + | |
- | for cert in cert_details: | + | |
- | # Zertifikat anhand der sslId erneuern | + | |
- | renew_url = ' | + | |
- | renew_req = requests.post(renew_url, | + | |
- | if renew_req.status_code == 200: | + | |
- | # Die neue sslId des erneuerten Zertifikats in der Ausgabedatei ablegen | + | |
- | res=json.loads(renew_req.text) | + | |
- | print(res[" | + | |
- | else: | + | |
- | print(" | + | |
- | if len(cert_details) < 200: | + | |
- | # Keine weiteren Zertifikate, | + | |
- | | + | |
- | # 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 '' | + | |
- | + | ||
- | + | ||
- | 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, | + | |
- | def collect(sslid, | + | |
- | headers = { | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | " | + | |
- | } | + | |
- | # Zertifikatdetails abfragen, um den commonName zu ermitteln | + | |
- | name_url = ' | + | |
- | req = requests.get(name_url, | + | |
- | if req.status_code == 200: | + | |
- | cert_details=json.loads(req.text) | + | |
- | commonname=cert_details[" | + | |
- | print(cert_details[" | + | |
- | else: | + | |
- | print(" | + | |
- | exit(-1) | + | |
- | + | ||
- | # Herunterladen des Zertifikats | + | |
- | # format=pemia bedeutet: Zertifikat mit Kette. Issuer nach dem SSL-Zertifikat | + | |
- | collect_url = ' | + | |
- | req = requests.get(collect_url, | + | |
- | if req.status_code == 200: | + | |
- | print(" | + | |
- | filename=outputdir+'/' | + | |
- | with open(filename," | + | |
- | | + | |
- | else: | + | |
- | print(" | + | |
- | + | ||
- | return | + | |
- | </ | + | |