Certificate Signing Request für eine Windows CA mit OpenSSL erstellen

Veröffentlicht von

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

  1. oid_section und OIDs:
    Dieser Abschnitt definiert OIDs (Object Identifiers), die wir verwenden möchten. Der Eintrag certificateTemplateName fügt die OID 1.3.6.1.4.1.311.20.2 zu, die die Windows CA ausliest um das Template zu bestimmen.

  2. req und req_distinguished_name:
    Diese Abschnitte enthalten allgemeine Informationen und Einstellungen für die Zertifikatsanforderung wie z.B. Schlüssellänge, Distinguished Names (DN) und Erweiterungen.

  3. v3_req:
    Hier definieren wir Erweiterungen, die unser CSR enthalten soll, z.B. basicConstraints, keyUsage, subjectAltName und insbesondere certificateTemplateName.

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 Datei certificate.key.
  • -out ./certificate.csr: Speichert den generierten CSR in der Datei certificate.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:

  1. Einreichen des CSR bei der Windows CA:
    Lade die Datei certificate.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 Namen vSphere verwenden.

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

Teile diesen Beitrag

3 Kommentare

  1. 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):

    # openssl configuration file to generate a key pair
    # and a PKCS#10 CSR
    # with included requested SubjectAlternativeNames (SANs)
    
    oid_section = OIDs
    
    [ OIDs ]
    certificateTemplateName = 1.3.6.1.4.1.311.20.2
    
    [ req ]  
    distinguished_name = req_distinguished_name  
    req_extensions     = req_cert_extensions
    prompt             = no
    default_bits       = 4096    # key length 4096 bits RSA
    default_md         = sha512  # message digest algorithm  
    string_mask        = nombstr # permitted characters  
    
    [ req_distinguished_name ]
    C  = DE
    ST = land
    L  = stadt
    O  = privat
    # OU = -
    CN = dc02.test.de
    
    [ req_cert_extensions ]  
    # keyUsage = keyEncipherment, dataEncipherment  
    extendedKeyUsage = serverAuth  
    subjectAltName = @alt_name
    certificateTemplateName = ASN1:PRINTABLESTRING:privat DC
     
    [ alt_name ]
    # SANs of type DNS
    DNS.1 = dc02.test.de
    DNS.2 = dc02
    # SANs of type IP, normally not needed
    IP.1 = 192.168.100.12
    

    prüfe ich dann auf dem Windows Server den Request, sieht es gut aus:

    > certutil C:\CSR\server.csr
    
    PKCS10-Zertifikatanforderung:
    Version: 1
    Antragsteller:
        CN=dc02.test.de
        O=privat
        L=stadt
        S=land
        C=DE
      Namenshash (sha1): e2...88
      Namenshash (md5): 0a..3b
    
    Öffentlicher Schlüssel-Algorithmus:
        Algorithmus Objekt-ID: 1.2.840.113549.1.1.1 RSA (RSA_SIGN)
        Algorithmusparameter:
        05 00
    Länge des öffentlichen Schlüssels: 4096 Bits
    Öffentlicher Schlüssel: Nicht verwendete Bits = 0
        0000  30 ...
        ... 0200 ... ca
    Anforderungsattribute: 1
      1 Attribute:
    
      Attribut[0]: 1.2.840.113549.1.9.14 (Zertifikaterweiterungen)
        Wert [0][0], Länge = 65
    Zertifikaterweiterungen: 3
        2.5.29.37: Kennzeichen = 0, Länge = c
        Erweiterte Schlüsselverwendung
            Serverauthentifizierung (1.3.6.1.5.5.7.3.1)
    
        2.5.29.17: Kennzeichen = 0, Länge = 2e
        Alternativer Antragstellername
            DNS-Name=dc02.test.de
            DNS-Name=dc02
            IP-Adresse=192.168.100.12
    
        1.3.6.1.4.1.311.20.2: Kennzeichen = 0, Länge = 8
        Zertifikatvorlagenname (Zertifikattyp)
            privat DC
    
    Signaturalgorithmus:
        Algorithmus Objekt-ID: 1.2.840.113549.1.1.13 sha512RSA
        Algorithmusparameter:
        05 00
    Signatur: Nicht verwendete Bits=0
        0000  4f ...
        ... 01f0 ... 41
    Signatur stimmt mit dem öffentlichen Schlüssel überein.
    Schlüssel-ID-Hash(rfc-sha1): 9b..20
    Schlüssel-ID-Hash(sha1): 40..e4
    Schlüssel-ID-Hash(bcrypt-sha1): 81..0a
    Schlüssel-ID-Hash(bcrypt-sha256): 0a..e3
    CertUtil: -dump-Befehl wurde erfolgreich ausgeführt.
    

    liegt es vllt daran, dass ich eine eigene Zertifikatsvorlage benutze mit einem Leerzeichen? Werde das als nächstes testen.

    Vielen Dank im Vorraus.

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

      1. 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:

        Der DNS-Name ist nicht verfügbar und kann dem Subjektalternativnamen nicht hinzugefügt werden. 0x8009480f (-2146875377 CERTSRV_E_SUBJECT_DNS_REQUIRED)

        Vielen Dank für alles 😉

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert