Links:
OpenSSL Handbuch
Perfect Forward Secrecy (PFS) - Postfix unf Dovecot
Nginx
SSL TestPages:
SSLLabs - SSL Server Test
https://observatory.mozilla.org/analyze.html?host=www.heise.de - Mozilla Sicherheitscheck für WebServer
SSL Analyse mit Python Script sslyze
Trustcenter:
CAcert - Root Zertifikat ist nicht im InternetBrowser enthalten
Datei | Beschreibung |
---|---|
.pfx | PKCS#12, kann öffentliche Zertifikate und private Schlüssel (Kennwort-geschützt) enthalten. |
.p12 | PKCS#12, kann öffentliche Zertifikate und private Schlüssel (Kennwort-geschützt) enthalten. |
.pem | Base64-kodiertes Zertifikat, umschlossen von „-----BEGIN CERTIFICATE-----“ und „-----END CERTIFICATE-----“ |
.p7b | PKCS#7-signierte Datenstruktur ohne Dateninhalt, nur mit Zertifikat(en) oder Zertifikatsperrliste(n) |
.p7c | PKCS#7-signierte Datenstruktur ohne Dateninhalt, nur mit Zertifikat(en) oder Zertifikatsperrliste(n) |
.der | DER-kodiertes Zertifikat |
.cer | DER- oder Base64-kodiertes Zertifikat |
.crt | DER- oder Base64-kodiertes Zertifikat |
Domain-Validierung (DV) - Zertifikat gehört der Domain, Betreiber wird nicht geprüft. Niedrige Sicherheitsanforderungen, Schloss Symbol wird im Browser gezeigt, im Zertifikat unter Organisation (O) ist nichts verzeichnet.
Organization Validation (OV) - Unternehmen die das Zertifikat ausstellen läst, muss in einem Unternehmensregister verzeichnet sein. Mittlere Sicherheitsanforderungen, Schloss Symbol wird im Browser gezeigt, im Zertifikat unter Organisation (O) ist der Besitzer eingetragen.
Extended Validation (EV) - Hohe Sicherheitsanforderungen, Schloss Symbol wird im Browser gezeigt und der Name der Organisation neben dem Schloss, im Zertifikat unter Organisation (O) und Organisationseinheit (OU) ist der Besitzer eingetragen. Wildcard-Zertifikate für die gesamte Domain sind nicht möglich.
Datei | Beschreibung |
---|---|
server_key.pem | private Schlüssel des Zertifikates |
server.csr | Certificate Signing Request (Zertifikatsregistrierungsanforderung), kann gelöscht werden |
server.crt | öffentliche Zertifikat |
- privaten Schlüssel des Zertifikates erstellen
openssl genrsa -out server_key.pem 2048
- Zertifikat erstellen
openssl req -new -key server_key.pem -out server.csr
Country Name (2 letter code) [DE]: State or Province Name (full name) [Germany]: Locality Name (eg, city) [Springfield]: Organization Name (eg, company) [(c) Local.zz]: Organizational Unit Name (eg, section) [Local CA]: Common Name (eg, YOUR name) [host.domain.tld]: Email Address [ca@local.zz]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
wichtig ist der "Common Name", hier muss der "fully qualified domain name" (FQDN) eingetragen werden. z.B. bei einem Web-Server "www.domain.tld" oder bei einem Mail-Server "mail.domain.de" oder der DynDNS Name des Servers "host.dyndns.org".
"A challenge password" und "optional company name" kann man frei lassen.
- Zertifikat signieren
openssl x509 -req -days 3650 -in server.csr -out server.crt -signkey server_key.pem
Parameter
days 3650 - Gültigkeit des Zertifikates (10 Jahre)
- MS konformes PFX Zertifikat erstellen
openssl pkcs12 -export -inkey server_key.pem -in server.crt -out server.pfx
- Multidomain Zertifikat (SAN) erstellen siehe SAN
openssl x509 -req -days 3650 -in server.csr -signkey server_key.pem -text -extfile /etc/ssl/x509v3.cnf \ -extensions x509v3_FQDN2 -out server.crt
PFX Datei für den Windows Import nach "Vertrauenswürdige Stammzertifizierungsstellen" erstellen.
openssl pkcs12 -export -inkey server_key.pem -in server.crt -out server.pfx
- Daten zum Zertifikat anzeigen
openssl x509 -noout -text -in server.crt
Konfigurationsdatei /etc/ssl/openssl.cnf
/usr/lib/ssl/openssl.cnf
ist ein Symlink auf /etc/ssl/openssl.cnf
Datei | Beschreibung |
---|---|
./CA/private/cakey.pem | private Schlüssel der CA |
./CA/cacert.pem | öffentliche Zertifikat der CA |
newreq.pem | temporäre Datei der Zertifikatserstellung, kann gelöscht werden |
newkey.pem | private Schlüssel des Server Zertifikates |
newcert.pem | CA signiertes Server Zertifikat |
1. Einträge in der openssl.cnf ändern
Parameter | Wert |
---|---|
[ CA_default ] | |
default_days | = 1825 |
default_md | = sha256 |
[ req ] | |
default_bits | = 4096 |
[ req_distinguished_name ] | |
dir | =./CA |
default_days | = 3650 |
default_bits | = 2048 |
countryName_default | = DE |
stateOrProvinceName_default | = Germany |
localityName_default | = Springfield |
0.organizationName_default | = (c) Local.zz |
organizationalUnitName_default | = Local CA |
commonName_default | = host.domain.tld |
emailAddress_default | = ca@local.zz |
2. in ein Verzeichnis wechseln, wo dann die neue CA erstellt werden soll.
cd /etc/ssl
3. eine neue CA erstellen (es wird ein Unterordner demoCA erstellt, je nach Einstellung in der /usr/lib/ssl/misc/CA.sh
kann auch geändert werden)
/usr/lib/ssl/misc/CA.sh -newca
CA certificate filename (or enter to create) Making CA certificate ... Generating a 2048 bit RSA private key .................................+++ ..................................................................................................+++ writing new private key to './CA/private/./cakey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [DE]: State or Province Name (full name) [Germany]: Organization Name (eg, company) [(a) Local.zz]: Organizational Unit Name (eg, section) [(a) LocalCA]: Common Name (e.g. server FQDN or YOUR name) [host.domain.tld]:(a) Local.zz CA Email Address [ca@local.zz]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./CA/private/./cakey.pem:
(a) vor der Organisation soll dazu dienen, das das Zertifikat in der Zertifikatsliste immer oben steht.
das Script zum erstellen der CA ist unter /usr/lib/ssl/misc/CA.sh
, oder
als Perlscript /usr/lib/ssl/misc/CA.pl
, wenn man aus den Sourcen
installiert hat, liegen die Scripte unter /usr/local/ssl/misc
- PassPhrase für die CA setzen. Diese wird später beim signieren der Zertifikate benötigt.
Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
- die vorher definierte PassPhrase eingeben, dann wird die CA erstellt.
./CA/private/cakey.pem - private Schlüssel der CA
./CA/cacert.pem - öffentliche Zertifikat der CA, das CA-Zertifikat
muss auf jeden Rechner kopiert werden, der Zertifikate verifizieren soll, die
von der CA ausgestellt wurden. Der Privat-Key der CA darf niemals das privat
Verzeichnis verlassen und muss root gehören und nur durch root lesbar sein.
Enter pass phrase for ./CA/private/./cakey.pem:
4. Zugriffsrechte setzen
chmod -R 0700 /etc/ssl/CA
1. in das Arbeitsverzeichnis wechseln
cd /etc/ssl
2. neues Zertifikat für einen Server erstellen, Datei newreq.pem
und newkey.pem
(PrivateKey) werden angelegt.
!!! Wichtig
unter Common Name den vollqualifizierten Domainnamen des Servers angeben !!!.
/usr/lib/ssl/misc/CA.sh -newreq
Generating a 2048 bit RSA private key .............+++ ..............+++ writing new private key to 'newkey.pem' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ... Common Name (e.g. server FQDN or YOUR name) [host.domain.tld]:server.domain.tld ...
Enter PEM pass phrase: - PassPhrase für den PrivateKey eingeben
!!! kann nicht leergelassen werden !!!, sonst muss beim starten des Servers, das Kennwort des Zertifikates eingegeben werden.
3. erstelltes Zertifikat newreq.pem
signieren, Datei newcert.pem
wird erstellt
/usr/lib/ssl/misc/CA.sh -sign
Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./CA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details:
Enter pass phrase for ./CA/private/cakey.pem: - PassPhrase der vorher erstellten CA eingeben.
Details zum Zertifikat werden angezeigt.
4. Zertifikat vom PEM nach PFX umwandeln
openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out server.pfx
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout root-cakey.pem -out root-cacert.pem \ -config /etc/ssl/openssl.cnf -newkey rsa:4096
openssl req -new -nodes -out server-csr.pem -keyout server-key.pem -newkey rsa:4096
openssl x509 -req -days 1825 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial \ -in server-csr.pem -out server-cert.pem
openssl pkcs12 -export -out server-cert.pfx -inkey server-key.pem -in server-cert.pem \ -certfile root-cacert.pem -name "srv.domain.tld"
server-cert.pfx - PFX Server Zertifikat root-cacert.pem - CA Zertifikat
Punkt 1 und 2 wie oben
/etc/ssl/x509v3.cnf
openssl x509 -req -extfile /etc/ssl/x509v3.cnf -extensions x509v3_FQDN2 -CAkeyform server-key.pem -CAform root-cacert.pem \ -signkey server-key.pem -in server-csr.pem -out server.crt
openssl x509 -days 1825 -CA root-cacert.pem -CAkey root-cakey.pem -CAcreateserial \ -in server.crt -out server-cert.pem
openssl pkcs12 -export -out server-cert.pfx -inkey server-key.pem -in server-cert.pem \ -certfile root-cacert.pem -name "srv.domain.tld"
server-cert.pfx - PFX Server Zertifikat root-cacert.pem - CA Zertifikat
- Zertifikate ins Apache Verzeichnis kopieren
cd /etc/ssl cp newcert.pem /etc/apache2/ssl/host.domain.tld.pem cp newkey.pem /etc/apache2/ssl/host.domain.tld.key cp CA/cacert.pem /etc/apache2/ssl/cacert.pem chmod 700 -R /etc/apache2/ssl
beim jedem Start/Restart des Apache Servers wird das Passwort des PrivateKeys der newkey.pem
bzw. host.domain.tld.key
abgefragt.
- PassPhrase aus der Key Datei entfernen
cd /etc/apache2/ssl/ openssl rsa -in host.domain.tld.key -out host.domain.tld.new.key mv host.domain.tld.key host.domain.tld.old.key mv host.domain.tld.new.key host.domain.tld.key service apache2 restart
- Apache Server Konfiguration anpassen
SSL Modul aktivieren
a2enmod ssl
vHost Konfigurationsdatei anpassen
#/etc/apache2/sites-enabled/vhost NameVirtualHost *:443 <VirtualHost *:443 > ... # SSL aktivieren SSLEngine on SSLCertificateFile /etc/apache2/ssl/host.domain.tld.pem # Signiertes Server Zertifikat SSLCertificateKeyFile /etc/apache2/ssl/host.domain.tld.key # Privater Server Schlüssel SSLCACertificateFile /etc/apache2/ssl/cacert.pem # CA Zertifikat </VirtualHost>
durch den Parameter SSLCACertificateFile
wird das Zertifikat der CA dem Browser gleich mitgeliefert. Mit Firefox kann man dann auf Zertifikat herunterladen | Ansehen | Details unter Zertifizierungsherarchie die CA markieren und Export wählen. Das gespeicherte Zertifikat unter Einstellungen | Erweitert | Zertifikate | Zertifikate anzeigen | Zertifizierungsstellen dort Importieren wählen. Danach werden allen Zertifikaten der CA vertraut. Beim IE und Chrome geht das nur wenn man den Browser als Administrator startet, die HTTPS Seite aufrufen | Laden der Webseite fortsetzen | in der Adressleite auf Zertifikate | Zertifikate anzeigen | Zertifizierungspfad | CA markieren | Zertifikate anzeigen | Zertifikat installieren | Vertrauenswürdige Stammzertifizierungsstellen wählen.
In der /etc/apache2/mods-enabled/ssl.conf
muß auch noch folgende Parameter gesetzt sein (ist aber Standard).
<IfModule mod_ssl.c> ... AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl ... </IfModule>
Apache Server neustarten
service apache2 restart
- /etc/ssl/CA/cacert.pem
(Zertifikat der CA) alle für den Browser nicht benötigten Informationen aus dem Zertifikat entfernen.
openssl x509 -in /etc/ssl/CA/cacert.pem -out /etc/ssl/cacert.crt
die Datei cacert.crt
speichern, diese kann dann im Browser in den Zertifikatsspeicher unter Vertrauenswürdige Stammzertifizierungsstellen
oder bei Firefox als Zertifizierungsstellen
importiert werden.
- ins OpenSSL Verzeichnis wechseln und die CA erstellen.
cd /etc/ssl /usr/lib/ssl/misc/CA.sh -newca
- Zertifikat für den Server erstellen, als CN wird nur der erste Host aus der Multidomain Liste eingetragen
/usr/lib/ssl/misc/CA.sh -newreq Generating a 2048 bit RSA private key ... Common Name:host.local.zz ...
- Datei x509v3.cnf
erstellen, das Zertifikat mit den SAN Hosts erweitern und von der CA signieren lassen.
# /etc/ssl/x509v3.cnf # zur Erstellung eines Multidomain Zertifikates (SAN) # CERTFQDN1 = host.local.zz CERTFQDN2 = srv.local.zz CERTFQDN3 = remote.host.de CERTFQDN4 = autodiscover.host.de [x509v3_FQDN2] subjectAltName=DNS:$ENV::CERTFQDN1,DNS:$ENV::CERTFQDN2,DNS:$ENV::CERTFQDN3,DNS:$ENV::CERTFQDN4
openssl ca -policy policy_anything -extfile x509v3.cnf -extensions x509v3_FQDN2 -out server.crt -infiles newreq.pem
- Server Zertifikat umwandeln
openssl pkcs12 -export -inkey newkey.pem -in server.crt -out server.pfx
- öffentliches Zertifikat der CA als PFX / P12 speichern
openssl pkcs12 -export -nokeys -in CA/cacert.pem -out cacert.pfx
Die Datei cacert.pfx
unter Windows nach "Vertrauenswürdige Stammzertifizierungsstellen" importieren.
- Diffie-Hellman Zertifikat erstellen
openssl dhparam -outform PEM -out dhparam2048.pem 2048
öffentliches und privates Zertifikat konvertieren
openssl pkcs12 -export -in newcert.pem -inkey newkey.pem -out certificate.p12
nur öffentliches Zertifikat konvertieren
openssl pkcs12 -export -nokeys -in CA/cacert.pem -out cacert.p12
öffentliches und privates Zertifikat von der CA zertifiziert konvertieren ins PKCS12 Format
openssl pkcs12 -export -inkey newkey.pem -in server.crt -certfile CA/cacert.pem -out server.pfx
öffentliches Zertifikat der CA konvertieren
openssl x509 -outform der -in CA/cacert.pem -out cacert.der
oder
openssl enc -d -base64 CA/cacert.pem -out cacert.der
öffentliches Client Zertifikat exportieren
openssl pkcs12 -nokeys -clcerts -in server.pfx -out siteclientcert.pem
öffentliches CA Zertifikat exportieren
openssl pkcs12 -nokeys -cacerts -in server.pfx -out cacert.pem
nur den private Key des Zertifikates exportieren
openssl pkcs12 -nocerts -in server.pfx -out sitekey.pem
- Zertifikat komplett anzeigen
openssl x509 -noout -text -in server.crt
- Subject Zeile des Zertifikates anzeigen
openssl x509 -noout -subject -in CA/cacert.pem
- Herausgeber des Zertifikates anzeigen
openssl x509 -noout -issuer -in <zertifikat.pem>
Herausgeber, Empfänger/Host, Datum/Zeitraum der Gültigkeit
openssl x509 -noout -issuer -subject -dates -in <zertifikat.pem>
echo -e 'HEAD /\n' | openssl s_client -connect mail.domain.tld:993 | openssl x509 -noout -dates
Gültigkeit des Zertifikates eines entfernten Servers anzeigen, im Beispiel eines IMAP Servers
echo QUIT | openssl s_client -connect mail.domain.tld:993 2>/dev/null | sed -ne '/BEGIN CERT/,/END CERT/p' \ | openssl x509 -noout -text | grep -A2 Validity
- Zertifikat überprüfen
openssl verify -CAfile /etc/ssl/CA/cacert.pem -verbose server.crt
- SSL Verbindungen testen, im Beispiel Clientverbindung HTTPS
openssl s_client -connect host.domain.tld:443
man kann damit auch SMTP, IMAP, POP3 u.a. testen.
openssl s_client -connect host.domain.tld:587
openssl s_client -connect host.domain.tld:993
openssl s_client -connect host.domain.tld:995
- SSL Verbindung vom Server testen, Beispiel HTTPS, Zertifikatsdateien müssen angegeben werden, Standardmäßig wird nur nach server.pem
gesucht.
openssl s_server -accept 443 -key host.domain.tld.key -cert host.domain.tld.pem
openssl req -newkey rsa:2048 -subj /CN=www.domain.tld -nodes -keyout www.domain.tld_key_.pem \ -out www.domain.tld.csr.pem cat www.domain.tld.csr.pem
alles ab "-----BEGIN CERTIFICATE-----" bis "-----END CERTIFICATE-----" kopieren und in die Server Zertifikatsmaske des Trustcenters einfügen.
- Zertifikate des Servers anzeigen
openssl s_client -connect www.domain.tld:443 -showcerts ... SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES256-GCM-SHA384 ...
TLSv1.2 - Protokoll
ECDHE - Schlüsselaustausch (Key Agreement), Elliptische Kurven basierend auf Diffie Hellman
RSA - Authentifizierung des Servers (Authentication)
AES256-GCM - Symmetrische Verschlüsselung und Schlüssellänge (Symmetric Cipher and Key Size)
SHA384 - Hash Funktion zur Nachrichtenauthentifizierung (Hash Algorithm for Message Authentication)
- Zertifikatsausgabe wird unterdrückt
openssl s_client -connect www.domain.tld:https -quiet
- Verbindung auf TLSv1 Protokoll beschränken
openssl s_client -connect www.domain.tld:443 -tls1 ... SSL-Session: Protocol : TLSv1 Cipher : ECDHE-RSA-AES256-SHA
Protokolle die als Parameter angegeben werden können
-ssl2 - just use SSLv2 -ssl3 - just use SSLv3 -tls1_2 - just use TLSv1.2 -tls1_1 - just use TLSv1.1 -tls1 - just use TLSv1 -dtls1 - just use DTLSv1 -fallback_scsv - send TLS_FALLBACK_SCSV -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol
- Cipher Suite vorgeben
openssl s_client -connect www.domain.tld:443 -cipher 'ECDH:DH'
- STARTTLS Verbindungen prüfen
openssl s_client -connect mail.domain.tld:587 -starttls smtp openssl s_client -connect mail.domain.tld:995 -starttls pop3 openssl s_client -connect mail.domain.tld:993 -starttls imap openssl s_client -connect ftp.domain.tld:22 -starttls ftp
- Laufzeit des Zertifikates anzeigen
openssl s_client -connect mail.domain.tld:587 -starttls smtp 2>&- | openssl x509 -enddate -noout
- die Datei host.domain.tld.key noch editieren und
-----BEGIN CERTIFICATE REQUEST----- -----END CERTIFICATE REQUEST----- ersetzen durch -----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----