작업실

Nginx에서 RSA와 ECDSA 하이브리드 인증서 설정하기

우성군 0 3371 0

 

 

0. 하이브리드 인증서 생성 이유

 

Nginx 1.11.0 부터 인증서를 2개 설정 가능합니다. RSA, ECDSA 인증서를 모두 적용하면 오래된 브라우저 지원을 하면서도 최고의 퍼포먼스를 낼 수 있습니다. 그리고 ECDSA는 EC 알고리즘을 사용하기 때문에 RSA보다 작은키를 사용해도 해독하기 더 어렵다고 합니다. 기존 letsencrypt 명령어를 이용하여 정상적으로 인증서를 받은 후 진행하는 것입니다. 기존 명령어로 생성하면 RSA 인증서가 생성된 것입니다. 이제 ECDSA 인증서를 생성할 차례입니다.

 

참고 : http://www.solanara.net/solanara/openssl#head_openssl_certs_ecdsa

참고 : https://scotthelme.co.uk/hybrid-rsa-and-ecdsa-certificates-with-nginx

 

 

1. ECDSA 인증서 생성하기 (Letsencrypt 기준)

 

mkdir /etc/letsencrypt/ecdsa

cd /etc/letsencrypt/ecdsa

위 명령어로 ECDSA용 폴더를 생성 후 경로로 들어갑니다. 해당 경로에 pem 인증서가 생성될 것입니다. 

 

 

openssl ecparam -genkey -name secp384r1 > "/etc/letsencrypt/ecdsa/privkey.pem"

위와 같이 ECDSA용 개인key를 생성합니다. 

 

 

cat /etc/ssl/openssl.cnf > "/etc/letsencrypt/ecdsa/openssl.cnf"

echo "[SAN]" >> "/etc/letsencrypt/ecdsa/openssl.cnf"

위와 같이 Openssl 설정파일을 생성합니다. 

 

 

 

1) 도메인이 1개일 때

 

echo "subjectAltName=DNS:yourhomepage.com" >> "/etc/letsencrypt/ecdsa/openssl.cnf"

도메인이 하나일 경우에 위와 같이 하나만 넣으면 됩니다. 그러면 [SAN] 밑에 해당 도메인이 들어갑니다. 

 

 

2) 도메인이 여러개일 때

 

echo "subjectAltName=DNS.1:www.yourhomepage.com ,DNS.2:yourhomepage.com ,DNS.3:1.yourhomepage.com ,DNS.4:2.yourhomepage.com ,DNS.5:3.yourhomepage.com ,DNS.6:4.yourhomepage.com ,DNS.7:5.yourhomepage.com" >> "/etc/letsencrypt/ecdsa/openssl.cnf"

추가하고 싶은 도메인이 많다면 위와 같이 하시면 됩니다. 

 

 

openssl req -new -sha256 -key "/etc/letsencrypt/ecdsa/privkey.pem" -nodes -out "/etc/letsencrypt/ecdsa/request.csr" -outform pem -subj "/O=yourhomepage.com/emailAddress=yourhomepage@email.com/CN=yourhomepage.com" -reqexts SAN -config "/etc/letsencrypt/ecdsa/openssl.cnf"

위 내용은 key를 이용하여 자동으로 CSR 파일을 생성하는 것이고 

 

 

openssl req -new -sha256 -key "/etc/letsencrypt/ecdsa/privkey.pem" -nodes -out "/etc/letsencrypt/ecdsa/request.csr" -outform pem  -reqexts SAN -config "/etc/letsencrypt/ecdsa/openssl.cnf"

위 내용은 key를 이용하여 수동으로 CSR 파일을 생성 하는 것입니다. 수동이나 자동 둘중 하나를 실행해줍니다. 

 

 

 

1) 도메인이 하나일 때

 

letsencrypt certonly --webroot -w /var/www -d yourhomepage.com --email "yourhomepage@email.com" --csr "/etc/letsencrypt/ecdsa/request.csr"

 

 

2) 도메인이 여러개일 때

 

letsencrypt certonly -a webroot --webroot-path=/var/sitea/ -d www.yourhomepage.com --webroot-path=/var/siteb/ -d yourhomepage.com -d 1.yourhomepage.com --webroot-path=/var/sitec/ -d 2.yourhomepage.com --webroot-path=/var/sited/ -d 3.yourhomepage.com --webroot-path=/var/sitee/ -d 4.yourhomepage.com --webroot-path=/var/sitef/ -d sitef.site.com --webroot-path=/var/siteg/ -d 5.yourhomepage.com  --email "yourhomepage@email.com" --csr "/etc/letsencrypt/ecdsa/request.csr"

위와 같은 형식으로 인증서를 생성할 수 있습니다.  

 

 

 

ConfigurationError: Inconsistent domain requests:

From the CSR: www.yourhomepage.com

From command line/config: www.yourhomepage.com, www.yourhomepage.com

 

혹시나 위와 같이 CSR 파일의 SAN과 config 파일이 일치하지 않는다고 나오면, 인증서 생성시 -d yourhomepage.com 이 부분을 제거하고 시도해보시길 바랍니다. 참고로 SAN이 2개일 때 해당 증상이 나와 CN에 입력한 도메인을 제거 후 나머지 하나만 넣으니 제대로 진행되었습니다.

 

 

정상적으로 인증서가 생성되면

 

No handlers could be found for logger "letsencrypt.crypto_util"

 

IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at

   /etc/letsencrypt/ecdsa/0001_chain.pem. Your cert will expire on

   2017-01-09. To obtain a new version of the certificate in the

   future, simply run Let's Encrypt again.

 - If you like Let's Encrypt, please consider supporting our work by:

 

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le

위와 같이 생성됩니다. 

 

 

 

2. Nginx 설정

 

ssl_ciphers EECDH+CHACHA20:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

ssl_certificate_key /etc/letsencrypt/ecdsa/privkey.pem;

ssl_certificate /etc/letsencrypt/ecdsa/0001_chain.pem;

ssl_ecdh_curve secp384r1;

Nginx 설정에는 위와 같은 내용이 기존 RSA 인증서 밑에 추가로 넣어주시면 됩니다.

 

ssl_ciphers는 기존 것을 지우고 위 내용을 넣어주시면 좋습니다. SSLlabs에서 A+ 뜨는 값입니다. 

 

 

 

3. Certificate Transparency 설정 (Nginx 기준)

 

Certificate Transparency를 사용 중이라면 해당 인증서에 대한 로그를 각각 받아 경로를 지정해줘야 합니다. sct 폴더는 2개 지정되어도 상관없더라구요.

 

ssl_ct_static_scts /etc/letsencrypt/ecdsa/scts;

ssl_ct_static_scts /etc/letsencrypt/live/yourhomepage.com/scts;

저는 위와 같이 둘다 넣어주니 CT 인증 잘 받았습니다. 

 

 

 

4. OCSP 관련

 

Nginx에는 ssl_trusted_certificate 가 1개만 경로지정이 가능합니다. 그런데 chain 인증서의 경우 둘다 letencrypt 인증서이기 때문에 똑같습니다.

 

ssl_trusted_certificate /etc/letsencrypt/ecdsa/0000_chain.pem

위와 같이 지정해주거나 

 

 

ssl_trusted_certificate /etc/letsencrypt/live/yourhomepage.com/chain.pem;

위와 같이 기존 RSA 인증서의 chain 인증서를 지정해주면 됩니다.  ssl_trusted_certificate는 각 server 블록당 1개만 지정 가능합니다.

 

 

 

각 인증서마다 OSCP Stapling 확인이 가능합니다.

 

echo QUIT | openssl s_client -cipher 'ECDHE-ECDSA-AES128-GCM-SHA256' -connect www.yourhomepage.com:443 -status 

위 명령어로 ECDSA 인증서의 OCSP Stapling를 볼 수 있고, 

 

 

 

echo QUIT | openssl s_client -cipher 'ECDHE-RSA-AES128-GCM-SHA256' -connect www.yourhomepage.com:443 -status

위 명령어로 기존 RSA 인증서의 OCSP Stapling을 볼 수 있습니다. 

 

다만 OCSP Stapling의 특성상 해당 인증서로 한번은 웹브라우저로 접속이 되어야 성공적으로 OCSP Stapling 이 나타납니다.

 

 

5. Auto Renew 문제

 

ECDSA 인증서의 가장 큰 문제점은 자동 리뉴얼이 불가능한 것입니다. 그 이유는 커스텀된 CSR 파일을 이용하기 때문입니다. 그래서 특수한 스크립트(https://scotthelme.co.uk/setting-up-le/)를 이용하거나 3개월에 한번씩 생성해줘야 합니다.

, , , , , , ,

0 Comments