작업실

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

컨텐츠 정보

본문

 

 

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
등록된 댓글이 없습니다.
전체 157 / 3 페이지
RSS

최근글


새댓글


알림 0