wiki/pages/de/server/services/ssl.txt

269 lines
No EOL
7 KiB
Text

====== SSL ======
Sei deine eigene SSL-Zertifizierungsstelle.
Dieses Tutorial basiert auf der Domain ''nextcloud.home''. Ändere die Domain daher in deine eigene Domain, wenn du was anderes brauchst.
Es ist auch wichtig, dass die Domain-Adresse von deinem Router umgeleitet wird oder mit [[/de/server/services/adguardhome#dns_rewrites|AdGuardHome]]. Dies kann auch in der Datei ''/etc/hosts'' auf deinem Computer eingestellt werden, aber um die Domain auf jedem Gerät zu erreichen, ist es einfacher, dies direkt im Router oder [[/de/server/services/adguardhome#dns_rewrites|AdGuardHome]] zu ändern:
<code>
nextcloud.domain SERVER-IP
</code>
===== mkcert =====
[[https://github.com/FiloSottile/mkcert|mkcert]] ist ein einfaches Werkzeug zur Erstellung von lokal vertrauenswürdigen Entwicklungszertifikaten. Es erfordert keine Konfiguration.
==== Packete ====
<code>
pacman -S nss mkcert
</code>
==== Root-Zertifikat erstellen ====
<code>
mkcert -install
</code>
==== Zertifikate für Ihre Domains erstellen ====
<code>
mkcert nextcloud.home
</code>
===== Manuell =====
==== Generierung des privaten Schlüssels und des Root Zertifikats ====
<code>
openssl genrsa -des3 -out rootCA.key 2048
</code>
<code>
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1825 -out rootCA.pem
</code>
Ändere die folgenden Informationen nach deinen Wünschen. Die Infos werden z.B. angezeigt, wenn du das Zertifikat über deinen Browser ansiehst.
<code>
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
</code>
==== Erstellung von CA-signierten Zertifikaten für deine Domains ====
<code>
openssl genrsa -out nextcloud.home-key.pem 2048
</code>
<code>
openssl req -new -key nextcloud.home-key.pem -out nextcloud.home.pem
</code>
<code>
nano nextcloud.home.ext
</code>
<code>
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = nextcloud.home
</code>
=== Script ===
Erstelle die Datei in ''nano /etc/nginx/ssl/ssl.sh''.
<code>
#!/bin/sh
if [ "$#" -ne 1 ]
then
echo "Usage: Must supply a domain"
exit 1
fi
DOMAIN=$1
openssl genrsa -out $DOMAIN-key.pem 2048
openssl req -new -key $DOMAIN-key.pem -out $DOMAIN.pem
cat > $DOMAIN.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = $DOMAIN
EOF
openssl x509 -req -in $DOMAIN.pem -CA rootCA.pem -CAkey rootCA.key -CAcreateserial \
-out $DOMAIN.crt -days 825 -sha256 -extfile $DOMAIN.ext
</code>
<code>
chmod +x ssl.sh
./ssl.sh nextcloud.home
</code>
===== Installation des Root-Zertifikats auf allen Geräten =====
Du musst auf jedem Gerät eine ''rootCA.pem''-Datei erstellen und den Inhalt der Datei ''rootCA.pem'' dorthin kopieren, wo du sie in Abschnitt [[#generierung_des_privaten_schluessels_und_des_root_zertifikats]] (manuell) erstellt hast.
Wenn du [[#mkcert]] benutzt hast, führe einfach den Befehl ''cat $(mkcert -CAROOT)/rootCA.pem'' aus.
==== Arch Linux ====
<code>
trust anchor --store rootCA.pem
</code>
==== Android ====
=== User trusted credentials ===
''Settings'' - ''Security'' - ''Encryption and credentials'' - ''Install a certificate''
Check unter:
''Settings'' - ''Security'' - ''Trusted credentials'' - ''User''
=== System trusted credentials ===
Wenn "User trusted credentials" nicht ausreicht und du das Zertifikat im System brauchst, befolge die nächsten Zeilen. Dazu ist allerdings ein gerootetes Gerät erforderlich:
<code>
hashed_name=`openssl x509 -inform PEM -subject_hash_old -in rootCA.pem | head -1` && cp rootCA.pem $hashed_name.0
ls $hashed_name.0
</code>
**Android 13:**
<code>
adb root
adb shell mount -o rw,remount /
adb push $hashed_name.0 /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/$hashed_name.0
adb shell chown root:root /system/etc/security/cacerts/$hashed_name.0
adb shell reboot
</code>
**Android 14 (this only works until a restart):**
<code>
adb root
adb shell mkdir -p -m 700 /data/local/tmp/cacerts
adb shell cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/cacerts/
adb shell mount -t tmpfs tmpfs /system/etc/security/cacerts
adb shell mv /data/local/tmp/cacerts/* /system/etc/security/cacerts/
adb push $hashed_name.0 /system/etc/security/cacerts/
adb shell chown root:root /system/etc/security/cacerts/*
adb shell chmod 644 /system/etc/security/cacerts/*
adb shell chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
adb shell
</code>
<code>
ZYGOTE_PID=$(pidof zygote || true)
ZYGOTE64_PID=$(pidof zygote64 || true)
for Z_PID in "$ZYGOTE_PID" "$ZYGOTE64_PID"; do
if [ -n "$Z_PID" ]; then
nsenter --mount=/proc/$Z_PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
fi
done
APP_PIDS=$(
echo "$ZYGOTE_PID $ZYGOTE64_PID" | \
xargs -n1 ps -o 'PID' -P | \
grep -v PID
)
for PID in $APP_PIDS; do
nsenter --mount=/proc/$PID/ns/mnt -- \
/bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts &
done
</code>
Du kannst auch die Magisk-Module [[https://github.com/NVISOsecurity/MagiskTrustUserCerts/releases|MagiskTrustUserCerts]] (Android 13) oder [[https://github.com/nccgroup/ConscryptTrustUserCerts|ConscryptTrustUserCerts]] (Android 14) verwenden, dass das gleiche quasi wie oben macht.
=== CA-Zertifikate von Drittanbietern für Firefox verwenden ===
Du kannst auch die Option ''Use third party CA certificates'' für den Firefox-Browser wählen:
- Öffne deinen Browser, scrolle nach unten und klicke auf Über firefox/iceraven/mull ...
- Klick mehrmals auf das Logo und gehe zurück
- Klicke auf Geheime Einstellungen und aktiviere ''Use third party CA certificates''
===== Nginx =====
Siehe auch [[/de/server/services/nginx]]
==== ssl-params.conf ====
<code>
nano /etc/nginx/conf.d/ssl-params.conf
</code>
<code>
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
</code>
==== example ====
<code>
server {
listen 80;
listen [::]:80;
server_name nextcloud.home;
# enforce https
return 301 https://$server_name:443$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name nextcloud.home;
ssl_certificate /etc/nginx/ssl/nextcloud.home.pem;
ssl_certificate_key /etc/nginx/ssl/nextcloud.home-key.pem;
include conf.d/ssl-params.conf;
access_log /var/log/nginx/nextcloud.home_access_log;
error_log /var/log/nginx/nextcloud.home-error_log;
location / {
your things;
}
}
</code>