인증서 유료 구매 또는 무료 받기
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;
...
}