여러 도메인으로 Let's Encrypt를 사용할 때 ECC 인증서가 작동하지 않았습니다

인증서 갱신을 시작하려면 /shared/ssl에서 기존 인증서를 단순히 삭제하면 되나요?

재빌드할 때마다 항상 그렇게 되는 것 같으니, 아무것도 삭제할 필요가 없습니다.

인증서가 어제 발급되었기 때문에, 일반적으로 LE 스크립트에는 --force가 필요합니다. 이제 기존 인증서를 이름 변경하고 재구성을 테스트하고 있습니다.

아마도 이것이 작동하지 않는 것 같습니다. 두 번째 도메인이 입력되지 않습니다: https://ssl-tools.net/webservers/rpg-foren.com

모든 것이 올바르게 대체된 것으로도 보이지 않으며, ecc 파일에 서브도메인이 누락되어 있습니다:

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

방금 다음 명령어를 수동으로 실행했는데, 이제 인증서가 맞습니다:

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

전달(forwarding)을 위한 제 rewrite 설정은 다음과 같습니다:

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

replace 명령어가 한 번만 실행될 수 있을까요?

인증서가 이제 유효한 것으로 보입니다?

리다이렉트는 체인의 다른 곳에서 처리되는 것으로 생각되며, 이를 위해 별도로 할 필요가 없을 것 같습니다. 해당 부분을 yml 파일에서 제거하는 것이 좋겠습니다.

이제 예상대로 작동하는 것 같습니다.

네, 하지만 훅을 통해 설정한 것이 아니라 수동으로 설정했습니다. 훅이 올바르게 처리하지 못했기 때문입니다.

www. 서브도메인에서 메인 도메인으로의 리다이렉트를 말씀하시는 건가요? 적어도 nginx를 통해서는 아닙니다. nginx에는 URL이 정의되어 있지 않아 웹 서버가 모든 수신 도메인에 응답합니다.

.
저에게는 잘 작동합니다 (아래 참조).

사이트로 해석되는 모든 것이 호스트네임으로 리디렉션된다는 의미입니다. 표준 설치 환경에서는 IP 주소를 입력하면 https://hostname으로 리디렉션됩니다. (아래 참조)

저는 방금 이 설정을 마쳤습니다. https://dashboard.literatecomputing.com/ 를 사용하여 새로운 표준 설치를 생성하고, 위 domain2 필드에 extrahostname.myforum.us를 입력한 후, 생성된 after_ssl 훅을 web_only.yml 파일의 hooks: 바로 뒤에 복사/붙여넣었습니다. (이 작업을 스크립트가 데이터 컨테이너를 빌드하는 동안 수행했기 때문에, 첫 번째 빌드가 완료된 후 다시 빌드할 필요가 없었습니다!)

다음은 모두 예상대로 작동합니다:

내일 또는 기억나면 위의 사이트를 삭제하겠습니다.

이것은 rsa와 ecc 설치 스크립트 모두에서 하위 도메인이 /etc/runit/1.d/letsencrypt에 저장된다는 뜻인가요?
위에서 볼 수 있듯이, 훅은 rsa 부분에는 하위 도메인을 저장했지만 ecc 부분에는 저장하지 않았습니다.

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

여기 /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")" ]]
}

########################################################
# RSA 인증서
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # 문제가 발생하면 인증서를 다시 발급받으려 시도
  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"

########################################################
# ECDSA 인증서
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # 문제가 발생하면 인증서를 다시 발급받으려 시도
  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

아. RSA(나쁜) 인증서에는 있지만 ECC(좋은) 인증서에는 없다는 걸 알겠네요.

좋아요. 이제 이해가 갑니다. 그 --fullcert 스탠사에 global: true가 필요합니다. 지금 테스트 중입니다.

좋습니다. 새로운 ‘/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")" ]]
}

########################################################
# RSA 인증서
########################################################
issue_cert "4096"

if ! cert_exists ""; then
  # 문제가 발생하면 인증서를 다시 발급받으려 시도
  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"

########################################################
# ECDSA 인증서
########################################################
issue_cert "ec-256"

if ! cert_exists "_ecc"; then
  # 문제가 발생하면 인증서를 다시 발급받으려 시도
  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
~
~

이제 이 결과가 나왔는데, 괜찮아 보이나요? https://ssl-tools.net/webservers/extrahostname.myforum.us

이렇게 설정한 것이 올바른가요? 그렇다면 global 지시문을 포함하도록 OP를 수정하겠습니다.

내 아이디어:

    # letsencrypt에 추가적으로 발급받을 인증서를 지정
    - 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

제 코드는 안 되는 건가요? 코드 줄 수가 1/3 정도 더 적거든요.

재작성한 내용을 보지 못했어요? 아니면 제가 뭘 놓친 건가요?
마지막에 파일이 깔끔하게 보이도록 좋은 재작성을 하고 싶었을 뿐이에요^^

아직 하지 않았습니다. 그게 작동한다고 생각했는지 확인을 기다리고 있었거든요.

변경 사항은 두 번째 replace: 끝에 global: true를 추가하는 것입니다.

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

그리고 전체 내용은 다음과 같습니다:

  after_ssl:
   # letsencrypt에 추가적으로 발급받을 인증서를 지정합니다
    - 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


음, 그래서 여러 번 치환하려면 global이 필요한 매개변수네요.

올려준 파일들을 보면 괜찮아 보이는데, 아직 직접 시도해 보지는 못했어요.

네. 방금 전에 무슨 말을 하는지 제대로 주의를 기울이지 못해서 죄송합니다. 제 (잘못된) 테스트에서는 "동작"하는 것처럼 보였지만, 제가 알아채지 못했고 ec-whatever 인증서가 실제로 존재하는지 확인하는 방법도 모르겠습니다. 끈질기게 알려주셔서 감사합니다.

https://ssl-tools.net/webservers/extrahostname.myforum.us 를 보면 제대로 설정된 것처럼 보이나요?

지금 OP를 수정했으니, 시도해 보시고 위 양식에서 복사/붙여넣기해 보세요.

테스트 사이트에서 직접 테스트해 보고 싶으시다면 SSH 키를 보내 주시면 방금 설정한 서버에 접근 권한을 드리겠습니다. 그러면 거기서 여러분 자신의 테스트 도메인으로 깨끗한 설치를 진행할 수 있습니다. 아니면, 그냥 프로덕션 사이트에서 진행하시고 최선의 결과를 기대하는 것도 방법입니다. :person_shrugging:

여기서 찾을 수 있습니다:

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

문제는 ecc와 rsa를 개별적으로 테스트하는 방법을 모른다는 것입니다.
생성 파일이 이제 적합하므로 추가 테스트는 필요하지 않습니다.

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

좋네요. 이 상태가 괜찮다고 생각하시면, 이제 해결되었기를 바라면서 이 토론을 새로운 주제로 옮기겠습니다.

인증서는 다음과 같이 테스트할 수 있습니다:

openssl x509 -in /var/discourse/shared/standalone/ssl/test.myforum.us.cer -noout -text
그 후 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                                  

그리고 여기에는 다음이 포함되어 있습니다:

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

아, 그렇군요.

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

에는 다음이 포함되어 있습니다:

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