Nginx에서 RSA와 ECDSA 하이브리드 인증서 설정하기
컨텐츠 정보
- 15,042 조회
- 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개월에 한번씩 생성해줘야 합니다.
-
등록일 2020.10.10그누보드 SMTP 외부메일 설정하는 방법댓글 26
-
등록일 2020.10.03그누보드5에 실시간 채팅 구축하기댓글 13
-
등록일 2020.09.26
-
등록일 2020.09.24도커로 메일서버 구축하기댓글 4
관련자료
-
서명우성짱의 NAS를 운영하고 있습니다.
저의 즐거움이 여러분의 즐거움이면 좋겠습니다.
-
링크