보안인증서 관련 SSL Server Test 등급을 올려야하는데 어떻게 해야할까요?
https://www.ssllabs.com/ssltest/analyze.html?d=englishconnect.kr
워드프레스로 사이트를 구축하고, https 보안인증서를 카페24에서 구매해서 연결해놓았습니다.
위의 사이트는 ssl 보안 관련 점검 사이트인데 보시다시피 B등급이 나옵니다.
A등급이 되어야 해당 사이트의 구축이 회사에서 승인을 해주는데,
카페24에 문이한 결론은 해당 보안인증서의 어플리케이션의 버전이 낮다고, 시간이 소요될것이니 기다려달다라는
답변만 내놓았습니다.
몇 제가 아는 사이트들을 테스트해 보면 A등급을 대부분 맞더라고요.
저는 개발자가 아닌지라 해당 부분을 어떻게 해결해야할지 막막합니다. 어떤 방법으로 하게 되나요?
카페24에서 제공하는 comodo사의 보안인증서 말고 해외에서 보안인증서를 구매해서 재연결해야할까요?
안녕하세요??
SSL Server Test등급에 대한 질문 주셨는데 좀 길긴 하지만 한번 밑에 방법 그대로 따라해보시기 바랍니다^^
1. 개인키 생성하기
명령 : openssl genrsa -out example.com.key 2048
example.com.key 파일에 개인키가 저장됩니다. 암호는 없는 상태입니다.
대개 서버에 SSL을 설치할 때는 암호가 없는 개인키를 사용합니다.
암호가 있는 개인키를 사용하면 재부팅시 웹서버가 자동으로 실행되지 않기 때문인데요...
그 대신 개인키는 반드시 관리자(root)만 접근할 수 있도록 퍼미션을 600으로 해주세요.
개인키는 (호스팅 업체를 제외하면) 어느 누구에게도 주어서는 안됩니다.
인증서 발급 업체에도 주면 안됩니다. (달라고 하지도 않습니다.)
StartSSL의 경우 개인키와 CSR까지 자동으로 생성해 주기도 합니다.
개인적으로 그다지 추천하는 방식은 아닙니다만 (인증서 발급업체에게 개인키가 노출되다니 ㅡ.ㅡ)
이 방식으로 구입하셨다면 1~2단계는 건너뛰셔도 됩니다.
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이라는 이름으로 함께 묶어서 제공하기도 합니다.
님이 구입한 인증서
COMODO RSA Domain Validation Secure Server CA
COMODO RSA Certification Authority
StartSSL 무료 인증서의 경우에는 아래와 같은 3개의 인증서가 필요합니다.
2~3이 메일에 따라오지 않았다면 StartSSL 사이트에서 별도로 다운받으세요.
님이 구입한 인증서
StartCom Class 1 Primary Intermediate Server CA
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 2048
몇 분 가량 걸릴 수도 있으니, 서버가 응답하지 않는 것 같아도 걱정하지 마세요.
OCSP Stapling에 사용되는 파일은 아파치의 중간 인증서와 같습니다.
즉, 2번 인증서와 3번 인증서를 순서대로 붙이면 됩니다. 확장자는 ocsp라고 해주세요.
아파치의 경우에는 중간 인증서 파일을 그대로 사용하기 때문에 별도로 만들 필요 없습니다.
이렇게 생성한 dhparam 파일과 ocsp 파일을 인증서 및 개인키와 같은 경로에 저장하고,
인증서 및 개인키와 마찬가지로 퍼미션을 제한해 주세요.
주의: StartSSL에서 인증서를 구입하신 경우, 약 24시간 동안은 OCSP Stapling을 사용하지 않는 것이 좋습니다.
인증서 구입 직후에 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. 테스트 해보기