IT-Wissen/tls-ssl/README.md
Roger Rutishauser 5081d5137a tls
2024-10-21 12:41:43 +02:00

205 lines
7.4 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
gitea: none
include_toc: true
---
# SSL/TLS
Übersicht: https://www.sslmarket.ch/ssl/formate-von-ssl-zertifikaten-und-ihre
## Windows TLS aktivieren
Unter Windows muss TLS 1.0, TLS 1.1 und TLS 1.2 aktiviert werden. Dies kann in den Internet Options vom Internet Explorer gemacht werden:
![](./img/ssl_tls.png)
## Zertifikat-Dateien umwandeln, bündeln etc.
### Chained Certificate erstellen
Ein Chained Certificate enthält das Server Zertifikat sowie Intermediate-/Root-Zertifikate.
- Falls nur das Server-Zertifikat vorhanden ist, muss das Root- und Intermediate-Zertifikat separat aus dem Browser herunter geladen werden. Bei der Export-Möglichkeit sollte Base-64 codiert im X.509 Standard (.cer) gewählt werden. Die 3 Teile müssen dann wie im nächsten Punkt beschrieben in einer Datei zusammengefasst werden.
- Falls ein "Bundle" (Root- und Intermediate-Zertifikat) und ein Server-Zertifikat separat geliefert wird, muss dies in eine Datei zusammengefügt werden:
1. Position: Server-Zertifikat\
2. Position: Intermediate Zertifikat\
3. Position: Root-Zertifikat.
Abspeichern als <FQDN>.chained.crt.
### PFX erstellen aus Server-Zertifikat und Key
Um das Zertifikat in das gewünschte Format zu bekommen brauch man zuerst die 2 Basis-Dateien:
- Zertifikat ("pem", "cer", "crt" oder andere Dateiendung)
- Der Private Key (oft mit ".key" Dateiendung), welcher mit dem CSR erstellt wird und zu diesem Zertifikat gehört.
Um Intermediate und Root-Zertifikate mit in das PKCS12 aufzunehmen, bedarf es einen einfachen Tricks:
- Server-Zertifikat in PEM Format (Base64 encoded) abspeichern
- Private Key in PEM Format (Base64 encoded) abspeichern
- Server-Zertifikat in Editor öffnen
- Darunter Intermediate und Root Zertifikate einfügen (in dieser Reihenfolge)
- Wir haben nun ein Full Chained Certificate, das wir als .crt abspeichern. 
Nun wir die gebündelte Datei (.crt) und der Privatekey (.key) mit openssl zu einer Datei zusammengefasst zu der .pfx (oder je nach gusto .p12) Datei.
```
openssl pkcs12 -export -in chained.crt -inkey privateekey.key -out output.pfx
```
Die erzeugte p12 Datei enthält jetzt den privaten Schlüssel und das Zertifikat. Der Inhalt wird mit einem Passwort geschützt, das beim Absetzen des Befehls abgefragt wird.
Zu einer bereits bestehenden PKCS12 Datei können die Intermediates mit folgendem Befehl hinzugefügt werden:
```
openssl pkcs12 -export -inkey (Ihr Privatekey).key -in (Ihr Zertifikat).crt -out (Zertifikats Name).p12 -chain -CApath /etc/ssl/certs
```
### Convert PKS12 (.pfx) to Base64
#### Extract the private key from a PFX to a PEM file
```
openssl pkcs12 -in filename.pfx -nocerts -out key.pem # enter any temp passphrase
```
#### Removing the password from the private key
```
openssl rsa -in key.pem -out server.key # <- that is what we need for nginx
```
#### Extract the certificate
```
openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert_only.pem
```
As DER (binary), not PEM. Using PowerShell:
``` Powershell
Get-PfxCertificate -FilePath filename.pfx | Export-Certificate -FilePath cert_only.cer -Type CERT
```
#### Extract the certificate chain (root and intermediate)
```
openssl pkcs12 -in 05-srvingesttst01.pfx -cacerts -nokeys -out cert.pem
```
### Convert Base64 to DER (binary)
Used for cacerts, for example
```
openssl x509 -in cert.crt -outform der -out cert.der
# view:
openssl x509 -in cert.der -inform der -text -noout
```
### Convert DER (binary) to Base64
```
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
# view:
openssl x509 -in cert.pem -text -noout
```
## IIS (Windows)
- PFX Datei in IIS importieren
- altes Zertifikat entfernen
- Bindings prüfen und allenfalls anpassen
## Nginx (Linux)
Die `.key` und `*.chained.crt` Dateien können wie hier beschrieben für die Konfiguration verwendet werden.
## Cacerts / Java
### Truststore
`javax.net.ssl.trustStore`, der Truststore für CA-Zertifikate.
Cacerts ist ein Truststore (vertraut den Zertifikaten). Der Default-Speicherort des cacerts ist `jre/lib/security`. Darin befinden sich die Root Zertifikate von den grössten Zertifizierungsstellen (ca. 104) Diesen Root Zertifikaten vertraut Java von Haus aus und alle anderen werden blockiert. Man kann hier weitere hinzufügen oder ein ganze neues cacerts bauen.
Java lehnt Zertifikate, die nicht im cacerts vorhanden sind aus Sicherheitsgründen ab. Ein Self Signed Certificate oder das Rootertifikat muss deshalb manuell hinterlegt werden. Ab diesem Moment "vertraut" Java diesem Zertifikat.
### Neues Zertifikat in cacerts einfügen
```
keytool -importcert -trustcacerts -file /path/to/cert.pem -alias EinAliasName -keystore /path/to/cacerts -storepass changeit -noprompt
```
Ab Java 9 kann das PEM (base64 encoded) Zertifikat verwendet werden.\
Bei Java < 9 sollte das Zertifikat im x509 DER Format vorliegen. Allenfalls ist eine Konvertierung nötig:
```
openssl x509 -outform der -in certificate.pem -out certificate.der
```
### Zertifikat aus cacerts exportieren
```
keytool -export -storepass changeit -alias DerAliasName -keystore cacerts -file FQDNname.crt
```
### Alle Einträge in cacerts auflisten
```
keytool -list -v -keystore "c:\...\cacerts" > cacerts_output.txt
```
### Alter Eintrag in cacerts löschen
```
keytool -delete -alias aliasname -keystore ..\cacerts
```
### Alias eines Keys im Keystore ändern
```
keytool -changealias -alias "your-very-very-long-alias" -destalias "new-alias" -keystore "/path/to/cacerts"
```
## Tomcat (unter Windows)
Das Keystore-File von Tomcat beinhaltet das Serverzertifikat, die Chain of Trust (Root-/Intermediate Zertifikate), und den private Key. Tomcat verwendet JKS, PKCS11 or PKCS12 format keystores. Das JKS format ist Java's standard "Java KeyStore" Format. Das PKCS12 Format ist ein Internetstandard, und kann mit OpenSSL oder Microsoft's Key-Manager manipuliert werden.\
Bei älteren Tomcat-Versionen (<8 ?) muss möglicherweise PFX in JKS umgewandelt werden:
```
Keytool -importkeystore -srckeystore server.pfx -srcstoretype pkcs12 -destkeystore tomcat.jks -deststoretype jks
```
Anschliessend in `tomcat/conf/server.xml` im <Connector> von 443 oder 8443 die Angaben zu `keystoreFile` und `keystorePass` machen.
Zudem muss in den Tomcat Monitor Configurations im Tab „Java“ der Pfad zum Java Truststore (cacerts) hinzugefügt werden:
```
-Djavax.net.ssl.trustStore=D:\docuteam\apps\jdk\jre\lib\security\cacerts.
```
## Ruby (unter Windows)
Damit Ruby Apps verschlüsselte Verbindungen über Self-Signed Certificates herstellen kann, muss das Root/Intermediate Zertifikat hinterlegt werden.
- Intermediate und Root Zertifikat separat abspeichern als Base-64.
- Dateiendung auf .pem anpassen, falls dies noch nicht der Fall ist.
- Die 2 Dateien im Ordner `...\Ruby2x-x64\ssl\certs` ablegen.
- Das `c_rehash.rb` Skript im selben Ordner aus CMD heraus ausführen.: `D:\...\Ruby26-x64\ssl\certs>ruby c_rehash.rb`
- Ab Ruby 3.2.2 befinden sich die Zertifikate und `c_rehash.rb` in `D:\...\Ruby32-x64\bin\etc\ssl\certs`
## Weitere nützliche Befehle
### Überprüfen, ob Key, CRT und CSR zusammen passen
Mit folgenden Befehlen kann überprüft werden, ob Key, CRT und CSR zusammen passen (muss 3x die gleiche Checksumme ergeben):
```
openssl rsa -noout -modulus -in irgendEinName.key.pem | openssl md5
openssl x509 -noout -modulus -in irgendEinName.crt.pem | openssl md5
openssl req -noout -modulus -in irgendEinName.csr | openssl md5
```