Der Albtraum, ein selbstsigniertes SSL-Zertifikat zu erstellen, das funktioniert

Der Albtraum, ein selbstsigniertes SSL-Zertifikat zu erstellen, das funktioniert

Ich habe einen Intranet-Server, auf dem ich ein SSL installieren muss.

Dies ist dasopenssl.cnf

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
attributes              = req_attributes
req_extensions          = req_ext
#prompt = no

[ req_distinguished_name ]
countryName                     = US
countryName_min                 = 2
countryName_max                 = 2
stateOrProvinceName             = CHICAGO
localityName                    = CHICAGO
0.organizationName              = MY COMPANY
organizationalUnitName          = IOS DEVELOPMENT
commonName                      = server2.myserver.local
commonName_max                  = 64
emailAddress                    = [email protected]
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = password
challengePassword_min           = 4
challengePassword_max           = 20

[ req_ext ]
subjectAltName = @alt_names
extendedKeyUsage = serverAuth

[alt_names]
DNS.1   = server2.myserver.local
DNS.2   = myserver.local

Dies sind die Befehle, die ich zum Erstellen verwende.

  1. Generieren des Root-CA-Schlüssels

    openssl genrsa -des3 -out rootCA.key 4096
    

2.Hierdurch wird das Stamm-CA-Zertifikat generiert

openssl req \
    -x509 -new -nodes \
    -key rootCA.key -sha256 \
    -days 825 \
    -out rootCA.crt \
    -subj /CN=server2.myserver.local \
    -reqexts SAN \
    -extensions SAN \
    -config <(cat ./openssl.cnf \
        <(printf '[SAN]\nsubjectAltName=DNS:server2.myserver.local')) \
    -extensions 'req_ext'
  1. Generieren des Zertifikatsschlüssels

    openssl genrsa -out mydomain.com.key 4096
    
  2. Generieren des Zertifikats

    openssl req -new -sha256 -key  mydomain.com.key \
     -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=server2.myserver.local" \
     -reqexts SAN \
     -config <(cat ./openssl.cnf \
         <(printf "\n[SAN]\nsubjectAltName=DNS:server2.myserver.local,DNS:myserver.local")) \
     -out mydomain.com.csr
    
  3. Konvertieren des CA-Zertifikats in p12

    openssl pkcs12 -export -out ca.p12 -inkey rootCA.key -in rootCA.crt  
    
  4. Konvertieren des Zertifikats in P12

    openssl pkcs12 -export -out certificate.p12 -inkey mydomain.com.key -in mydomain.com.crt
    

Dann installiere ich ca.p12es certificate.p12auf meinem IIS-Server und auf meinen Geräten.

Wenn ich versuche zu besuchenserver2.myserver.local

Ich bekomme

Bildbeschreibung hier eingeben

Wie in aller Welt mache ich das?

Antwort1

Ich würde sagen, dass Ihr Stamm-CA-Zertifikat völlig falsch ist. CA-Zertifikate unterscheiden sich stark von TLS-Zertifikaten des Endhosts – Sie können nicht für beide die gleiche Konfiguration verwenden.

  • Geben Sie die Domäne des Servers nicht in den Betreff ein – das ist nutzlos. Wenn es sich um eine Zertifizierungsstelle handelt, sollte dort einfach „ CN=My internal CAoder so ähnlich“ stehen.

  • Fügen Sie die basicConstraintsErweiterung hinzu. Sie muss besagen, dass es sich bei dem Zertifikat um eine Zertifizierungsstelle handelt.

  • Fügen Sie das richtige hinzu keyUsage. Sie benötigen „keyCertSign“ und (nur der Vollständigkeit halber) „cRLSign“.

  • Fügen Sie kein hinzu subjectAltName. Das Zertifikat ist für eine Behörde/einen Aussteller, nicht für den Server!

  • Fügen Sie nicht hinzu extendedKeyUsage. Es wird manchmal verwendet, um einzuschränken, welche Zertifikate die Zertifizierungsstelle ausstellen kann, aber es ist besser, ohne diese Komplexität zu beginnen.

  • Gute Idee, hinzuzufügen subjectKeyIdentifier, für den Fall, dass Sie später mehrere interne CAs mit identischen Betreff-DNs haben. (Normalerweise müssen CA-DNs eindeutig sein, aber mit SKI/AKI wird dies etwas vereinfacht.)

Sie sollten also eine „CA“-Konfigurationsdatei haben, die eher so aussieht (und hören Sie auf, SANs und andere Dinge über die Befehlszeile hinzuzufügen – dafür ist die Konfiguration da):

[ req ]
default_md              = sha256
distinguished_name      = req_distinguished_name
req_extensions          = req_ext

[ req_dn ]
countryName             = US
stateOrProvinceName     = Chicago
organizationName        = Company Name
organizationalUnitName  = iOS development
commonName              = Internal development CA

[ req_ext ]
basicConstraints        = critical, CA:TRUE
keyUsage                = keyCertSign, cRLSign
subjectKeyIdentifier    = hash

Das Endentitätszertifikat (TLS-Server) sollte diese Erweiterungen haben:

...
[ req_ext ]
basicConstraints        = CA:FALSE
keyUsage                = digitalSignature, keyEncipherment
extendedKeyUsage        = serverAuth
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid, issuer
subjectAltName          = DNS:server2.myserver.local

Dann installiere ich ca.p12 und certificate.p12 auf meinem IIS-Server und auf meinen Geräten.

Installieren Sie den privaten Schlüssel der CA nicht auf Ihren Geräten!Installieren Sie es auch nicht auf dem Server. Sie sollten installierennurdas CA-Zertifikat rootCA.crt(der öffentliche Teil) und sonst nichts.


Meine letzte Empfehlung: Verschwenden Sie keine Zeit mit dem Versuch, CAs mit raw zu erstellen openssl. Verwenden Sie stattdessenEinfach-RSA(das mit OpenVPN gelieferte) oder verwenden SieXCA(grafische Linux-App) oder verwenden Sie eine dermöglicherweise Dutzendevon bereits geschriebenen und getesteten Programmen.

verwandte Informationen