Wie man mit OpenSSL Certificate Signing Request (CSRs) erstellt, kann man auf sehr vielen Seiten im Internet lesen.
Aber wie erstellt man mit OpenSSL einen CSR der in einer Microsoft Windows CA signiert werden soll?
Das braucht ein zusätzliches Attribut im CSR damit die Windows CA weiß, welches Zertifikatstemplate für die Signierung genutzt werden soll.
Ohne dieses Attribut erscheint die folgende Fehlermeldung:
Die Anforderung enthält keine Zertifikatvorlageninformationen. 0x80094801 (-2146875391 CERTSRV_E_NO_CERT_TYPE)
Verweigert vom Richtlinienmodul 0x80094801, Die Anforderung enthält weder die Erweiterung für die Zertifikatvorlage noch das Anforderungsattribut "CertificateTemplate".
Vorbereitungen
Zunächst wird eine OpenSSL Konfigurationsdatei benötigt, die die wesentlichen Parameter definiert. Beispielkonfiguration (certificate.conf):
oid_section = OIDs
[ OIDs ]
certificateTemplateName = 1.3.6.1.4.1.311.20.2
[ req ]
distinguished_name = req_distinguished_name
encrypt_key = no
prompt = no
string_mask = nombstr
req_extensions = v3_req
[ v3_req ]
subjectAltName = DNS: <FQDN01>, IP: <IP01>, DNS:<FQDN02>, email: <EMAIL01>
certificateTemplateName = ASN1:PRINTABLESTRING:vSphere
[ req_distinguished_name ]
countryName = DE
commonName = <FQDN01>
organizationName = <CompanyName>
organizationalUnitName = <Department>
stateOrProvinceName = NRW
localityName = Bonn
emailAddress = <EMAIL01>
Wichtige Abschnitte der Konfigurationsdatei
oid_section
undOIDs
:
Dieser Abschnitt definiert OIDs (Object Identifiers), die wir verwenden möchten. Der EintragcertificateTemplateName
fügt die OID 1.3.6.1.4.1.311.20.2 zu, die die Windows CA ausliest um das Template zu bestimmen.req
undreq_distinguished_name
:
Diese Abschnitte enthalten allgemeine Informationen und Einstellungen für die Zertifikatsanforderung wie z.B. Schlüssellänge, Distinguished Names (DN) und Erweiterungen.v3_req
:
Hier definieren wir Erweiterungen, die unser CSR enthalten soll, z.B.basicConstraints
,keyUsage
,subjectAltName
und insbesonderecertificateTemplateName
.
Was ist ein certificateTemplateName
?
Diese OID wird von der Windows CA verwendet, um herauszufinden, welches Template für das ausgestellte Zertifikat angewendet werden soll. In unserem Beispiel haben wir certificateTemplateName = ASN1:PRINTABLESTRING:vSphere
definiert, was bedeutet, dass das Template mit dem Namen vSphere
verwendet werden soll.
Erstellen der Zertifikatsanforderung
Mit folgendem OpenSSL Befehl den CSR erstellen:
openssl req -new -newkey ec:<(openssl ecparam -name prime256v1) -keyout ./certificate.key -out ./certificate.csr -config ./certificate.conf
Erklärung des OpenSSL-Befehls:
req
: Startet eine neue Zertifikatsanforderung.-new
: Generiert eine neue Anforderung.-newkey ec:<(openssl ecparam -name prime256v1)
: Erstellt einen neuen ecdsa-Schlüssel mit prime256v1 parameter Datei-keyout ./certificate.key
: Speichert den generierten privaten Schlüssel in der Dateicertificate.key
.-out ./certificate.csr
: Speichert den generierten CSR in der Dateicertificate.csr
.-config ./certificate.conf
: Verwendet die angegebene Konfigurationsdatei.
Nächste Schritte
Nachdem der CSR und der private Schlüssel erstellt wurde, folgt in der Regel:
Einreichen des CSR bei der Windows CA:
Lade die Dateicertificate.csr
auf die Windows CA hoch. Der CA Administrator kann mit dem CSR ein Zertifikat generieren. Durch das Attribut certificateTemplateName wird die Windows CA automatisch das Template mit NamenvSphere
verwenden.Erhalt und Installation des Zertifikats:
Nach der Genehmigung der Zertifikatsanforderung durch die CA wird das signierte Zertifikat ausgestellt. Dieses Zertifikat kann dann auf dem entsprechenden Server installiert werden.
Moin,
danke für die Anleitung. Versuche gerade ein Zertifikat für meine Synology von meinem Windows Server Core zu bekommen, aber es kommt immer dein oben genannter Fehler.
Hatte diese Anleitung benutzt: https://www.frank-schuetz.de/index.php/synology/34-synology-gueltiges-zertifikat-in-einer-domainumgebung-erstellen
Leider kommt der Fehler weiterhin. Hättest du vllt einen Rat?
das ist die cnf (werte geändert):
prüfe ich dann auf dem Windows Server den Request, sieht es gut aus:
liegt es vllt daran, dass ich eine eigene Zertifikatsvorlage benutze mit einem Leerzeichen? Werde das als nächstes testen.
Vielen Dank im Vorraus.
Ist „privat DC“ der Template Name oder der Display Name? Es muss der Template Name in certificateTemplateName. Normalerweise hat der kein Leerzeichen, auch wenn der Display Name ein Leerzeichen hat.
Du kannst dir den Template Namen im „General“ Tab vom Zertifikatstemplate anzeigen lassen.
Verstehe..
Hatte schon zur Sicherheit ein neues Template ohne Leerzeichen erstellt, und dann den CSR neu generiert.
Zusätzlich musste ich aber im Template, im Tab „Antragstellername“ die Option ändern auf „Informationen werden in der Anforderung angegeben“, sonst kam der Fehler:
Vielen Dank für alles 😉