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.
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:
- http://104.131.101.148
- https://test.myforum.us/
- http://test.myforum.us/
- https://extrahostname.myforum.us/
- http://nocert.myforum.us/
- https://nocert.myforum.us/ (falha com certificado inválido, redireciona se você aceitar)
Excluirei o site acima amanhã ou quando me lembrar.
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.
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.
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
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. ![]()
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.
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.
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
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