-
SSL : Let’s Encrypt 무료 인증서 적용 :: 마이구미HTTP 2018. 5. 19. 21:19반응형
이 글은 SSL 인증서를 무료로 적용할 수 있는 Let's Encrypt 을 다뤄본다.
웹 사이트를 운영하기에 있어, 필수적인 기능이라고 볼 수 있다.
실습환경은 Amazon Linux AMI 이다.
현재 본인도 Github Pages 를 통해 포트폴리오 사이트에 SSL 적용하고 있다.
Github Page 에서는 다른 서버와 통신을 위해 https 프로토콜을 사용했기 때문이다.
포트폴리오 사이트 - https://hotehrud.github.io/portfolio-vue
우선 용어의 개념을 간단히 살펴보자.
HTTP, HTTPS 의 차이는 무엇인가?
HTTP와 HTTPS 의 차이는 Secure 로써, 보안이라고 볼 수 있다.
HTTPS 프로토콜은 전송되는 데이터를 암호화해서 보냄으로써, 데이터 노출의 안전이 보장된다.
위와 같이 주소창에서 쉽게 어떤 프로토콜을 사용하고 있는지 쉽게 알 수 있다.
대부분의 개인정보가 담긴 페이지들은 대부분 https 를 통해 접근하고있다.
SSL, HTTPS 는 같다고 보면 되는가?
개인적으로 간단명료한 문장인 것 같아 생활코딩의 문장을 가져왔다.
웹이 인터넷 위에서 돌아가는 서비스 중의 하나인 것처럼 HTTPS도 SSL 프로토콜 위에서 돌아가는 프로토콜이다. -생활코딩-
Let's Encrypt 는 단순히 무료로 SSL 인증서를 발급해주는 단체라고 보면 된다.
본격적으로 SSL 을 적용하는 방법을 알아보자.
SSL 인증서 발급
본인은 Git 을 통해 설치하는 방식을 다룬다.
공식 깃헙 저장소를 참고하길 바란다. (https://github.com/certbot/certbot)
1. letsencrypt 관련 모듈을 /opt/letsencrypt 경로에 설치한다.
// git clone 을 통해 모듈 내려받기
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
// 폴더 이동
cd /opt/letsencrypt
설치한 경로인 /opt/letsencrypt 디렉토리를 확인하면 다음과 같이 설치되었을 것이다.
2. SSL 인증서를 생성한다.
./letsencrypt-auto certonly --standalone -d YOUR_DOMAIN
ex) ./letsencrypt-auto certonly --standalone -d mygumi.me
Y/N 묻고, 이메일 관련 질문과 생성절차가 진행된다.
인증서가 발급되었다면. 다음과 같이 메시지가 나올 것이다.
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
..........................
혹시 ImportError: No module named cryptography.hazmat.bindings.openssl.binding 관련 오류가 난다면, https://github.com/certbot/certbot/issues/2544 참고하길 바란다.
발급한 인증서를 확인하기 위해서는 다음과 같은 명령어를 통해 할 수 있다.
ls /etc/letsencrypt/live
./certbot-auto certificates
Expriy Date 를 보다시피 만료기간(90일)이 존재한다.
만료되기 전에 매번 갱신을 해주어야한다.
이번 글을 쓰게 된 계기도 인증서 만료를 모르고 있었다가 다시 갱신하는 과정에서 다루게 되었다.
자동적으로 갱신하기 위해서는 다음과 같이 설정할 수 있다.
crontab -e
위 명령어를 통해 crontab 파일을 읽은 후, 다음 텍스트를 입력해주면 된다.
0 0 1 * * /opt/letsencrypt/letsencrypt-auto renew
이와 같이 설정하면, 매월 한번 인증서가 자동적으로 갱신되게 된다.
단순히 수동적으로 한다면, 다음과 같다.
/etc/init.d/httpd stop
/opt/letsencrypt/letsencrypt-auto renew
/etc/init.d/httpd start
서버를 중지한 후, 인증서를 갱신하고, 다시 서버를 시작하면 된다.
위와 같은 순서를 따르지 않는다면 다음과 같은 에러를 초래할 수 있다.
=> Problem binding to port 443: Could not bind to IPv4 or IPv6.. Skipping.
SSL 설정(아파치)
웹 사이트의 HTTPS 를 설정하기 위한 관련 SSL 설정을 해줘야한다.
vim /etc/httpd/conf.d/ssl.conf
ssl.conf 파일을 열어 SSLCertificateFile, SSLCertificateFile 의 값을 생성한 인증서 경로로 변경해주면 된다.
그 후, 웹 서버를 다시 시작해주면 된다.
/etc/init.d/httpd restart
SSL 인증서 발급과 설정이 완료되었다.
본인의 사이트에 SSL 설정 여부는 아래 사이트를 통해 확인할 수 있다.
https://www.sslshopper.com/ssl-checker.html
위와 같이 웹 사이트에 HTTPS 프로토콜을 사용하고 있는 모습을 볼 수 있다..
마지막으로 Node.js 와 같이 다른 포트(mygumi.me:3000)를 열어 사용할 경우는 다음과 같다.
다음과 같은 코드를 통해 사용할 수 있다.
(참고로 권한 문제로 인해 /live 폴더가 아닌 /archive 폴더의 key파일을 사용했다.)
12345678910111213141516let options = {key: fs.readFileSync('/etc/letsencrypt/archive/mygumi.me/privkey1.pem'),cert: fs.readFileSync('/etc/letsencrypt/archive/mygumi.me/cert1.pem'),requestCert: false,rejectUnauthorized: false}let server = https.createServer( options, app )server.listen(serverConfig.port, (err) => {if (err) {return console.log(err)}return console.log(`server is listening on ${serverConfig.port}`)})cs 반응형'HTTP' 카테고리의 다른 글
JWT, Cookie, XSS, CSRF :: 마이구미 (0) 2020.06.14 캐시된 파일은 서버에 요청하지 않는가? :: 마이구미 (2) 2018.03.14 data URL vs Image file :: 마이구미 (3) 2018.01.07 메모리 캐시 vs 디스크 캐시 :: 마이구미 (6) 2017.12.23 OSI 7계층 모델 :: 마이구미 (0) 2017.12.23