Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
lpi2:ssl [2014/06/30 10:54] ingo_wichmann [Links and Doku] |
lpi2:ssl [2024/03/21 16:48] (aktuell) sven_ruess [Selbstsignierte Server Zertifikate bauen] |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | TODO: Lösung auf Basis von CFSSL, Boulder oder Consul evaluieren (( https://www.heise.de/select/ix/2019/1/1545992707007070 )) | ||
+ | |||
+ | ====== Links ====== | ||
+ | * [[https://crt.sh|Log aller ausgestellten Zertifikate]] | ||
+ | |||
====== OpenSSL ====== | ====== OpenSSL ====== | ||
+ | ===== Diffie Hellman Schlüsselaustausch vorbereiten ===== | ||
+ | DH-Parameter erzeugen: ((https://bettercrypto.org empfiehlt 4096 Bit)) | ||
+ | openssl dhparam -2 -out /etc/ssl/dhparams.pem | ||
+ | |||
+ | DH-Parameter ansehen: | ||
+ | openssl dhparam -text -in /etc/ssl/dhparams.pem | ||
+ | |||
+ | Aufgabe: | ||
+ | * welche Bitlänge haben die Diffie Hellman Parameter? | ||
+ | |||
+ | Doku: | ||
+ | * https://blog.zeit.de/mathe/allgemein/daten-verschluesselung-mathe/ | ||
+ | * https://weakdh.org/sysadmin.html | ||
===== Selbstsignierte Server Zertifikate bauen ===== | ===== Selbstsignierte Server Zertifikate bauen ===== | ||
- | ''/etc/ssl/openssl.cnf'' : ( SuSE 10.2, Debian 4.0 ) | ||
- | ''/etc/pki/tls/openssl.cnf'' : ( CentOS 5 ) | + | openssl req -new -newkey rsa:4096bits -sha512 -x509 -nodes -subj /C=DE/ST=NRW/L=Essen/O=Linuxhotel/CN=notebook15.linuxhotel.de -keyout server.key -out server.crt |
- | <file> | + | |
- | [ req_distinguished_name ] | + | |
- | countryName_default = DE | + | |
- | stateOrProvinceName_default = NRW | + | |
- | localityName_default = Essen | + | |
- | </file> | + | |
- | openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout serverkey.pem -out servercert.pem | + | ((https://bettercrypto.org empfiehlt 4096 Bit)) |
- | + | ||
- | <file> | + | |
- | Country Name (2 letter code) [DE]: | + | |
- | State or Province Name (full name) [NRW]: | + | |
- | Locality Name (eg, city) [Essen]: | + | |
- | Organization Name (eg, company) [Linuxhotel]: | + | |
- | Organizational Unit Name (eg, section) []: | + | |
- | Common Name (eg, YOUR name) []:notebook07.linuxhotel.de | + | |
- | Email Address []:nutzer07@notebook07.linuxhotel.de | + | |
- | </file> | + | |
Schlüssel ansehen: | Schlüssel ansehen: | ||
openssl rsa -in serverkey.pem -text | openssl rsa -in serverkey.pem -text | ||
+ | |||
+ | Aufgaben: | ||
+ | * welche Länge hat der Schlüssel? | ||
+ | * wie lässt sich ein ECDSA Schlüssel erzeugen? | ||
Zertifikat ansehen: | Zertifikat ansehen: | ||
Zeile 30: | Zeile 35: | ||
===== Server Zertifikat und CA selbst bauen ===== | ===== Server Zertifikat und CA selbst bauen ===== | ||
- | ==== Als root Vorgabewerte setzen ==== | + | ==== nutzer ca anlegen ==== |
- | ''/etc/ssl/openssl.cnf'' : ( SuSE 10.2, Debian 4.0 ) | + | useradd -s /bin/bash -m ca |
+ | ==== Als Nutzer ca eine Beispiel CA erstellen ==== | ||
+ | TODO: ca und intermediate-ca bauen. ca signiert nur intermediate-ca. intermediate-ca signiert server-zertifikate. | ||
+ | |||
+ | ''/etc/ssl/openssl.cnf'' : ( SuSE 10.2, ab Debian 4.0 ) | ||
- | ''/etc/pki/tls/openssl.cnf'' : ( CentOS 5 ) | + | ''/etc/pki/tls/openssl.cnf'' : ( ab CentOS 5 ) |
die folgenden Zeilen anpassen | die folgenden Zeilen anpassen | ||
Zeile 39: | Zeile 48: | ||
[ ca ] | [ ca ] | ||
default_ca = CA_default | default_ca = CA_default | ||
+ | |||
+ | … | ||
[ CA_default ] | [ CA_default ] | ||
dir = ./ca.linuxhotel.de | dir = ./ca.linuxhotel.de | ||
certs = $dir/certs | certs = $dir/certs | ||
+ | crl_dir = $dir/crl | ||
database = $dir/index.txt | database = $dir/index.txt | ||
new_certs_dir = $dir/newcerts | new_certs_dir = $dir/newcerts | ||
Zeile 50: | Zeile 62: | ||
default_days = 365 | default_days = 365 | ||
- | [ req_distinguished_name ] | + | … |
- | countryName = Country Name (2 letter code) | + | |
- | countryName_default = DE | + | # TODO: brauchen wir das? |
- | stateOrProvinceName = State or Province Name (full name) | + | #[ policy_match ] |
- | stateOrProvinceName_default = NRW | + | #countryName = optional |
- | localityName = Locality Name (eg, city) | + | #stateOrProvinceName = optional |
- | localityName_default = Essen | + | #organizationName = optional |
- | 0.organizationName = Organization Name (eg, company) | + | |
- | 0.organizationName_default = Linuxhotel | + | … |
+ | |||
+ | [ v3_ca ] | ||
+ | … | ||
+ | basicConstraints = critical,CA:false | ||
</file> | </file> | ||
- | useradd -s /bin/bash -m ca | + | Verzeichnisse und Dateien für die CA: |
- | ==== Als Nutzer ca eine Beispiel CA erstellen ==== | + | |
- | Verzeichnisse und Dateien fuer die CA: | + | |
su - ca | su - ca | ||
mkdir -p ca.linuxhotel.de/{private,newcerts} | mkdir -p ca.linuxhotel.de/{private,newcerts} | ||
Zeile 70: | Zeile 84: | ||
echo 01 > serial | echo 01 > serial | ||
- | Erzeugen eines Schluessels fuer die CA: | + | Erzeugen eines Schluessels fuer die CA: ((https://bettercrypto.org empfiehlt 4096 Bit)) |
- | openssl genrsa -aes256 -out private/cakey.pem 4096 | + | openssl genrsa -aes256 -out private/cakey.pem 2048 |
Erzeugen eines selbstsignierten Root-CA-Zertifikats: | Erzeugen eines selbstsignierten Root-CA-Zertifikats: | ||
- | openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem | + | openssl req -new -x509 -sha512 -days 3650 -key private/cakey.pem -out cacert.pem |
<file> | <file> | ||
Common Name (eg, YOUR name) []:ca.linuxhotel.de | Common Name (eg, YOUR name) []:ca.linuxhotel.de | ||
Zeile 88: | Zeile 102: | ||
mkdir server-ssl | mkdir server-ssl | ||
- | Antrag und Schluessel fuer Server erzeugen: | + | Antrag und Schluessel fuer Server erzeugen: ((https://bettercrypto.org empfiehlt 4096 Bit)) |
- | openssl req -new -newkey rsa:2048 -nodes -sha256 -keyout server-ssl/serverkey.pem -out server-ssl/serverreq.csr | + | openssl genrsa -out server-ssl/serverkey.pem 2048 |
- | (( Todo: ''-subj /CN=<your sever's address here>'' )) | + | openssl req -new -key server-ssl/serverkey.pem -out server-ssl/serverreq.csr |
+ | oder | ||
+ | openssl req -new -newkey rsa:2048 -nodes -sha512 -keyout server-ssl/serverkey.pem -out server-ssl/serverreq.csr | ||
+ | oder | ||
+ | openssl req -new -newkey rsa:2048 -nodes -sha512 -subj /C=DE/ST=NRW/L=Essen/O=Linuxhotel/CN=notebook15.linuxhotel.de -keyout server-ssl/serverkey.pem -out server-ssl/serverreq.csr | ||
+ | (( TODO: mit ''-subj'' wird der Befehl nicht-interaktiv (d.h. keine Rückfragen), Beispiel: | ||
+ | ''-subj /C=DE/ST=NRW/L=Essen/O=Linuxhotel/CN=<your sever's address here>'' | ||
+ | ^Feld ^ Bedeutung ^ Beispiel ^ | ||
+ | |/C= | Country/Staat | DE | | ||
+ | |/ST= | State/Bundesland | NRW | | ||
+ | |/L= | Location/Ort | Essen | | ||
+ | |/O= | Organization/Handelsname | Linuxhotel | | ||
+ | |/OU= | Organizational Unit | Schulungs lab | | ||
+ | |/CN= | Common Name | example.com | | ||
+ | )) | ||
<file> | <file> | ||
Common Name (eg, YOUR name) []:notebook32.linuxhotel.de | Common Name (eg, YOUR name) []:notebook32.linuxhotel.de | ||
Email Address []:root@notebook32.linuxhotel.de | Email Address []:root@notebook32.linuxhotel.de | ||
</file> | </file> | ||
+ | |||
+ | Im Feld "Common Name" muss der korrekte DNS-Name des Servers eingetragen werden. Für Wildcard-Zertifikate muss an Stelle des Hostnamens ein ''*'' (z.B. ''*.example.com'') eingetragen werden. Soll das Wildcard-Zertifikat zusätzlich auch die übergeordnete Domain (z.B. ''example.com'') abdecken, dann muss man diesen Namen als ''subjectAltName'' hinzufügen, wie [[apache-ssl#ssl_tls_und_name_based_virtual_hosts]] beschrieben. | ||
+ | |||
+ | Version 1.1.1 von openssl verspricht mit dem Schalter ''-addext 'subjectAltName = DNS:*.notebook15.linuxhotel.de, DNS:notebook15.linuxhotel.de' '' erstmals eine übersichtliche Lösung für das Problem (TODO: testen). Bis dahin brauchen wir für den Request eine eigene Konfigurationsdatei: | ||
+ | <file txt subjectAltName-openssl.cnf> | ||
+ | [req] | ||
+ | prompt = no | ||
+ | req_extensions = ext | ||
+ | distinguished_name = dn | ||
+ | |||
+ | [dn] | ||
+ | CN=z22.test | ||
+ | C=DE | ||
+ | ST=NRW | ||
+ | L=Essen | ||
+ | O=Linuxhotel | ||
+ | |||
+ | [ext] | ||
+ | subjectAltName = DNS:*.z22.test,DNS:z22.test | ||
+ | </file> | ||
+ | openssl req -new -newkey rsa:2048 -nodes -sha512 -config subjectAltName-openssl.cnf -keyout server-ssl/serverkey.pem -out server-ssl/serverreq.csr | ||
Pruefen ob Antrag und Schlüssel ok sind: | Pruefen ob Antrag und Schlüssel ok sind: | ||
Zeile 106: | Zeile 155: | ||
==== Als Nutzer ca das Server-Zertifikat unterschreiben ==== | ==== Als Nutzer ca das Server-Zertifikat unterschreiben ==== | ||
+ | Aus ''man 8 ca'': //The ca command is quirky and at times downright unfriendly. | ||
+ | The ca utility was originally meant as an example of how to do things in a CA. It was not supposed to be used as a full blown CA itself// | ||
+ | |||
+ | |||
su - ca | su - ca | ||
openssl ca -in serverreq.csr -out servercert.pem | openssl ca -in serverreq.csr -out servercert.pem | ||
+ | oder mit X509v3 extensions (z.B. für Subject Alternative Name) | ||
+ | openssl ca -extensions v3_ca -in serverreq.csr -out servercert.pem | ||
+ | | ||
Anzeigen des Server-Zertifikats: | Anzeigen des Server-Zertifikats: | ||
openssl x509 -in servercert.pem -text | less | openssl x509 -in servercert.pem -text | less | ||
Zeile 123: | Zeile 178: | ||
//openssl s_server muss noch laufen// | //openssl s_server muss noch laufen// | ||
openssl s_client -connect localhost:4433 -CAfile /home/ca/ca.linuxhotel.de/cacert.pem | openssl s_client -connect localhost:4433 -CAfile /home/ca/ca.linuxhotel.de/cacert.pem | ||
+ | |||
+ | |||
+ | |||
+ | === in der Praxis === | ||
+ | Audit-Tools: | ||
+ | sslscan linuxhotel.de | ||
+ | testssl.sh linuxhotel.de | ||
+ | |||
+ | Automatische Audits helfen die Konfiguration zu verbessern: | ||
+ | |||
+ | * https://en.internet.nl | ||
+ | * https://www.ssllabs.com/ssltest | ||
+ | * https://de.ssl-tools.net/mailservers/sys4.de | ||
+ | * https://dane.sys4.de/ | ||
+ | |||
+ | ===== Zertifikat widerufen ===== | ||
+ | //Todo: noch nicht fertig// | ||
+ | openssl ca -config example_root.conf -gencrl -keyfile privkey.pem \ | ||
+ | -cert example_root.cer -out example_root.crl.pem | ||
+ | openssl crl -inform PEM -in example_root.crl.pem -outform DER -out \ | ||
+ | example_root.crl && rm example_root.crl.pem | ||
+ | su - ca | ||
+ | echo 01 > crl | ||
+ | openssl ca -revoke servercert.pem -keyfile serverkey.pem -cert xxx | ||
===== Client Zertifikate bauen ===== | ===== Client Zertifikate bauen ===== | ||
Zeile 199: | Zeile 278: | ||
Antrag an Nutzer ca senden: | Antrag an Nutzer ca senden: | ||
- | cp newreq.csr /home/ca/ | + | cp newreq.pem /home/ca/ |
+ | (vormals: newreq.csr statt newreq.pem) | ||
==== Als Nutzer ca das Server-Zertifikat unterschreiben ==== | ==== Als Nutzer ca das Server-Zertifikat unterschreiben ==== | ||
Zeile 222: | Zeile 302: | ||
Pakete: ''gnutls-bin gnutls-doc'' | Pakete: ''gnutls-bin gnutls-doc'' | ||
- | === openSuSE 12.1 === | + | === openSuSE (ab 12.1) === |
Pakete: ''gnutls'' | Pakete: ''gnutls'' | ||
+ | |||
+ | ===== Diffie Hellman Schlüsselaustausch vorbereiten ===== | ||
+ | DH-Parameter erzeugen: | ||
+ | certtool --generate-dh-params --outfile /etc/ssl/dhparams.pem | ||
+ | |||
+ | DH-Parameter ansehen: | ||
+ | certtool --dh-info --infile /etc/ssl/dhparams.pem | ||
===== Selbstsignierte Server Zertifikate bauen ===== | ===== Selbstsignierte Server Zertifikate bauen ===== |