프로그래밍

Springboot에 ssl 인증서 발급하여 https 포트 개방하기 - certbot 활용

손가든 2024. 11. 20. 20:30

드디어...!!!

 

해냈다...ㅠㅠㅠ

 

acm으로 load balancer 설정하여 인증받으려고 설정했지만 실패했었다.

 

그래서 좌절하고 그동안 감을 잡은 도메인 개념으로 다시 certbot 인증서 발급을 시도했다.

 

해당 방법은 이후 프로젝트에도 사용하기 위해 기록용으로 작성하겠다.

 


 

서론

 

처음엔 certbot을 통해 인증서를 발급받는 과정이 잘 이해되지 않았지만 다들 이렇게 진행하나보다 하고 웹 상에서 떠도는 방법으로 진행했다.

 

하지만 다들 된다는데 나만 안됨..

 

계속 시도했지만 잘 안됬는데 그때마다 생각하지 못한 게 하나 있다.

 

인증을 한다는건 지금 인증서를 요청하는 내가 도메인의 주인이라는 것을 증명해야 한다.

 

근데 도메인에 certbot 명령어를 날린다고 내가 그 도메인 주인이라는 걸 어떻게 증명하지??

 

그래서 예전에 ssl 인증받을 때 도움을 줬었던 친구한테 어떤 방식으로 했었는지 물어봤다.

 

" 그때는 나도 너처럼 시도했었는데 안되서 nginx로 강제로 리다이렉트 시켰다 "

 

뭔소린지 잘 이해안됬다.

 

뭘 리다이렉트한다는거지

 

그 다음에 친구가 말했다.

 

"인증을 받으려면 내가 이 도메인 주인이라는 걸 인증해야되는데, 다른 유료 방식으론 이메일이나 문자로 인증한다. 근데 이건 무료 오픈SSL이라 그런게 없다. 근데 그런 절차가 필요하다. 아마 그 부분이 너가 시도하는 것 중에 빠진 것 같다"

 

맞다.

 

생각해보면 어떻게 내 사이트라는걸 인증하는건지 몰랐다.

 

서론이 길었다.

 

이 인증 방식을 추가했더니 됬던 방법을 정리하겠다.

 

도메인에 TXT 레코드 추가하기

 

핵심은 이 부제에 있다.

 

방법은 다음과 같다.

 

$ sudo certbot certonly -d www.letsnotessl.store --manual --preferred-challenges dns

 

certbot은 어느 OS를 사용하냐에 따라 다르기 때문에 설치는 생략하겠다.

 

나는 MacOS이므로 brew로 진행했다.

 

하도 오래되서 기억이안남 사실

 

 

아무튼 이전 포스팅에 무조건 인증하는 ec2 서버 내에서 터미널로 해야된다고 했었는데, 그건 사실이 아니다.

 

나는 로컬에서 진행했다.

 

이렇게 챌린지를 요청하면 다음과 같이 나타난다.

 

 

아직 발급하기 전인데, 이 value값을 가지고 있는지 발송해볼 건데 이거 미리 세팅해놓으라는 말이다.

 

이 세팅은 어떻게 하냐? 바로 dns 의 txt 레코드를 추가하면 된다.

 

 

방법은 위와 같다.

 

내 DNS 서버의 도메인에 TXT 레코드를 추가하는데 레코드 이름을 왼쪽 상단처럼 요구하고 있으니 그에 맞게 설정한다.

 

그리고 값에 저 난수를 집어넣어주면 된다.

 

하지만 여기서 끝이 아니고, certbot의 회사인 letsencrypt의 허용을 뚫어주는 설정을 추가해야 한다.

 

방법은 CAA 레코드를 추가하는 것인데, 값은 다음과 같이 설정하고

 

레코드 이름은 비워둬야 한다.

 

그러면 

 

 

성공적으로 내 로컬에 저장되었다.

 

이제 이 두개의 파일을 조합하여 비밀번호를 입력한 뒤 .p12 형식의 key파일로 생성할 수 있다.

 

키 파일 생성 명령어는 다음과 같다.

 

 sudo openssl pkcs12 -export -in /etc/letsencrypt/live/www.letsnotessl.store/fullchain.pem \
-inkey /etc/letsencrypt/live/www.letsnotessl.store/privkey.pem \
-out ./keystore.p12 \
-name tomcat \
-CAfile /etc/letsencrypt/live/www.letsnotessl.store/chain.pem \
-caname root

 

먼저 나는 Springboot 백엔드 웹서버에 인증을 설정하는 것이어서 resources에 두기 위해

 

해당 명령어를 원하는 디렉토리에 가서 진행했는데,

 

3번째줄의 . 대신에 원하는 루트로 지정해주면 된다.

 

그리고 fullchain.pem이 있는 디렉토리를 첫번째 줄에

privkey.pem이 있는 디렉토리를 2번째 줄에 작성한 것을 확인할 수 있고 CAfile도 해당 디렉토리의 chain.pem을 가져온 것을 확인할 수 있다.

 

로컬에 저장되는 위치는 달라질 수 있기 때문에 잘 확인해보고 작성하자.

 

이렇게 작성하면 비밀번호를 치라고 한다. (확인도 함)

 

그러면 이제 keystore.p12가 원하는 디렉토리에 생성된다.

 

sudo chmod 644 src/main/resources/keystore.p12

 

 

그 다음엔 해당 인증서를 열어볼 수 있는 권한을 부여해야 web server가 해당 인증서를 적용할 수 있어서 위와 같이 권한을 변경해준다.

 

server:
  port: 443
  ssl:
    key-store: classpath:keystoreNew.p12
    key-store-password: 작성했던 비밀번호
    keyStoreType: PKCS12

 

마지막으로 application.yml 파일에 다음과 같이 작성하면 끝.

 

실행하면 https 443 포트로 tomcat 서버가 실행되는 것을 확인할 수 있다.