본문 바로가기

Https

무료로 https 인증서 발급받는 방법 알려준다!

허허허허. 나는 지금까지 CA에서 인증서 발급받으려면 유료인 줄 알았다.
근데 완전 무료로 받을 수 있네?? 지금부터 개꿀팁을 공개하도록 하겠다.

먼저 그 전에 내가 여기까지 오게 된 일련의 과정을 적어놓겠다.

내 경험을 기록해야 다음 번에 또 삽질을 안 할 수 있기때문이다.

CA가 뭔지 모르겠다면?

https://code-mania.tistory.com/62를 참고하자!

 

원숭이도 읽으면 이해할 수 있는 https2

생활코딩 님의 https 수업을 듣고 복습 및 추후 상기 목적으로 정리한 내용입니다. 제 생각대로 적어놓은 것도 있습니다.. 조심하세요! https://opentutorials.org/course/228/4894 SSL과 암호화 그러면 이번에

code-mania.tistory.com

 

뻘짓 1: selft-signed certificate

flutter로 만든 앱이 있고, 이 앱의 API 서버로 Spring Boot를 사용하고 있다.
그런데 창업동아리같은 느낌의 사이드프로젝트인데, 돈이 없어서 ... 최대한 지출이 안 나가는 쪽으로 하고 있었다.

그래서 첫 결정은 직접 인증서(self-signed certificate)를 발급하는 것이었다.
진짜... 수없는 검색을 거쳐서 완성했으나, IOS에서 동작을 안 했다.
IOS에서 self-signed certificate를 사용하려면 인증서 파일(아마 .crt였던 걸로 기억한다)을 직접 다운받아서
설정에서 따로 해당 인증서를 허용해줘야 한다. IOS 사용자들한테 이걸 시킬 수는 없어서 다음 방법으로 넘어갔다.

 

뻘짓 2: zeroSSL

허허허허. 다음 선택은 zeroSSL CA에서 인증서를 발급받는 것이었다.
짜잔~ 다 발급받고 나서 보니 IOS는 zeroSSL을 지원하지만, Android는 지원을 안 했다.
CA는 well-knwon CA와 그렇지 않은 CA로 나뉘는데, zeroSSL은 well-known CA가 아니었고,
well-knwon CA라면 Android와 IOS를 모두 지원할 것이라고 생각했다.
그래서 마침내 해결책에 도달한다.

결론: well-knwon CA인 certbot을 사용해보자!

그리고 나는 당연히 well-knwon CA는 유료일 거라고 생각했다.
그런데??? 처음부터 끝까지 돈 1원도 안 내고 발급받을 수 있었다.
지금부터 그 과정을 써보도록 하겠다!!

나는 어찌저찌 well-knwon CA 중 하나인 certbot을 사용하게 되었다.

 

1. 먼저 certbot은 domain이 반드시 필요하다.
IP로 인증서발급을 안 해주기때문이다.
domain이 없는 경우 domain을 발급받자!
나는 Duck DNS에서 domain을 무료로 발급받았다.
domain 발급받아서 IP를 실서버로 잘 이어주면 끝이다!
(좀 더 어려운 말로 하자면 A record를 잘 등록해줘야 한다.)

 

2. 나는 Ubuntu 20에 Spring Boot를 서버로 사용하고 있었다.
(서버환경에 따라 설정이 달라진다. 필요한 경우 공식사이트를 참고하자!)

다음 명령어로 `snapd`를 최신버전으로 업데이트해주자!

sudo snap install core; sudo snap refresh core

 

만약에 `snapd`가 안 깔려있으면 다음 명령어를 통해 설치할 수 있다.

sudo apt install snapd

 

3. 다음 명령어로 CertBot을 설치 및 link를 설정해준다.

sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

 

4. 여기서는 80번 포트에 서버가 올라가있느냐 안 올라가있느냐에 따라 방법이 달라진다.
나는 80번 포트에 서버를 안 올라가있는 경우를 기준으로 설명한다.

sudo certbot certonly --standalone

 

이 명령어를 실행하면 domain을 입력하라고 나오는데 발급받은 domain을 입력해주면 된다.
만약 통신이 잘 되면, `/etc/letsencrypt/live/[my-domain.com]`으로 `pem` 파일들이 다운되게 된다.
여기서 통신에 실패하면 위에서 A record 등록을 잘못했을 가능성이 높다.
잘 확인해보도록 하자~ 참고로 redirect도 해봤었는데, redirect로는 동작이 실패한다.
그러니까 domain을 입력하면 HTTP Status Code 301과 함께 특정 IP로 redirect되도록 했었는데, 동작이 실패했다.
꼭 A record로 등록해줘야 한다.

 

5. 이제 `pem` 파일들을 Spring Boot에서 사용할 수 있게 .p12 파일을 만들어줘야 한다.

sudo -i
cd /etc/letsencrypt/live/matecampus.duckdns.org/
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name my-certificate-name -CAfile chain.pem -caname root
exit

 

`sudo -i`는 권한문제로 `openssl` 명령어가 실행되지 않아서 root 권한으로 shell을 수행하기 위해 사용했다.
권한문제를 잘 해결할 수 있는 고수들은 굳이 sudo -i를 사용하지 않아도 되고
어떻게 해야겠는지 모르는 병아리들은 그냥 위에 있는대로 실행하면 된다.
단, `-name` option과 입력한 비밀번호는 Spring Boot 설정 시 사용해야 하므로 신경쓰도록 하자!

 

6. `.p12` 파일을 적당한 위치로 잘 복사해준다. (복사는 꼭 해야되는 건 아닌데, 뭐 그냥 내 마음이다.)

sudo cp /etc/letsencrypt/live/matecampus.duckdns.org/keystore.p12 /app

 

7. application.yml을 설정해준다.

server:
  ssl:
    key-store: /app/keystore.p12 #내 .p12 경로
    key-store-password: my-certificate-password
    key-alias: my-certificate-name
    key-store-type: pkcs12

 

8. jar를 실행해준다.

nohup java -jar -Dspring.profiles.active=prod zamongcampusServer-0.1.1.jar &

대충 이 때 아마 권한 문제로 `sudo`를 붙여줘야됐던 거 같기도 하고, 잘 기억이 안 난다. 확인하기도 귀찮다.
만약에 권한 문제로 실행이 잘 안 되면 `.p12` 파일의 소유자를 `chown` 명령어로 바꿔줘도 잘 될 거 같다.

 

이렇게 공짜로 SSL 인증서 발급받는 방법을 배워봤다.
HTTPS 인증서 발급 잘 받기를~~~