---
title: "Certificate Signing Request für eine Windows CA mit OpenSSL erstellen"
id: "2434"
type: "post"
slug: "certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen"
published_at: "2024-08-02T18:40:44+00:00"
modified_at: "2024-08-02T18:42:12+00:00"
url: "https://www.geekbundle.org/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen/"
markdown_url: "https://www.geekbundle.org/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen.md"
excerpt: "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 Template genutzt werden soll."
taxonomy_category:
  - "Linux"
taxonomy_post_tag:
  - "openssl"
  - "zertifikate"
---

Table of Contents

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.

**Ähnliche Beiträge**- [Zertifikate mit OpenSSL config erstellen](https://www.geekbundle.org/zertifikate-mit-openssl-config-erstellen/)
- [TLS / HTTP Protokoll und Cipher Suite Verbreitung](https://www.geekbundle.org/tls-http-protokoll-und-cipher-suite-verbreitung/)
- [Visual Studio Code unter Windows mit SSH Agent nutzen](https://www.geekbundle.org/visual-studio-code-unter-windows-mit-ssh-agent-nutzen/)
- [TLS / HTTP Protokoll und Cipher Suite Usage August 2018](https://www.geekbundle.org/tls-http-protokoll-und-cipher-suite-usage-august-2018/)

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](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. [Antworten](https://www.geekbundle.org/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen/?replytocom=1516#respond)
  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. [Antworten](https://www.geekbundle.org/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen/?replytocom=1517#respond)
    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 😉 [Antworten](https://www.geekbundle.org/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen/?replytocom=1518#respond)

### Kommentar hinterlassen [Antwort abbrechen](/certificate-signing-request-fuer-eine-windows-ca-mit-openssl-erstellen/#respond)
