과정
스프링 부트에 HTTPS(TLS)를 적용시켜주기 위해서 다음과 같은 과정을 거쳐야 한다.
- 도메인을 발급받는다.
- CertBot을 통해서 인증서를 발급받는다.
- PEM 인증서를 PKCS12 형태로 변환한다.
- Spring Boot에 인증서를 적용한다.
하나하나씩 차근차근 진행해보겠습니다.
1. 도메인을 발급받는다.
CertBot을 통해서 인증서를 발급받기 위해서는 ip주소가 아닌 도메인이 필요합니다.
따라서 도메인을 먼저 발급받아야 하는데 도메인은 구매를 하거나 무료로 발급을 받을 수 있습니다.
- 자신의 ip주소를 토대로 도메인을 생성하는 방식이 있고
nip.io - wildcard DNS for any IP Address
- 저는 무료로 발급받는 도메인을 사용했습니다.
고정IP가 필요했던 모든 서비스에 속도제한 없는 무료 DDNS서비스
해당 Codns사이트에서 회원가입을 하면 자신의 아이디를 기반으로 무료 도메인 1개를 발급받을 수 있습니다.
상단의 클라우드 DNS메뉴에서 웹 DDNS 서비스로 접속합니다.
해당 페이지에서 DDNS 방식을 웹 DDNS 방식을 선택하고 ip등록 방식을 수동 등록하고 서버가 실행될 서버의 공인 ip주소를 입력해주시면 됩니다.
그럼 codns.com에서 운영하는 DNS서버에 ID.codns.com 도메인에 대한 ip주소가 등록되고 도메인 주소로 서버에 접속할 수 있게 됩니다.
2. CertBot을 통해 인증서를 발급받는다.
저는 CertBot을 통해서 인증서를 발급받았습니다.
인증서 발급은 3가지 종류가 다음과 같이 있습니다.
- standalone
- 인증서를 발급받기 위해 도메인에 네트워크로 접속하여 유효성을 검증받는 방법입니다.
- 유효성을 검증받기 위해 80포트를 열어둬야 합니다.
- webroot
- 사이트 디렉토리 내에 인증서의 유효성을 검증할 수 있는 파일을 업로드해서 검증받는 방법입니다.
- DNS
- DNS서버에 TXT 레코드를 추가해서 유효성을 확인하는 방식입니다.
- 이 방식은 위에서 소개한 codns.com의 도메인으로는 할 수 없었습니다..
저는 이 3가지 방식 중에서 standalone 방식을 사용해서 인증받았습니다.
다른 방식을 원하시는 분들은 다른 블로그에서 찾아보시길 바랍니다.
저는 Docker를 사용해서 CertBot을 구동했고 과정은 다음과 같습니다.
CertBot 이미지 가져오기
sudo docker pull certbot/certbot
CertBot 컨테이너 실행
docker run -it --rm --name certbot -v 컨테이너외부폴더:/etc/letsencrypt -v 컨테이너외부폴더:/var/lib/letsencrypt -p 80:80 certbot/certbot certonly
하나씩 살펴보겠습니다.
docker run -it --rm --name certbot
도커 이미지를 컨테이너로 실행시키고 내부에 접속한다는 의미(-it
)입니다.
--rm
은 도커 컨테이너를 실행하고 끝나면 컨테이너를 삭제한다는 옵션입니다.
--name
옵션은 컨테이너의 이름을 지정해주는 옵션입니다. 지정하지 않으면 도커에서 랜덤으로 지정합니다.
-v 컨테이너외부폴더:/etc/letsencrypt -v 컨테이너외부폴더:/var/lib/letsencrypt
-v
옵션은 컨테이너 내부의 폴더와 컨테이너 외부의 폴더를 볼륨(연결) 해주는 옵션입니다.
CertBot이 생성한 인증서가 컨테이너와 함께 삭제되지 않기 위해 사용됩니다.
CertBot 인증서 발급
CertBot 방식 선택
실행하면 위와 같이 standalone 방식과 webroot 방식을 선택하라고 말합니다.
저는 standalone 방식을 사용하기 위해 1을 골라줬습니다.
이메일 작성
이메일을 작성해줍니다.
도메인 작성
도메인을 작성해줍니다.
인증서 발급 완료
다음과 같이 나오면 인증서가 발급이 완료되었습니다.
유효기간은 3달입니다. 이후에는 따로 갱신해주어야 합니다.
앞에서 도커 볼륨을 통해 연결해준 폴더에 /etc/letsencrypt/liv/{도메인네임} 으로 가시면 키가 생긴 것을 볼 수 있습니다.
여기서 저희가 사용하는 키는 privkey.pem, fullchain.pem, chain.pem을 사용합니다.
3. PEM 인증서를 PKCS12로 변경한다.
MAC OS환경에서 OpenSSL을 사용해 PEM 키를 PKCS12로 변경해줍니다.
OpenSSL 설치는 따로 찾아봐주세요.
openssl pkcs12 -export -inkey privkey.pem -in fullchain.pem -out keystore.p12
-name tomcat -CAfile chain.pem -caname root
위와 같은 명령어를 사용해 줍니다.
그럼 키의 비밀번호를 설정하라는 입력이 나오고 자신이 하고 싶은 비밀번호를 작성해주면 됩니다.
4. Spring Boot에 인증서를 적용한다.
Spring Boot는 application.yml을 통해서 쉽게 인증서를 적용할 수 있습니다.
server:
ssl:
key-store: "classpath:keystore.p12"
key-store-type: PKCS12
key-store-password: {위에서 작성한 비밀번호}
port: 8443
위에서 만든 keystore.p12를 resource
에 넣어줍니다.
key-store
옵션에 키의 경로를 작성해주어야 합니다.
classpath:{경로}
는 resources 내부 경로를 지정해줍니다.
key-store-password
옵션에는 위에서 PKCS12 키를 생성할 때 설정한 비밀번호를 입력해줍니다.
마지막으로 저는 8443 포트를 사용했고 집에서 배포중이기 때문에 iptime의 포트포워딩 설정을 통해 포워딩해주었습니다.
AWS나 NCP와 같은 클라우드 서비스를 사용중이라면 리눅스 포트포워딩 검색하셔서 설정해주거나 port를 443으로 설정해주시면 됩니다.
결과
성공적으로 인증서가 적용되었고 크롬에서도 인증서가 유효한 것을 볼 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring Test] Spring Boot Controller 단위 테스트 (1) | 2024.01.31 |
---|---|
[Spring Test] Mockito when()과 given() 차이 (0) | 2024.01.29 |
[Spring Boot] Interceptor 활용 (1) | 2024.01.25 |
[Spring Boot] application.yml profile 기능 (1) | 2024.01.25 |
[Spring Boot] 스프링 부트에서 Spring MVC를 자동 설정하는 과정 (0) | 2024.01.20 |