07. SSL 연동

인증서 유료 구매 또는 무료 받기

CloudFlare 무료 인증서

COMODO PositiveSSL

ssls.com에서 PositiveSSL 3년 인증서를 14.97 달러에 판매 중이다. 국내 사이트에서 구매할 경우 93,500원이다. 단, 세금계산서를 발행하므로 비용 처리가 쉽다.

example.com 같이 하나의 도메인을 위한 인증서이나 www.example.com 하위 도메인까지는 지원한다.

CSR 신청서 생성

exampe.com 도메인 신청을 위해 CSR 신청서를 아래의 명령어로 만들 수 있다.

openssl req -new -newkey rsa:2048 -nodes -keyout example_com.key -out example_com.csr

위와 같이 명령하면 여러 가지를 물어보는데 이 때 아래 예시와 같이 알맞는 값을 입력한다.

Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:Seoul
Locality Name (eg, city) []:Seoul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company
Organizational Unit Name (eg, section) []:NA
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:ham@example.com


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: 입력안함
An optional company name []: 입력안함

만약 와일드카드로 신청할 경우에는 *.example.com으로 FQDN을 입력한다.

이제 생성된 example_com.csr 파일의 내용을 SSL 인증서 발행 사이트(예, ssls.com)에 제출한다.

example_com.key 비공개키 파일은 시스템 재설치 등으로 분실할 경우에는 절차에 따라 SSL 인증서를 재발급 받아야 한다.

인증서 다운로드

1개 도메인 및 www 서브도메인을 위한 PositiveSSL의 zip 압축 파일은 다음 파일이 들어있다.

파일 이름 설명
example_com.crt 실제 서버 PositiveSSL 도메인 인증서
COMODORSADomainValidationSecureServerCA.crt 중간 CA 인증서
COMODORSAAddTrustCA.crt 중간 CA 인증서
AddTrustExternalCARoot.crt 루트 CA 인증서

1개 도메인 및 와일드카드 서브도메인을 위한 PositiveSSL Wildcard의 zip 압축 파일은 다음 파일이 들어있다.

파일 이름 설명
STAR_example_com.crt 실제 서버 PositiveSSL 도메인 인증서
STAR_example_com.ca-bundle 번들 CRT

체인인증서 파일 만들기

example_com_ssl_bundle.crt 파일을 만든다.

$ cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com_ssl_bundle.crt

만약 example.com.p7b 파일이 있고 example.com.crt, example.com.ca-bundle 파일만 들어있다면 아래와 같이 좀 더 간단하게 번들을 만들 수 있다.

$ cat example.com.crt example.com.ca-bundle > example_com_ssl_bundle.crt

PositiveSSL Wildcard는 아래와 같이 명령한다.

$ cat STAR_example.com.crt STAR_example.com.ca-bundle addtrustexternalcaroot.crt > pincoin_co_kr.crt

NGINX 서버 블록 설정

전체 경로 SSL 리다이렉트

http 연결을 무조건 https 연결로 치환한다.

/etc/nginx/sites-enabled/com.example.www 파일 수정

upstream com-example-www-django {
    server unix:/var/www/com.example.www/run/uwsgi.sock;
}

server {
    listen      80;
    server_name example.com www.example.com;
    charset     utf-8;
    return      301 https://$host$request_uri;
}

server {
    listen      443 ssl;
    server_name www.example.com;
    charset     utf-8;

    if ($host = 'example.com') {
        return 301 https://www.example.com$request_uri;
    }

    ssl on;
    ssl_certificate /var/www/com.example.www/ssl/example_com_ssl_bundle.crt;
    ssl_certificate_key /var/www/com.example.www/ssl/example_com.key;

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    location /assets/ {
        root /var/www/com.example.www/repo;
        access_log   off;
        expires      30d;
    }

    location /media/ {
        root /var/www/com.example.www/repo;
        access_log   off;
    }

    location / {
        include         /etc/nginx/uwsgi_params;
        uwsgi_param HTTP_X_FORWARDED_PROTO $scheme;
        uwsgi_pass      com-example-www-django;
    }

    access_log /var/www/com.example.www/logs/access.log;
    error_log /var/www/com.example.www/logs/error.log;
}
  • 기존의 80번 포트 서버 블록 설정을 443으로 옮기고 모든 요청을 https로 리다이렉트한다.
  • ssl 지정에서 crt 파일과 key 파일을 올바른 경로에서 지정한다.

만약 와일드카드로 인증서를 구매한 경우에는 아래와 같이 설정해야 한다.

    ssl_certificate /var/www/kr.co.pincoin.www/ssl/STAR_example_com.crt;
    ssl_certificate_key /var/www/kr.co.pincoin.www/ssl/example_com.key;

선택적 경로 SSL 리다이렉트

특정 하위 디렉토리(예, /admin) 접속시에만 https 연결로 바꾼다.

/etc/nginx/sites-enabled/com.example.www 파일 수정

upstream com-example-www-django {
    server unix:/var/www/com.example.www/run/uwsgi.sock;
}

server {
    listen      80;
    server_name example.com www.example.com;
    charset     utf-8;

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    location /assets/ {
        root /var/www/com.example.www/repo;
        access_log   off;
        expires      30d;
    }

    location /media/ {
        root /var/www/com.example.www/repo;
        access_log   off;
    }

    location /admin {
        return 301 https://$host$request_uri;
    }

    location / {
        include         /etc/nginx/uwsgi_params;
        uwsgi_pass      com-example-www-django;
    }

    access_log /var/www/com.example.www/logs/access.log;
    error_log /var/www/com.example.www/logs/error.log;
}

server {
    listen      443 ssl;
    server_name example.com www.example.com;
    charset     utf-8;

    ssl on;
    ssl_certificate /var/www/com.example.www/ssl/example_com_ssl_bundle.crt;
    ssl_certificate_key /var/www/com.example.www/ssl/example_com.key;

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }

    location /assets/ {
        root /var/www/com.example.www/repo;
        access_log   off;
        expires      30d;
    }

    location /media/ {
        root /var/www/com.example.www/repo;
        access_log   off;
    }

    location /admin {
        include         /etc/nginx/uwsgi_params;
        uwsgi_param     HTTP_X_FORWARDED_PROTO $scheme;
        uwsgi_pass      com-example-www-django;
    }

    location / {
        return 301 http://$host$request_uri;
    }

    access_log /var/www/com.example.www/logs/access.log;
    error_log /var/www/com.example.www/logs/error.log;
}

Django 웹 애플리케이션 설정 변경

SSL 연결일 때만 브라우저가 쿠키 전송

conf/settings.py 파일에 다음 줄 추가

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True

request.is_secure() 사용

SSL 연결에서 request.is_secure()가 True를 반환하도록 수정한다.

conf/settings.py 파일에 다음 줄 추가

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

/etc/nginx/sites-enabled/example.com 파일에서 아래 아래 줄이 추가 되어 있어야 한다.

location / {
         ...
         uwsgi_param HTTP_X_FORWARDED_PROTO $scheme;
         ...
     }

Last Modified: 2019-02-15 00:02

blog comments powered by Disqus