Let's Encrypt con più domini non funzionava per i certificati ECC

Come avvio il rinnovo del certificato, elimino semplicemente quello vecchio da /shared/ssl?

Penso che lo faccia sempre quando viene ricostruito, quindi non c’è bisogno di eliminare nulla.

1 Mi Piace

il certificato è stato emesso ieri, quindi normalmente necessita di --force negli script LE. Ho rinominato i vecchi certificati e sto testando una ricostruzione.

Apparentemente questo non funziona, non ottengo il secondo dominio inserito: https://ssl-tools.net/webservers/rpg-foren.com

Inoltre, non sembra che tutto venga sostituito correttamente, al file ecc manca il sottodominio:

cat /etc/runit/1.d/letsencrypt
#!/bin/bash
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf

issue_cert() {
  LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh --issue $2 -d rpg-foren.com -d www.rpg-foren.com --keylength $1 -w /var/www/discourse/public
}

cert_exists() {
  [[ "$(cd /shared/letsencrypt/rpg-foren.com$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")"]]
}

########################################################
# RSA cert
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # Try to issue the cert again if something goes wrong
  issue_cert "4096" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert \
  -d rpg-foren.com \
  -d www.rpg-foren.com --fullchainpath /shared/ssl/rpg-foren.com.cer \
  --keypath /shared/ssl/rpg-foren.com.key \
  --reloadcmd "sv reload nginx"

########################################################
# ECDSA cert
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Try to issue the cert again if something goes wrong
  issue_cert "ec-256" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert --ecc \
  -d rpg-foren.com \
  --fullchainpath /shared/ssl/rpg-foren.com_ecc.cer \
  --keypath /shared/ssl/rpg-foren.com_ecc.key \
  --reloadcmd "sv reload nginx"

if cert_exists "" || cert_exists "_ecc"; then
  grep -q 'force_https' "/var/www/discourse/config/discourse.conf" || echo "force_https = 'true'" >> "/var/www/discourse/config/discourse.conf"
fi

/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop

Ho appena eseguito manualmente quanto segue, ora i certificati corrispondono:

/shared/letsencrypt/acme.sh --issue --force -d rpg-foren.com -d www.rpg-foren.com --keylength 4096 -w /var/www/discourse/public --server letsencrypt
/shared/letsencrypt/acme.sh --issue --force -d rpg-foren.com -d www.rpg-foren.com --keylength ec-256 -w /var/www/discourse/public --server letsencrypt

/shared/letsencrypt/acme.sh --installcert -d rpg-foren.com -d www.rpg-foren.com --fullchainpath /shared/ssl/rpg-foren.com.cer --keypath /shared/ssl/rpg-foren.com.key --reloadcmd "sv reload nginx"
/shared/letsencrypt/acme.sh --installcert -d rpg-foren.com -d www.rpg-foren.com --fullchainpath /shared/ssl/rpg-foren.com_ecc.cer --keypath /shared/ssl/rpg-foren.com_ecc.key --reloadcmd "sv reload nginx"

questa è la mia riscrittura per l’inoltro:

   # tell letsencrypt what additional certs to get
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d www.rpg-foren.com --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d www.rpg-foren.com --fullchainpath"
    - file:
        path: /etc/nginx/conf.d/discourse_redirect.conf
        contents: |
          server {
            listen 80;
            listen 443 ssl;
            server_name www.rpg-foren.com;
            return 301 $scheme://rpg-foren.com$request_uri;

            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
            ssl_prefer_server_ciphers off;

            ssl_certificate /shared/ssl/rpg-foren.com.cer;
            ssl_certificate /shared/ssl/rpg-foren.com_ecc.cer;

            ssl_certificate_key /shared/ssl/rpg-foren.com.key;
            ssl_certificate_key /shared/ssl/rpg-foren.com_ecc.key;

            ssl_session_tickets off;
            ssl_session_timeout 1d;
            ssl_session_cache shared:SSL:1m;
          }

È possibile che un comando replace venga eseguito solo una volta?

Sembra che il certificato sia valido ora?

Sono abbastanza sicuro che i reindirizzamenti siano gestiti altrove nella catena e non sia necessario fare nulla affinché funzionino. Probabilmente rimuoverei quella parte dal tuo file yml.

Sembra che ora funzioni come previsto.

Sì, ma l’ho configurato manualmente e non tramite l’hook, perché l’hook non lo ha fatto correttamente.

intendi dal sottodominio www. al dominio principale? Almeno non tramite nginx. Non è definito alcun URL lì in modo che il web server risponda a tutti i domini in entrata.

.
Funziona per me (vedi sotto).

Intendo che qualsiasi cosa si risolva al sito viene reindirizzata all’hostname. Per qualsiasi installazione standard puoi inserire l’indirizzo IP e verrà reindirizzato a https://hostname. (Vedi sotto)

Ho appena configurato questo, creando una nuova installazione standard con https://dashboard.literatecomputing.com/, e incollando ulteriormente extrahostname.myforum.us nel campo domain2 sopra e copiando/incollando l’hook after_ssl risultante immediatamente dopo hooks: in web_only.yml (e l’ho fatto mentre lo script stava costruendo il data container, quindi non ho dovuto ricostruire dopo che ha finito la prima volta!).

Questi funzionano tutti come previsto:

1 Mi Piace

Ciò significa che il sottodominio è memorizzato in /etc/runit/1.d/letsencrypt sia per lo script di installazione rsa che per quello ecc?
Come puoi vedere sopra, l’hook ha memorizzato il sottodominio solo nella parte rsa ma non nella parte ecc.

  --installcert \
  -d rpg-foren.com \
  -d www.rpg-foren.com
  --installcert --ecc \
  -d rpg-foren.com \
  --fullchainpath

Ecco /etc/runit/1.d/letsencrypt

#!/bin/bash
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf

issue_cert() {
  LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh --issue $2 -d test.myforum.us -d extrahostname.myforum.us --keylength $1 -w /var/www/discourse/public
}

cert_exists() {
  [[ "$(cd /shared/letsencrypt/test.myforum.us$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}

########################################################
# Certificato RSA
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # Prova a emettere nuovamente il certificato se qualcosa va storto
  issue_cert "4096" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert \
  -d test.myforum.us \
  -d extrahostname.myforum.us  --fullchainpath /shared/ssl/test.myforum.us.cer \
  --keypath /shared/ssl/test.myforum.us.key \
  --reloadcmd "sv reload nginx"

########################################################
# Certificato ECDSA
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Prova a emettere nuovamente il certificato se qualcosa va storto
  issue_cert "ec-256" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert --ecc \
  -d test.myforum.us \
  --fullchainpath /shared/ssl/test.myforum.us_ecc.cer \
  --keypath /shared/ssl/test.myforum.us_ecc.key \
  --reloadcmd "sv reload nginx"

if cert_exists "" || cert_exists "_ecc"; then
  grep -q 'force_https' "/var/www/discourse/config/discourse.conf" || echo "force_https = 'true'" >> "/var/www/discourse/config/discourse.conf"
fi

/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop

Ah. Vedo che è nel certificato RSA (sbagliato), ma non nel certificato ECC (giusto).

OK. Ora ho capito. Quella sezione --fullcert necessita di global: true al suo interno. Lo sto testando ora.

2 Mi Piace

OK. Ecco il nuovo ‘/etc/runit/1.d/letsencrypt’

#!/bin/bash
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf

issue_cert() {
  LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh --issue $2 -d test.myforum.us -d extrahostname.myforum.us --keylength $1 -w /var/www/discourse/public
}

cert_exists() {
  [[ "$(cd /shared/letsencrypt/test.myforum.us$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}

########################################################
# Certificato RSA
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # Prova a emettere nuovamente il certificato se qualcosa va storto
  issue_cert "4096" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert \
  -d test.myforum.us \
  -d extrahostname.myforum.us  --fullchainpath /shared/ssl/test.myforum.us.cer \
  --keypath /shared/ssl/test.myforum.us.key \
  --reloadcmd "sv reload nginx"

########################################################
# Certificato ECDSA
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Prova a emettere nuovamente il certificato se qualcosa va storto
  issue_cert "ec-256" "--force"
fi

LE_WORKING_DIR="${LETSENCRYPT_DIR}" /shared/letsencrypt/acme.sh \
  --installcert --ecc \
  -d test.myforum.us \
  -d extrahostname.myforum.us  --fullchainpath /shared/ssl/test.myforum.us_ecc.cer \
  --keypath /shared/ssl/test.myforum.us_ecc.key \
  --reloadcmd "sv reload nginx"

if cert_exists "" || cert_exists "_ecc"; then
  grep -q 'force_https' "/var/www/discourse/config/discourse.conf" || echo "force_https = 'true'" >> "/var/www/discourse/config/discourse.conf"
fi

/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop
~
~

e ora ho questo, che sembra buono? https://ssl-tools.net/webservers/extrahostname.myforum.us

Sembra giusto? Se sì, modificherò l’OP per includere la direttiva global.

2 Mi Piace

La mia idea:

    # dire a letsencrypt quali certificati aggiuntivi ottenere
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d www.rpg-foren.com --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--installcert \//
        to:  |
          --installcert \
          -d www.rpg-foren.com
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--installcert --ecc \//
        to:  |
          --installcert --ecc \
          -d www.rpg-foren.com

Il mio non funziona? Ha 1/3 in meno di righe di codice.

Non vedo una riscrittura da parte tua? o mi sfugge qualcosa?
volevo solo fare una bella riscrittura in modo che il file abbia un bell’aspetto alla fine^^

Non l’ho ancora fatto. Stavo aspettando di vedere se pensavi che funzionasse.

Ecco la modifica, ho solo aggiunto global: true alla fine del secondo replace:

    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d =domain2=  --fullchainpath"
        global: true

e questo è tutto:

  after_ssl:
   # tell letsencrypt what additional certs to get
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--keylength/
        to: "-d extrahostname.myforum.us --keylength"
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /--fullchainpath/
        to: "-d extrahostname.myforum.us  --fullchainpath"
        global: true


1 Mi Piace

ok, quindi global è il parametro di cui hai bisogno per sostituzioni multiple.

sembra buono dai file che hai postato, non l’ho ancora provato.

Sì. Mi dispiace di non aver prestato abbastanza attenzione per capire di cosa stavi parlando prima. Dal mio (cattivo) test, ha “funzionato”, ma non me ne sono accorto e non so come verificare che il certificato ec-qualcosa sia davvero lì. Grazie per la tua perseveranza.

https://ssl-tools.net/webservers/extrahostname.myforum.us fa sembrare che abbia la roba giusta?

Ho modificato l’OP ora, così puoi provarci e copiare/incollare dal modulo sopra.

Se vuoi testare da solo su un sito di prova e puoi inviarmi una chiave SSH, ti darò accesso a quello che ho appena configurato. Quindi puoi fare un’installazione pulita lì con il tuo dominio di test. Oppure, puoi semplicemente farlo sul tuo sito di produzione e sperare per il meglio. :person_shrugging:

Puoi trovarlo qui:

ls -la /var/discourse/shared/standalone/ssl/
total 24
drwxr-xr-x  2 root root 4096 Sep 24 13:02 .
drwxr-xr-x 15 root root 4096 Sep 23 18:31 ..
-rw-r--r--  1 root root 3941 Sep 25 07:43 rpg-foren.com.cer
-rw-r--r--  1 root root 3941 Sep 25 07:43 rpg-foren.com_ecc.cer
-rw-------  1 root root 3243 Sep 25 07:43 rpg-foren.com_ecc.key
-rw-------  1 root root 3243 Sep 25 07:43 rpg-foren.com.key

il problema è che non so come testare individualmente ecc e rsa.
dato che il file di creazione ora è corretto, non sono necessari ulteriori test.

1 Mi Piace
root@test-web-only:/shared/ssl# ls -l
total 16
-rw-r--r-- 1 root root 3953 Sep 25 16:41 test.myforum.us.cer
-rw-r--r-- 1 root root 2877 Sep 25 16:41 test.myforum.us_ecc.cer
-rw------- 1 root root  227 Sep 25 16:41 test.myforum.us_ecc.key
-rw------- 1 root root 3247 Sep 25 16:41 test.myforum.us.key

Bene. Se pensi che vada bene, sposterò questa discussione in un nuovo argomento poiché si spera che sia risolta.

1 Mi Piace

puoi testare il certificato in questo modo:

openssl x509 -in /var/discourse/shared/standalone/ssl/test.myforum.us.cer -noout -text
quindi i domini dovrebbero essere elencati sotto dns:
DNS:rpg-foren.com, DNS:www.rpg-foren.com

1 Mi Piace
root@test:/var/discourse# openssl x509 -in /var/discourse/shared/web-only/ssl/test.myforum.us.cer -noout -text
Certificato:
    Dati:
        Versione: 3 (0x2)
        Numero di serie:
            03:f8:b5:6a:e0:97:53:7f:22:33:81:22:35:b4:3f:73:75:7f
        Algoritmo di firma: sha256WithRSAEncryption
        Emittente: C = US, O = Let's Encrypt, CN = R10
        Validità
            Non prima del: 25 set 14:57:13 2024 GMT
            Non dopo il: 24 dic 14:57:12 2024 GMT
        Soggetto: CN = test.myforum.us
        Informazioni sulla chiave pubblica del soggetto:
            Algoritmo chiave pubblica: rsaEncryption
                Chiave pubblica: (4096 bit)
                Modulus:
                    00:be:a3:9b:79:78:dd:8f:e2:8f:28:f0:d9:6c:74:
...                    b0:84:33
                Esponente: 65537 (0x10001)
        Estensioni X509v3:
            Utilizzo chiave X509v3: critico
                Firma digitale, Cifratura chiave
            Utilizzo esteso chiave X509v3:
                Autenticazione server web TLS, Autenticazione client web TLS
            Vincoli di base X509v3: critico
                CA:FALSE
            Identificatore chiave soggetto X509v3:
                43:55:B7:D6:54:03:CE:B0:FB:C8:D1:2A:42:F5:B7:C5:60:C7:D8:48
            Identificatore chiave autorità X509v3:
                BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8
            Accesso informazioni autorità:
                OCSP - URI:http://r10.o.lencr.org
                Emittenti CA - URI:http://r10.i.lencr.org/
            Nome alternativo soggetto X509v3:
                DNS:extrahostname.myforum.us, DNS:test.myforum.us
            Criteri certificato X509v3:
                Policy: 2.23.140.1.2.1
            SCT Precertificato CT:
                Timestamp certificato firmato:
                    Versione: v1 (0x0)
                    ID log: DF:E1:56:EB:AA:05:AF:B5:9C:0F:86:71:8D:A8:C0:32:
                                4E:AE:56:D9:6E:A7:F5:A5:6A:01:D1:C1:3B:BE:52:5C
                    Timestamp: 25 set 15:55:44.143 2024 GMT
                    Estensioni: nessuna
                    Firma: ecdsa-with-SHA256
                    Timestamp certificato firmato:
                    Versione: v1 (0x0)
                    ID log: A2:E3:0A:E4:45:EF:BD:AD:9B:7E:38:ED:47:67:77:53:
                                D7:82:5B:84:94:D7:2B:5E:1B:2C:C4:B9:50:A4:47:E7
                    Timestamp: 25 set 15:55:45.945 2024 GMT
                    Estensioni: nessuna
                    Firma: ecdsa-with-SHA256
    Algoritmo di firma: sha256WithRSAEncryption
    Valore firma:
        cf:c6:59:d8

e questo include:

            Nome alternativo soggetto X509v3:
                DNS:extrahostname.myforum.us, DNS:test.myforum.us

Ah. OK.

openssl x509 -in /var/discourse/shared/web-only/ssl/test.myforum.us_ecc.cer -noout -text

contiene:

            Nome alternativo soggetto X509v3:
                DNS:extrahostname.myforum.us, DNS:test.myforum.us
1 Mi Piace