SSL의 정석 (아파치 & nginx) > 개발자팁

개발자팁

개발과 관련된 유용한 정보를 공유하세요.
질문은 QA에서 해주시기 바랍니다.

SSL의 정석 (아파치 & nginx) 정보

웹서버 SSL의 정석 (아파치 & nginx)

본문

원본글 위치: https://www.xpressengine.com/tip/23021383

 

 

서버에 SSL을 설치할 때 인증서는 어찌어찌 집어넣으면 되는데, 그 밖의 설정들에는 별로 신경쓰지 않는 경우가 대부분입니다. 실제 보안은 인증서가 아닌 그 밖의 설정들이 좌우하는데 말이죠.

 

그래서 몇십만 원짜리 최고급 인증서를 샀는데도 불구하고 SSL Server Test 사이트에서 검사를 해보면, 몇천 원짜리 인증서를 사용하는 사이트보다 오히려 못한 경우가 수두룩해요.

 

이 글에서는 SSL 인증서를 구입하고 아파치와 nginx에 설치하는 방법을 정확하게 안내해 드리겠습니다. 언제 작성되었는지도 모르는 정체불명의 블로그에서 설정 막 복사해다 쓰지 마시고, 이 글을 참고해서 안전하게 설정하세요.

 

요약 : 그냥 따라하시면 됩니다.

 

 

 

1. 개인키 생성하기

 

명령 :  openssl genrsa -out example.com.key 2048

 

example.com.key 파일에 개인키가 저장됩니다. 암호는 없는 상태입니다. 대개 서버에 SSL을 설치할 때는 암호가 없는 개인키를 사용합니다. 암호가 있는 개인키를 사용하면 재부팅시 웹서버가 자동으로 실행되지 않기 때문인데요... 그 대신 개인키는 반드시 관리자(root)만 접근할 수 있도록 퍼미션을 600으로 해주세요.

 

개인키는 (호스팅 업체를 제외하면) 어느 누구에게도 주어서는 안됩니다. 인증서 발급 업체에도 주면 안됩니다. (달라고 하지도 않습니다.)

 

 

 

2. 인증서 서명 요청(CSR) 생성하기

 

명령 :  openssl req -new -sha256 -key example.com.key -out example.com.csr

 

아까 만든 개인키를 사용해서 인증서 서명 요청을 생성하고, example.com.csr 파일에 저장합니다. 몇 가지 질문을 하는데, Common Name을 제외하면 크게 중요하지 않습니다. 업체에 따라 국가, 도시명, 회사이름 등을 정확하게 입력하라고 요구하기도 하고, 안 하기도 합니다.

 

Common Name은 반드시 님의 도메인을 정확하게 입력해야 합니다. (예: www.example.com)

 

대개 www.example.com으로 신청하면 www.example.com, example.com 모두 사용 가능한 인증서가 발급됩니다. 그 밖의 서브도메인으로 신청하면 이런 배려를 보장할 수 없습니다.

 

 

 

3. 인증서 구입하기

 

인증서 구입 방법은 업체마다 다르기 때문에 자세히 설명하지 않겠습니다. 보통은 아래와 같은 순서로 진행됩니다.

 

상품선택 → 결제 → CSR 업로드 → (아래 설명 참조) → 인증에 사용할 메일주소 선택 → (기다리세요) → 인증메일 도착 → 링크 클릭 또는 인증코드 입력 → (기다리세요) → 인증서 발급완료 통지 → 첨부파일 또는 구입처 웹사이트에서 인증서 다운로드

 

발급업체에 따라서는 CSR 업로드 직후에 서명 방식을 선택하라고 하는 경우가 있습니다. 선택 가능한 방식은 SHA1과 SHA2(SHA256)이 있는데요... SHA1은 1년짜리 인증서에만 사용하실 수 있습니다. 2~3년짜리에 사용하면 크롬에서 에러가 납니다. 반면, 윈도우 XP SP2 이하에서는 SHA256 인증서를 이용한 서버에 접속할 수 없습니다. 두 마리 토끼를 모두 잡을 수는 없으니 신중하게 결정하세요.

 

 

 

4. 중간 인증서 확보 및 정리하기

 

이 단계가 매우 중요합니다. 특히 StartSSL이나 PositiveSSL처럼 인기가 많은 저렴한 인증서는 "중간 인증서", "체인 인증서", 또는 "CA 인증서"라고 하는 별도의 인증서가 따라오는데, 이것을 정확한 순서대로 모두 설치해야 모든 브라우저에서 제대로 인식이 되거든요.

 

비싼 인증서는 발급업체에서 직접 님의 신원을 보증하는 데 비해, 저렴한 인증서는 갑-을-병-정을 거쳐서 연대보증이 이루어진다고 생각하면 간단합니다.

 

아래의 인증서 번호를 잘 기억해 두세요. 나중에 서버 설정할 때 아주 중요합니다.

 

[참고]

 

PositiveSSL에서 SHA256로 서명한 인증서를 구입하면 아래와 같이 3개의 인증서가 제공됩니다. 

간혹 2~3을 ca-bundle이라는 이름으로 함께 묶어서 제공하기도 합니다.

  1. 님이 구입한 인증서
  2. COMODO RSA Domain Validation Secure Server CA
  3. COMODO RSA Certification Authority

StartSSL 무료 인증서의 경우에는 아래와 같은 3개의 인증서가 필요합니다.

2~3이 메일에 따라오지 않았다면 StartSSL 사이트에서 별도로 다운받으세요.

  1. 님이 구입한 인증서
  2. StartCom Class 1 Primary Intermediate Server CA
  3. StartCom Certification Authority

※ 중간 인증서의 정확한 이름은 발급업체의 정책에 따라 변경될 수 있습니다.

 

 

 

5. 서버에 설치하기

 

개인키와 모든 인증서를 서버의 적당한 위치에 복사하세요. 절대로 웹상에서 접근할 수 있는 경로에 넣으면 안됩니다!  

 

개인적으로는 관리자만 접근할 수 있는 /root 폴더 내에 넣어버리는 것을 추천합니다. 소유자는 관리자(root)로 바꾸고, 퍼미션은 모조리 600으로 해주세요.

 

인증서 서명 요청(CSR)은 더이상 필요하지 않습니다. 원하시면 보관해 두어도 되지만, 딱히 이게 또 필요한 경우는 본 적이 없네요.

 

 

5-1. 아파치

 

님의 인증서는 그대로 두고, 2~3번 인증서를 하나의 파일로 합칩니다. 반드시 2번이 먼저 오고, 빈 줄 없이 곧바로 3번 인증서가 붙고, 마지막에도 빈 줄이 없어야 합니다.

 

그리고 적당한 <VirtualHost IP주소:443> 블록 안에 아래와 같이 설정합니다.

 

SSLEngine on
SSLCertificateFile      /폴더/경로/1번.인증서.파일명
SSLCertificateChainFile /폴더/경로/2~3번.인증서.붙인거.파일명
SSLCertificateKeyFile   /폴더/경로/개인키.파일명

 

 

5-2. nginx

 

님의 인증서, 2~3번 인증서를 모두 하나의 파일로 합칩니다. 반드시 님의 인증서가 제일 먼저, 그 다음에 2번, 마지막에 3번이 붙어야 합니다. 처음, 중간, 또는 맨 끝에 빈 줄이 있으면 안 됩니다.

 

그리고 적당한 server { listen 443 ssl; } 블록 안에 아래와 같이 설정합니다.


ssl_certificate /폴더/경로/123번.인증서.모두.합친.파일명;
ssl_certificate_key /폴더/경로/개인키.파일명;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;

 

각 줄의 맨 마지막에 세미콜론(;)이 들어가는 것에 주의하세요.

 

 

 

6. 암호화 알고리듬 설정하기

 

실제로 보안을 제공하는 것은 인증서가 아니라 암호화 알고리듬입니다. 인증서는 일종의 자격증에 불과하고요. 암호화 알고리듬 설정을 잘 하면 몇천 원짜리 인증서로도 최고의 보안을 얻을 수 있고, 반대로 설정을 잘못하면 몇십만 원짜리 인증서를 사용하더라도 쉽게 뚫립니다.

 

위의 5-1, 5-2처럼 설정하고 끝내면 기본값 그대로 사용하게 되는데, 아파치와 nginx 모두 기본값은 보안이 안습입니다. 그래서 기본값을 변경해 주어야 합니다.

 

아래의 알고리듬 및 프로토콜 목록은 모질라 재단에서 추천하는 것을 따랐습니다. IE7 이상, 안드로이드 2.3 이상, 크롬, 파이어폭스, 오페라, 사파리 등 대부분의 최신 브라우저와 호환됩니다.

 

IE6까지 호환되도록 하려면 애꿎은 최신 브라우저 사용자들의 보안이 약해질 수 있습니다. 여기서는 과감하게 IE6을 버리도록 하겠습니다.

 

반드시 IE6과 호환되는 설정이 필요하신 분은

  - 아파치: 아래의 설정에서 -SSLv3를 지우세요.

  - nginx: 아래의 설정에서 TLSv1 앞에 SSLv3를 추가하세요.

  - 여기를 참고해서 알고리듬 목록을 변경하세요.

 

 

6-1. 아파치

 

아래와 같이 설정합니다. 알고리듬 목록이 상당히 길죠? 최대한 다양한 버전의 브라우저에서 최대한의 보안을 얻을 수 있도록 모질라 재단에서 엄선한 암호화 알고리듬 목록입니다.

 

SSLProtocol all -SSLv2 -SSLv3


SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA


SSLHonorCipherOrder on

 

 

6-2. nginx

 

아래와 같이 설정합니다. 알고리듬 목록은 아파치와 동일합니다. 설정 문법이 약간 다른 것 뿐이예요.

 

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;


ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';


ssl_prefer_server_ciphers on;

 

 

 

7. 보너스: DH Param & OCSP Stapling (귀찮으신 분은 안 해도 됩니다.)

 

DH Param은 일부 암호화 알고리듬에 사용되는 커다란 난수 하나를 미리 생성해 두어서 암호화 성능을 향상시키고 보안을 높이는 방법입니다.

 

OCSP Stapling은 님의 인증서가 유효하다는 증명을 미리 받아두어서 사용자가 님의 사이트에 처음 방문할 때 접속 속도를 높여주는 방법입니다.

 

DH Param은 아래의 명령을 사용해서 생성합니다. (nginx에서만 사용 가능)

 

openssl dhparam -out example.com.dhparam 1024

 

몇 분 가량 걸릴 수도 있으니, 서버가 응답하지 않는 것 같아도 걱정하지 마세요. 더 강한 보안을 원하신다면 2048비트로 해도 되지만, 일부 프로그램과의 호환성이 떨어질 수 있습니다.

 

OCSP Stapling에 사용되는 파일은 아파치의 중간 인증서와 같습니다. 즉, 2번 인증서와 3번 인증서를 순서대로 붙이면 됩니다. 확장자는 ocsp라고 해주세요. 아파치의 경우에는 중간 인증서 파일을 그대로 사용하기 때문에 별도로 만들 필요 없습니다.

 

이렇게 생성한 dhparam 파일과 ocsp 파일을 인증서 및 개인키와 같은 경로에 저장하고, 인증서 및 개인키와 마찬가지로 퍼미션을 제한해 주세요.

 

주의: StartSSL에서 인증서를 구입하신 경우, 약 24시간 동안은 OCSP Stapling을 사용하지 않는 것이 좋습니다. 인증서 구입 직후에는 오히려 인증서가 유효하지 않다고 나옵니다.

 

 

7-1. 아파치

 

아파치는 DH Param을 지원하지 않습니다.

 

아파치 2.4 이상에서는 아래의 설정으로 OCSP Stapling을 적용할 수 있습니다.

 

SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)

 

위의 설정에 사용되는 shmcb:/var/run... 이 설정은 바꾸지 않아도 됩니다. ocsp 파일 경로를 지정하는 것이 아니라 내부적으로 사용하는 캐시파일 경로거든요.

 

 

7-2. nginx

 

아래와 같이 설정합니다.

 

ssl_dhparam /폴더/경로/아까.생성한.dhparam;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /폴더/경로/2~3번.인증서.붙인거.파일명;
resolver 8.8.8.8 8.8.4.4;

 

resolver는 내부적으로 인증서 발급업체와의 통신을 위해 사용하는 네임서버입니다. 일반 서버호스팅은 IDC에서 제공하는 네임서버 성능이 좋지 않아서 오히려 더 느려지는 경우가 있으므로, 구글에서 제공하는 네임서버로 셋팅해 줍니다.

 

 

 

8. 테스트해 보기

 

SSL Server Test 사이트에서 님의 도메인을 입력해 보세요. 

이것저것 테스트한 후에 점수를 알려 줍니다.

 

A등급이 나오면 SSL이 완벽하게 설치된 것입니다.

단, 오래된 브라우저와의 호환성이 떨어질 수 있습니다.

 

B등급이 나오면 상당히 잘 설치된 것이고, 대부분의 브라우저와 호환됩니다.

 

C등급 이하는 수업 끝나고 남으세요 ^^

 

 

추천
8

댓글 5개

전체 5,352
개발자팁 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT