Vamos Encrypte com vários domínios não estava funcionando para certificados ECC

Como faço para iniciar a renovação do certificado, basta excluir o antigo em /shared/ssl?

Eu acho que ele sempre faz isso quando é reconstruído, então não há necessidade de excluir nada.

1 curtida

o certificado foi emitido ontem, então normalmente ele precisa de um --force nos scripts do LE. Renomeei os certificados antigos e estou testando uma reconstrução.

Aparentemente, isso não funciona, não recebo o segundo domínio inserido: https://ssl-tools.net/webservers/rpg-foren.com

Também não parece que tudo foi substituído corretamente, o arquivo ecc está faltando o subdomínio:

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

Acabei de executar o seguinte manualmente, agora os certificados se encaixam:

/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 é a minha reescrita para encaminhamento:

   # diga ao letsencrypt quais certificados adicionais obter
    - 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;
          }

É possível que um comando replace seja executado apenas uma vez?

Parece que o certificado é válido agora?

Tenho quase certeza de que os redirecionamentos são tratados em outro lugar na cadeia e você não precisa fazer nada para que isso funcione. Eu provavelmente removeria essa parte do seu arquivo yml.

Parece que está funcionando como esperado agora.

Sim, mas eu o configurei manualmente e não através do hook, porque o hook não o fez corretamente.

você quer dizer do subdomínio www. para o domínio principal? Pelo menos não via nginx. Nenhuma URL é definida lá para que o servidor web responda a todos os domínios de entrada.

.
Funciona para mim (veja abaixo).

Quero dizer que tudo o que se resolve para o site redireciona para o nome do host. Para qualquer instalação padrão, você pode inserir o endereço IP e ele redirecionará para https://hostname. (Veja abaixo)

Acabei de configurar isso, criando uma nova instalação padrão com https://dashboard.literatecomputing.com/, e adicionalmente colando extrahostname.myforum.us no campo domain2 acima e copiando/colando o hook after_ssl resultante imediatamente após hooks: em web_only.yml (e fiz isso enquanto o script estava construindo o contêiner de dados, então não precisei reconstruir depois que ele terminou pela primeira vez!).

Todos estes funcionam como esperado:

1 curtida

Isso significa que o subdomínio é armazenado em /etc/runit/1.d/letsencrypt para o script de instalação rsa e ecc?
Como você pode ver acima, o hook armazenou apenas o subdomínio na parte rsa, mas não na parte ecc.

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

Aqui 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
  # Tenta emitir o certificado novamente se algo der errado
  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
  # Tenta emitir o certificado novamente se algo der errado
  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. Vejo que está no certificado RSA (ruim), mas não no certificado ECC (bom).

OK. agora entendi. Essa seção --fullcert precisa de global: true nela. Estou testando agora.

2 curtidas

OK. Aqui está o novo ‘/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
  # Tenta emitir o certificado novamente se algo der errado
  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
  # Tenta emitir o certificado novamente se algo der errado
  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 agora tenho isto, que parece bom? https://ssl-tools.net/webservers/extrahostname.myforum.us

Isso parece certo? Se sim, editarei o OP para incluir a diretiva global.

2 curtidas

Minha Ideia:

    # diz ao letsencrypt quais certificados adicionais obter
    - 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

O meu não funciona? Ele tem 1/3 menos linhas de código.

Eu não vejo uma reescrita sua? Ou estou perdendo alguma coisa?
Eu só queria fazer uma reescrita legal para que o arquivo fique bom no final ^^

Ainda não fiz. Estava esperando para ver se você achava que funcionava.

Aqui está a alteração, apenas adicionando global: true ao final do segundo replace:

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

E aqui está tudo:

  after_ssl:
   # diga ao letsencrypt quais certificados adicionais obter
    - 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 curtida

ok, então global é o parâmetro que você precisa para múltiplas substituições.

parece bom pelos arquivos que você postou, ainda não tentei.

Sim. Desculpe por não ter prestado atenção suficiente para entender do que você estava falando antes. Pelo meu (mau) teste, “funcionou”, mas eu não percebi e não sei como verificar se o certificado ec-whatever está realmente lá. Obrigado por ser persistente.

https://ssl-tools.net/webservers/extrahostname.myforum.us faz parecer que ele tem o “Right Stuff”?

Eu editei o OP agora, então você pode tentar e copiar/colar do formulário acima.

Se você quiser testar em um site de teste e puder me enviar uma chave SSH, eu lhe darei acesso ao que acabei de configurar. Então você pode fazer uma instalação limpa lá com seu próprio domínio de teste. Ou, você pode simplesmente fazer isso em seu site de produção e torcer pelo melhor. :person_shrugging:

Você pode encontrá-lo aqui:

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

o problema é que não sei como testar ecc e rsa individualmente.
como o arquivo de criação agora se encaixa, nenhum teste adicional é necessário.

1 curtida
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

Legal. Se você acha que isso parece bom, então vou mover esta discussão para um novo tópico, já que espero que esteja resolvido.

1 curtida

você pode testar o certificado assim:

openssl x509 -in /var/discourse/shared/standalone/ssl/test.myforum.us.cer -noout -text
então os domínios devem ser listados em dns:
DNS:rpg-foren.com, DNS:www.rpg-foren.com

1 curtida
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                                  

e que inclui:

            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 

contém:

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