TLS Zertifikat erneuern... - Frage dazu..

Tiieto

Neuer User
Mitglied seit
16 Jan 2021
Beiträge
140
Punkte für Reaktionen
6
Punkte
18
Hallo Zusammen...

Die Tage ist mein für die Verschlüsselte Kommunikation erstelltes TLS Zertifikat abgelaufen... Die Verwunderung das man nun nicht mehr Telefonieren kann war zunächst groß bis dann der "Übeltäter" (=abgelaufenes Zertifikat) ausgemacht wurde...

Dazu mal ne Frage...

der Befehl:
Code:
openssl req -new -sha256 -nodes -out /home/pi/csr/certificate.csr -newkey rsa:2048 -keyout /home/pi/certs/certificate.key
erzeugt im weiteren Vorgehen eine Abfrage die stück für stück ausgefüllt werden muss:

Code:
Country Name:
State or Province:
Locality name:
Organization name:
Organisation unit name:
common name:
email adress:
etc...

Ist es möglich diese eingaben in einer "config" Datei zu speichern und in den Befehl mit einzubauen?
Wenn wir schonmal das Thema haben: das Passwort für den "Root-CA.key", kann man das ebenfalls da einbauen?

Zweck des ganzen ist dann quasi per Cronjob ein Script zu starten (1x im Jahr) was die Zertifikate automatisch neu erstellt...

Jemand ne Idee dazu?

LG Tieto..
 
Bash:
#! /bin/bash
get_expired_certs()
{
        local serial
        if [ ${#1} -gt 0 ]; then
                serial="$1"
        else
                serial="[0-9A-F]*"
        fi
        sed -n -e "s/^\(E\)\t\([0-9]*\)Z\t\(.*\)\t\($serial\)\t\(.*\)\t\(.*\)/EXPIRED_TYPE=\1 EXPIRED_DATE=\2 EXPIRED_REVOKED=\"\3\" EXPIRED_SERIAL=\4 EXPIRED_REASON=\5 EXPIRED_CN=\"\6\"/p" $CADIR/index.txt
}
get_renewed_certs()
{
        local serial
        if [ ${#1} -gt 0 ]; then
                serial="$1"
        else
                serial="[0-9A-F]*"
        fi
        sed -n -e "s/^\(N\)\t\([0-9]*\)Z\t\(.*\)\t\($serial\)\t\(.*\)\t\(.*\)/RENEW_TYPE=\1 RENEW_DATE=\2 RENEW_REVOKED=\"\3\" RENEW_SERIAL=\4 RENEW_REASON=\5 RENEW_CN=\"\6\"/p" $CADIR/renewed.txt
}
get_pending_renews()
{
        local line renewed
        while read line; do
                eval $line
                renewed=$(get_renewed_certs $EXPIRED_SERIAL)
                if [ ${#renewed} -eq 0 ]; then
                        echo $line
                fi
        done < <(get_expired_certs)
}
cert_renewed()
{
        local serial="$1"
        sed -n -e "s/^\(E\)\t\([0-9]*\)Z\t\(.*\)\t\($serial\)\t\(.*\)\t\(.*\)/N\t\2Z\t\3\t\4\t\5\t\6/p" $CADIR/index.txt >>$CADIR/renewed.txt
}
create_request()
{
        local keyname="$1" certfile="$2" serial dn dnsect extensions req_extensions reqfile conf rc=0
        serial=$(get_serial $certfile)
        dn="$(get_distinguished_name $certfile)"
        dnsect="$(get_distinguished_name_section $certfile)"
        extensions="$(get_v3extensions $certfile 0)"
        req_extensions="$(get_v3extensions $certfile 1)"
        reqfile=$TEMPDIR/$KEYNAME.request
        echo "[ req ]" >$reqfile
        echo "default_bits = 4096" >>$reqfile
        echo "default_md = sha512" >>$reqfile
        echo "string_mask = nombstr" >>$reqfile
        echo "prompt = no" >>$reqfile
        echo "extensions = v3_req" >>$reqfile
        echo "req_extensions = v3_req" >>$reqfile
        echo "distinguished_name = req_dn" >>$reqfile
        echo "[ req_dn ]" >>$reqfile
        echo "$dnsect" >>$reqfile
        echo "[ v3_req ]" >>$reqfile
        echo "$req_extensions" >>$reqfile
        NEWKEYNAME="$(echo -n "$dn" | md5sum | sed -n -e 's/^\([0-9a-f]*\).*/\1/p')-$(date +%s)"
        cat $keyfile >$TEMPDIR/$NEWKEYNAME.key
        conf=$TEMPDIR/$NEWKEYNAME.conf
        echo "$NEWKEYNAME $dn" >$TEMPDIR/$NEWKEYNAME.cam
        echo "[ca]" >$conf
        echo "default_ca = ca" >>$conf
        echo "dir = $CADIR" >>$conf
        echo "certs = $CADIR/certs" >>$conf
        echo "crl_dir = $CADIR/crl" >>$conf
        echo "database = $CADIR/index.txt" >>$conf
        echo "new_certs_dir = $CADIR/certs" >>$conf
        echo "certificate = $CADIR/cacert.pem" >>$conf
        echo "serial = $CADIR/serial" >>$conf
        echo "crl = $CADIR/crl.pem" >>$conf
        echo "private_key = $CADIR/cacert.key" >>$conf
        echo "RANDFILE = $CADIR/.rand" >>$conf
        echo "x509_extensions = v3_req" >>$conf
        echo "default_days = 730" >>$conf
        echo "default_md = sha512" >>$conf
        echo "unique_subject = no" >>$conf
        echo "preserve = yes" >>$conf
        echo "policy = policy" >>$conf
        echo "copy_extensions = copy" >>$conf
        echo "nameopt = default_ca" >>$conf
        echo "certopt = default_ca" >>$conf
        echo "[policy]" >>$conf
        echo "countryName = supplied" >>$conf
        echo "stateOrProvinceName = supplied" >>$conf
        echo "localityName = supplied" >>$conf
        echo "organizationName = supplied" >>$conf
        echo "organizationalUnitName = supplied" >>$conf
        echo "commonName = supplied" >>$conf
        echo "emailAddress = optional" >>$conf
        echo "[ v3_req ]" >>$conf
        echo "$extensions" >>$conf
        echo -n "$keypasswd" | openssl req -new -key $keyfile -config $reqfile -out $TEMPDIR/$NEWKEYNAME.req -passin stdin
        rc=$?
        echo $NEWKEYNAME
        return $rc
}
sign_request()
{
        local keyname="$1"
        echo -n "$cakeypasswd" | openssl ca -in $TEMPDIR/$keyname.req -out $TEMPDIR/$keyname.pem -config $TEMPDIR/$keyname.conf -batch -passin stdin
}
. certhelpers
CADIR="$1"
TEMPDIR=$(mktemp -d)
if [ ${#keypasswd} -eq 0 ]; then
        read -sp "Enter private key password : " keypasswd
        echo ""
fi
if [ ${#cakeypasswd} -eq 0 ]; then
        read -sp "Enter CA key password : " cakeypasswd
        echo ""
fi
while read line; do
        eval $line
        keyline=$(get_key_name_from_cn "$EXPIRED_CN")
        eval $keyline
        keyfile=$CADIR/keys/$KEYNAME.key
        certfile=$CADIR/certs/$EXPIRED_SERIAL.pem
        newname="$(create_request $KEYNAME $certfile)"
        rc=$?
        if [ $rc -eq 0 ]; then
                sign_request "$newname"
                rc=$?
                if [ $rc -eq 0 ]; then
                        cp -a $TEMPDIR/$newname.key $CADIR/keys/$newname.key
                        cp -a $TEMPDIR/$newname.req $CADIR/req/$newname.req
                        serial=$(get_serial $TEMPDIR/$newname.pem)
                        cp -a $TEMPDIR/$newname.pem $CADIR/newcerts/$serial:$newname.pem
                        cat $TEMPDIR/$newname.cam >>$CADIR/cam.txt
                        cert_renewed $EXPIRED_SERIAL
                else
                        cat $TEMPDIR/$newname.conf
                        break
                fi
        else
                cat $TEMPDIR/$newname.conf
                break
        fi
done < <(get_pending_renews)
rm -r $TEMPDIR
Bash:
#! /bin/bash
#
# dictionaries to convert text values to attributes
#
declare -A nsCertType=([SSL Server]="server" [SSL Client]="client" [S/MIME]="email" [Object Signing]="objsign" [SSL CA]="sslCA" [S/MIME CA]="emailCA" [Object Signing CA]="objCA")
declare -A keyUsage=([critical]="critical" [Digital Signature]="digitalSignature" [Non Repudiation]="nonRepudiation" [Key Encipherment]="keyEncipherment" [Data Encipherment]="dataEncipherment" [Key Agreement]="keyAgreement" [Certificate Sign]="keyCertSign" [CRL Sign]="cRLSign")
declare -A extendedKeyUsage=([critical]="critical" [TLS Web Server Authentication]="serverAuth" [TLS Web Client Authentication]="clientAuth" [Code Signing]="codeSigning" [E-mail Protection]="emailProtection" [Time Stamping]="timeStamping" [OCSP Signing]="OCSPSigning")
declare -A dnComponents=([C]="countryName" [ST]="stateOrProvinceName" [L]="localityName" [O]="organizationName" [OU]="organizationalUnitName" [CN]="commonName" [emailAddress]="emailAddress" [DN]="domainComponent")
#
get_indent()
{
        local spaces line=$1 file=$2
        spaces=$(( $(sed -n -e "${line}s/^\( *\).*/\1/p" $file | wc -c) - 1 ))
        echo $spaces
}
trim()
{
        local val="$1"
        while [ ${#val} -gt 0 -a x"${val:0:1}" == x" " ]; do
                val="${val:1}"
        done
        if [ ${#val} -gt 0 ]; then
                while [ x"${val:${#val}-1}" == x" " ]; do
                        val="${val:0:-1}"
                done
        fi
        echo "$val"
}
get_nsCertType()
{
        local value="$1" out oifs="$IFS" attr key
        IFS=,
        set -- $value
        while [ $# -gt 0 ]; do
                if [ ${#1} -gt 0 ]; then
                        key=$(trim "$1")
                        if [ ${#key} -gt 0 ]; then
                                attr="${nsCertType["$key"]}"
                                if [ ${#attr} -gt 0 ]; then
                                        out="$out${out:+, }$attr"
                                fi
                        fi
                fi
                shift
        done
        IFS="$oifs"
        echo "$out"
}
get_keyUsage()
{
        local value="$1" out oifs="$IFS" attr key
        IFS=,
        set -- $value
        while [ $# -gt 0 ]; do
                if [ ${#1} -gt 0 ]; then
                        key=$(trim "$1")
                        if [ ${#key} -gt 0 ]; then
                                attr="${keyUsage["$key"]}"
                                if [ ${#attr} -gt 0 ]; then
                                        out="$out${out:+, }$attr"
                                fi
                        fi
                fi
                shift
        done
        IFS="$oifs"
        echo "$out"
}
get_extendedKeyUsage()
{
        local value="$1" out oifs="$IFS" attr key
        IFS=,
        set -- $value
        while [ $# -gt 0 ]; do
                if [ ${#1} -gt 0 ]; then
                        key=$(trim "$1")
                        if [ ${#key} -gt 0 ]; then
                                attr="${extendedKeyUsage["$key"]}"
                                if [ ${#attr} -gt 0 ]; then
                                        out="$out${out:+, }$attr"
                                fi
                        fi
                fi
                shift
        done
        IFS="$oifs"
        echo "$out"
}
append_extension()
{
        local key="${1%%:*}" kvalue="$(trim "${1#*:}")" value="$(trim "$2")" req=$3 prefix
        [ $req -eq 1 ] && prefix="# "
        if [ ${#kvalue} -gt 0 ]; then
                value="$kvalue, $value"
        fi
        case "$key" in
                "Netscape Comment")
                        echo "nsComment = \"$value\""
                        ;;
                "Netscape Cert Type")
                        echo "nsCertType = $(get_nsCertType "$value")"
                        ;;
                "Netscape Base Url")
                        echo "nsBaseUrl = $value"
                        ;;
                "Netscape Revocation Url")
                        echo "${prefix}nsRevocationUrl = $value"
                        ;;
                "Netscape CA Revocation Url")
                        echo "${prefix}nsCaRevocationUrl = $value"
                        ;;
                "Netscape Renewal Url")
                        echo "${prefix}nsRenewalUrl = $value"
                        ;;
                "Netscape CA Policy Url")
                        echo "${prefix}nsCaPolicyUrl = $value"
                        ;;
                "Netscape SSL Server Name")
                        echo "nsSslServerName = $value"
                        ;;
                "X509v3 Basic Constraints")
                        echo "basicConstraints = $value"
                        ;;
                "X509v3 Key Usage")
                        echo "keyUsage = $(get_keyUsage "$value")"
                        ;;
                "X509v3 Extended Key Usage")
                        echo "extendedKeyUsage = $(get_extendedKeyUsage "$value")"
                        ;;
                "X509v3 Subject Key Identifier")
                        echo "subjectKeyIdentifier = hash"
                        ;;
                "X509v3 Authority Key Identifier")
                        echo "${prefix}authorityKeyIdentifier = keyid:always, issuer:always"
                        ;;
                "X509v3 Subject Alternative Name")
                        value="$(echo "$value" | sed -e "s/IP Address:/IP:/g")"
                        echo "subjectAltName = $value"
                        ;;
                "X509v3 Issuer Alternative Name")
                        echo "${prefix}issuerAltName = issuer:copy"
                        ;;
                "X509v3 CRL Distribution Points")
                        value="$(echo "$value" | sed -e "s/Full Name: /, /g" -e "s/^, //" -e "s/ ,/,/g" -e "s/, /,/g" -e "s/,/, /g")"
                        echo "${prefix}crlDistributionPoints = $value"
                        ;;
                "Authority Information Access")
                        value="$(echo "$value" | sed -e "s/ - /;/" -e "s/CA Issuers/caIssuers/")"
                        echo "${prefix}authorityInfoAccess = $value"
                        ;;
                *)
                        :
                        ;;
        esac
}
get_v3extensions()
{
        local cert="$1" req="$2" output keyindent i line key value
        temp=$(mktemp)
        openssl x509 -in $cert -text -noout | sed -n -e '/^[ \t]*X509v3 extensions:/,/^[ \t]*Signature Algorithm/p' | sed -e '1d;$d;' -e "/^[ \t]*$/d" >$temp
        keyindent=$(get_indent 1 $temp)
        i=0
        while read line; do
                let i+=1
                if [ $(get_indent $i $temp) -eq $keyindent ]; then
                        append_extension "$key" "$value" $req
                        key="$line"
                        value=""
                else
                        value="$value $line"
                fi
        done <$temp
        append_extension "$key" "$value" $req
        rm $temp
}
get_serial()
{
        local cert="$1" serial
        serial=$(echo -n $(openssl x509 -in $cert -serial -noout) | sed -n -e 's/serial=//p')
        echo "$serial"
}
get_distinguished_name()
{
        local cert="$1" subject
        subject=$(echo -n $(openssl x509 -in $cert -subject -noout) | sed -n -e 's/subject= //p')
        echo "$subject"
}
get_distinguished_name_section()
{
        local cert="$1" oifs="$IFS" key value comp dn
        dn="$(get_distinguished_name $cert)"
        IFS="/"
        set -- $dn
        IFS="$oifs"
        while [ $# -gt 0 ]; do
                key="${1%%=*}"
                if [ ${#key} -gt 0 ]; then
                        value="${1#*=}"
                        comp="${dnComponents["$key"]}"
                        echo "$comp = $value"
                fi
                shift
        done
}
get_key_name_from_cn()
{
        if [ ${#1} -gt 0 ]; then
                cn="$1"
        else
                cn=".*"
        fi
        sed -n -e "s|^\([0-9a-f]*-[0-9]*\)[ \t]*\($cn\)|KEYNAME=\1 CN=\"\2\"|p" $CADIR/cam.txt
}
[ $# -gt 0 -a "${0##*/}" == "certhelpers" ] && $*
Ausgangspunkt ist eine Dateistruktur, wie sie z.B. bei openSUSE im Paket yast2-ca-management (https://software.opensuse.org/package/yast2-ca-management) verwendet wurde - mit ein paar Hilfsdateien zur Verwaltung der Daten, die OpenSSL selbst nicht speichert (primär eine cam.txt, in der ausgegebene Zertifikate verwaltet werden). Der Rest ist eigentlich nur das, was OpenSSL als PKI (zumindest als "best practice") ohnehin selbst verwaltet: https://pki-tutorial.readthedocs.io/en/latest/cadb.html
 
Zuletzt bearbeitet:
Ach Du sch***e....

Könntest Du dazu vielleicht ein paar Worte der Erklärung hinzufügen? - Danke...
 
Könntest Du dazu vielleicht ein paar Worte der Erklärung hinzufügen?
Erledigt.

Ich dachte mir halt, ich lasse mal ein Beispiel sprechen - und spare mir selbst zusätzliches Schreiben.

Ist es möglich diese eingaben in einer "config" Datei zu speichern und in den Befehl mit einzubauen?
Ja, siehe oben. Die Funktion create_request zeigt, wie man die notwendigen Daten so in einer Konfigurationsdatei für OpenSSL hinterlegt, daß diese ohne weitere Nachfragen übernommen werden beim Signieren bzw. Erstellen eines CSR.

Die verwendeten Daten werden dabei aus dem vorherigen Zertifikat extrahiert (hier sogar noch mittels openssl-Binary und nicht direkt in ASN.1-Format, was natürlich universeller wäre, weil es auch von L10n-Problemen nicht betroffen ist) und 1:1 wieder so übernommen ... ja, hier werden sogar die Private-Keys, die in den alten Zertifikaten verwendet wurden, weiterhin genutzt - was manchmal kontrovers gesehen wird, denn hier steht etwas geringerer Sicherheit (wenn man kürzere Schlüssel verwendet und deren Benutzung zeitliche oder volumenbezogene Grenzen überschreitet) ein geringerer Aufwand beim "renewal" gegenüber, wenn der PrivKey nicht ausgetauscht werden muß.

Will man alle Attribute im CSR richtig setzen (speziell event. vorhandene "alternative names"), kann das eben richtig in Arbeit ausarten, wenn man das jedesmal "von Hand" machen wollte - daher das Auslesen dieser Attribute aus dem alten Zertifikat - normalerweise werden diese Angaben (bei der Arbeit mit openssl als CA) nicht weiter gespeichert.

das Passwort für den "Root-CA.key", kann man das ebenfalls da einbauen?
Ja, ebenfalls s.o. - das CA-Kennwort wird nur für das Signieren benötigt; es reicht also, wenn man es auch nur bei dieser Operation angibt (Funktion sign_request).



Die Dateien waren/sind auch nicht als 1:1-Umsetzung zu verstehen ... die machen insgesamt nur dann einen Sinn, wenn man die passende Dateistruktur in seiner PKI-Verwaltung hat. Aber die "Idee", wie so etwas auch automatisiert funktioniert, kann man den einzelnen Funktionen eben doch entnehmen - der direkte "Aufruf" des ersten Skripts (die zweite Datei wird ja von der ersten inkludiert und ist "eigenständig" gar nicht zu gebrauchen) ist nur dann sinnvoll, wenn man abgelaufene Zertifikate in einer index.txt (siehe Links weiter oben) automatisch erneuern (lassen) will, das Kennwort für den entsprechenden privaten Schlüssel kennt (nur damit kann der CSR "unterschrieben" werden, bevor er an die CA geht) und obendrein auch noch das Kennwort für die CA (deren privater Schlüssel wird zum Erzeugen des X509-Zertifikats aus dem CSR benötigt).

Zusätzlich braucht es dann eben noch die Aktualisierung der Status-Angabe für ein Zertifikat in der index.txt (erste "Spalte"), weil nur Zertifikate erneuert werden, die dort als "abgelaufen" markiert sind - das macht openssl auch nicht automatisch (iirc) und man muß es irgendwie selbst vornehmen - z.B. anhand der Datumsangaben in den weiteren Spalten. Wie so eine cam.txt aufgebaut ist, findet man auch im Netz - da das gar nicht direkt zur "Nachnutzung" gedacht ist (zumindest nicht der Teil, der da in der ersten Datei noch rundherum steht), braucht man die aber gar nicht - es reicht ja aus, wenn man versteht, was da aus der Datei gelesen oder in sie hineingeschrieben werden soll - und die Namen der Funktionen sind schon "sprechend".
 
Vielen Dank für die erklärenden Worte...
Dann werd ich mich da mal durchwuseln...
Auf den ersten Blick ist das ziemlich erschlagend... - naja, ich hab ja n Jahr Zeit das zu kapieren... ;)

Vielen Dank schonmal...
 
Ist es möglich diese Eingaben in einer "config" Datei zu speichern und in den Befehl mit einzubauen?
Ja, Du kannst in der System-weiten OpenSSL.conf alles voreinstellen. Oder Du übergibt eine Conf-Datei beim Aufruf.

Aber was genau macht Ihr da überhaupt? Ich stehe noch auf dem Schlauch. Du musst weder den privaten Schlüssel noch den Signing-Request jedesmal neu erstellen. Beide kannst Du ohne einen Verlust an Sicherheit über Jahrzehnte beibehalten. Der private Schlüssel kommt statisch in die Datei asterisk.pem. Der Signing-Request dann immer als statische Text-Datei zu dem der für Euch signiert.

Folglich muss lediglich die Signierung immer wieder gemacht werden. Wer genau macht bei Euch die Signierung? Gibt auch Skripte, die das für Let’s Encrypt automatisch machen. Oder wenn Ihr (noch) mehr Kompatibilität braucht, gibt auch RapidSSL im Abo-Modell. Du drückst dann alle 12 Monate auf eine Taste und erhältst daraufhin Dein neues öffentliches Zertifikat.
 
Was den privaten Schlüssel angeht (nennen wir ihn mal asterisk.key) da streiten sich die Geister... Der eine sagt so, der andere so...
Der eine Meint es ist ein Risiko den gleichen asterisk.key über mehrere Jahre beizubehalten und nur jährlich das Zertifikat auszutauschen, der nächste meint das ist total Wumpe und behält den key und erstellt damit ein neues Zertifikat...

Was länger bestehen kann ist der Root-Ca.key

Alle Zertifikate & Schlüssel wurden auf meinem Raspi erzeugt (self signed) und an die Endgeräte (Telefone, Rechner - zumindest das root-ca.crt) im Netzwerk verteilt...

Das ganze halt für die verschlüsselte Kommunikation über TLS..
 
Der eine sagt so, der andere so.
Zeig mal bitte einen so … einziges Problem, dass ich aktuell sähe, wenn man nicht weiß, dass der Key entwendet wurde. Dann frage ich mich aber, wie man auf eine Zeitspanne von einem Jahr kommt. Wenn das bei Euch unsicher ist, würde ich das sogar öfters machen. Normal machst Du PFS … OK, Du willst es so, ist ja in Ordnung:
Du kannst in der System-weiten OpenSSL.conf alles voreinstellen. Oder Du übergibt eine Conf-Datei beim Aufruf.
Das hast Du gesehen? Brauchst Du dazu mehr Infos? Dann kannst Du das Re-Keying nämlich auch täglich machen.
 
Du kannst in der System-weiten OpenSSL.conf alles voreinstellen. Oder Du übergibt eine Conf-Datei beim Aufruf.
Das hast Du gesehen? Brauchst Du dazu mehr Infos? Dann kannst Du das Re-Keying nämlich auch täglich machen.

Ja das hab ich gesehen...
Bestimmt brauch ich da noch Hilfe bei... Hab jetzt aber erstmal mit den Kids genug zu tun... ;)

Grundsätzlich aber schonmal: wo ist die Datei zu finden? Und wie übergebe ich das beim Aufruf?

LG
 
Die system-weite Datei ist bei jedem UNIX ein wenig woanders. Auf was basierte Raspberry Pi nochmal? Mal die Platte nach „openssl.cnf“ absuchen: $ sudo find / -name "openssl.cnf". Darin (bzw. in den Ordnern drum herum) findest Du bereits ein Template. Das kannst Du für eine eigene Datei als Startpunkt nehmen, die Du mittels openssl req -config <file> übergibst. Die genaue Syntax steht in man … (Unter: „Sample configuration containing all field values“). Ein anderer schöner Startpunkt fand sich bereits im Jahr 2002 in der Heise-Zeitschrift c’t …

Wenn Du Deine eigene Certificate-Authority bist, dann kannst Du sogar vieles einfach verwerfen. Selbst die großen öffentlichen Certificate-Authorities brauchen so gut wie nix im Signing-Request. Domain, manche noch das Land. Mehr kratzt die nicht.
 
Soweit ich weiß auf Debian...


Hab 2 Einträge mit der Suche gefunden...

Code:
pi@VoiP-Pi:~ $ sudo find / -name "openssl.cnf"
/etc/ssl/openssl.cnf
/usr/lib/ssl/openssl.cnf
find: '/proc/17036': Datei oder Verzeichnis nicht gefunden
pi@VoiP-Pi:~ $

Welche isses?
 
Ist das eine nicht ein Symbolic-Link auf die andere Datei? Mach mal:
$ ls -l /usr/lib/ssl/openssl.cnf
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.