Encriptar con múltiples dominios no funcionaba para certificados ECC

¿Cómo inicio la renovación del certificado, simplemente elimino el antiguo de /shared/ssl?

Creo que siempre lo hace cuando se reconstruye, así que no hay necesidad de eliminar nada.

1 me gusta

el certificado se emitió ayer, por lo que normalmente necesita un --force en los scripts de LE. Ahora he renombrado los certificados antiguos y estoy probando una reconstrucción.

Aparentemente esto no funciona, no obtengo el segundo dominio ingresado: https://ssl-tools.net/webservers/rpg-foren.com

Tampoco parece que todo se haya reemplazado correctamente, al archivo ecc le falta el subdominio:

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

Acabo de ejecutar lo siguiente manualmente, ahora los certificados encajan:

/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"

esta es mi reescritura para el reenvío:

   # 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;
          }

¿Es posible que un comando de reemplazo solo se ejecute una vez?

¿Parece que el certificado es válido ahora?

Estoy bastante seguro de que las redirecciones se manejan en otro lugar de la cadena y no necesitas hacer nada para que eso funcione. Probablemente eliminaría esa parte de tu archivo yml.

Parece que ahora está funcionando como se esperaba.

Sí, pero la configuré manualmente y no a través del hook, porque el hook no lo hizo correctamente.

¿Te refieres de www.subdominio al dominio principal? Al menos no a través de nginx. No se define ninguna URL allí, por lo que el servidor web responde a todos los dominios entrantes.

.
Me funciona (ver abajo).

Me refiero a que todo lo que se resuelve en el sitio redirige al nombre de host. Para cualquier instalación estándar, puedes introducir la dirección IP y redirigirá a https://hostname. (Ver abajo)

Acabo de configurar esto, creando una nueva instalación estándar con https://dashboard.literatecomputing.com/, y además pegando extrahostname.myforum.us en el campo domain2 de arriba y copiando/pegando el hook resultante after_ssl inmediatamente después de hooks: en web_only.yml (¡y lo hice mientras el script estaba construyendo el contenedor de datos, así que no tuve que reconstruir después de que terminara la primera vez!).

Todos estos funcionan como se esperaba:

1 me gusta

¿Significa esto que el subdominio se almacena en /etc/runit/1.d/letsencrypt tanto para el script de instalación rsa como para el ecc?
Como puede ver arriba, el hook solo ha almacenado el subdominio en la parte rsa pero no en la parte ecc.

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

Aquí está /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")" ]]
}

########################################################
# Certificado RSA
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # Intenta emitir el certificado de nuevo si algo sale mal
  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"

########################################################
# Certificado ECDSA
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Intenta emitir el certificado de nuevo si algo sale mal
  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. Veo que está en el certificado RSA (malo), pero no en el certificado ECC (bueno).

OK. Ahora lo entiendo. Esa sección --fullcert necesita global: true en ella. Lo estoy probando ahora.

2 Me gusta

OK. Aquí está el nuevo ‘/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")" ]]
}

########################################################
# Certificado RSA
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # Intenta emitir el certificado de nuevo si algo sale mal
  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"

########################################################
# Certificado ECDSA
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # Intenta emitir el certificado de nuevo si algo sale mal
  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
~
~

y ahora tengo esto, ¿que parece bien? https://ssl-tools.net/webservers/extrahostname.myforum.us

¿Parece correcto? Si es así, editaré el OP para incluir la directiva global.

2 Me gusta

Mi idea:

    # dile a letsencrypt qué certificados adicionales debe obtener
    - 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

¿El mío no funciona? Tiene 1/3 menos líneas de código.

¿No veo una reescritura tuya? ¿O me estoy perdiendo algo?
Solo quería hacer una buena reescritura para que el archivo se vea bien al final ^^

Todavía no lo he hecho. Estaba esperando a ver si pensabas que funcionaba.

Aquí está el cambio, solo agregando global: true al final del segundo replace:

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

y aquí está todo:

  after_ssl:
   # dile a letsencrypt qué certificados adicionales obtener
    - 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 me gusta

ok, entonces global es el parámetro que necesitas para reemplazos múltiples.

se ve bien por los archivos que publicaste, aún no lo he probado.

Sí. Perdón por no prestar suficiente atención para entender de qué estabas hablando antes. Por mi (mala) prueba, “funcionó”, pero no me di cuenta y no sé cómo comprobar que el certificado ec-whatever realmente está ahí. Gracias por ser persistente.

¿Hace que https://ssl-tools.net/webservers/extrahostname.myforum.us parezca que tiene lo correcto?

He editado el OP ahora, para que puedas intentarlo y copiar/pegar desde el formulario de arriba.

Si quieres probar tú mismo en un sitio de prueba y puedes enviarme una clave SSH, te daré acceso al que acabo de configurar. Luego puedes hacer una instalación limpia allí con tu propio dominio de prueba. O puedes hacerlo en tu sitio de producción y esperar lo mejor. :person_shrugging:

Puedes encontrarlo aquí:

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

el problema es que no sé cómo probar ecc y rsa individualmente.
dado que el archivo de creación ahora encaja, no se requieren más pruebas.

1 me gusta
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

Genial. Si crees que esto se ve bien, entonces voy a mover esta discusión a un nuevo tema ya que espero que esté resuelto.

1 me gusta

puedes probar el certificado de esta manera:

openssl x509 -in /var/discourse/shared/standalone/ssl/test.myforum.us.cer -noout -text
luego los dominios deberían aparecer en dns:
DNS:rpg-foren.com, DNS:www.rpg-foren.com

1 me gusta
root@test:/var/discourse# openssl x509 -in /var/discourse/shared/web-only/ssl/test.myforum.us.cer -noout -text                       
Certificate:                                                                                                                         
    Data:                                                                                                                            
        Version: 3 (0x2)                                                                                                             
        Serial Number:                                                                                                               
            03:f8:b5:6a:e0:97:53:7f:22:33:81:22:35:b4:3f:73:75:7f 
        Signature Algorithm: sha256WithRSAEncryption                                                                                 
        Issuer: C = US, O = Let's Encrypt, CN = R10                                                                                  
        Validity                                                                                                                     
            Not Before: Sep 25 14:57:13 2024 GMT                  
            Not After : Dec 24 14:57:12 2024 GMT                                                                                     
        Subject: CN = test.myforum.us                            
        Subject Public Key Info:                                  
            Public Key Algorithm: rsaEncryption                   
                Public-Key: (4096 bit)                                                                                                                     
                Modulus:                                                                                                             
                    00:be:a3:9b:79:78:dd:8f:e2:8f:28:f0:d9:6c:74: 
...                    b0:84:33                                                                                                                               
                Exponent: 65537 (0x10001)                                                                                                                  
        X509v3 extensions:                                                                                                                                                                
            X509v3 Key Usage: critical                           
                Digital Signature, Key Encipherment               
            X509v3 Extended Key Usage:                           
                TLS Web Server Authentication, TLS Web Client Authentication                                                                                                              
            X509v3 Basic Constraints: critical                                                                                                                                            
                CA:FALSE                                                                                                                                                                  
            X509v3 Subject Key Identifier:                                                                                                                                                
                43:55:B7:D6:54:03:CE:B0:FB:C8:D1:2A:42:F5:B7:C5:60:C7:D8:48                                                                                                                                                              
            X509v3 Authority Key Identifier:                                 
                BB:BC:C3:47:A5:E4:BC:A9:C6:C3:A4:72:0C:10:8D:A2:35:E1:C8:E8                                                                                
            Authority Information Access:                                    
                OCSP - URI:http://r10.o.lencr.org                                                                                                                                                                                        
                CA Issuers - URI:http://r10.i.lencr.org/                                                                                                                                                                                 
            X509v3 Subject Alternative Name:                                                                                                                                                                                             
                DNS:extrahostname.myforum.us, DNS:test.myforum.us                                                                                                                                                                        
            X509v3 Certificate Policies:                                     
                Policy: 2.23.140.1.2.1                                                       
            CT Precertificate SCTs:                                                          
                Signed Certificate Timestamp:                                                                                                                                                                                            
                    Version   : v1 (0x0)                                                                                                                                                                                                 
                    Log ID    : 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 : Sep 25 15:55:44.143 2024 GMT                                 
                    Extensions: none                                                                                                                                                                                                     
                    Signature : ecdsa-with-SHA256                                                                                                                                                                                        
                    Signed Certificate Timestamp:                                                                       
                    Version   : v1 (0x0)                                                                            
                    Log ID    : 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 : Sep 25 15:55:45.945 2024 GMT                                                        
                    Extensions: none                                                                                
                    Signature : ecdsa-with-SHA256                                                                   
    Signature Algorithm: sha256WithRSAEncryption                                                                    
    Signature Value:                                                                                                
        cf:c6:59:d8                                  

y eso incluye:

            X509v3 Subject Alternative Name:                                                 
                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:

            X509v3 Subject Alternative Name: 
                DNS:extrahostname.myforum.us, DNS:test.myforum.us
1 me gusta