기존의 프로젝트에서는 HTTP만 사용했었는데 보안 문제 때문에 요즘은 거의 HTTPS만 사용하는 추세고 해서 미뤘던 일을 오늘 하기로 했다. 과정은 그리 복잡하지는 않았지만 그동안 시간이 없었기에 이번에 싹 바꾸기로 했다.
TLS 인증서 발급
Certbot
Tagline
certbot.eff.org
나는 Certbot을 이용해서 인증서를 발급 받았다. 우선 자신의 도메인이라는 것을 확인하는 과정이 필요하기 때문에 인증 과정을 거쳐야 한다. 방법은 여러 가지가 있지만 나는 WAS를 중단해도 되는 상황이었고, 쉽게 진행할 수 있을거 같아서 아래의 방법으로 진행했다.
sudo apt update
sudo apt-get install letsencrypt -y
sudo certbot certonly --standalone -d api.delibird.store
위 명령어를 입력하면 인증서 발급 과정이 진행된다. 그런데 여기서 오류가 발생해서 진행이 되지 않는 경우가 있다.
이럴 때는 크게 두 가지 경우가 있다. unauthorized와 refused인데, 나의 경우는 전자는 포트포워딩 때문에, 후자는 방화벽 때문이었다.
unauthorized
sudo iptables -t nat -L --line-numbers
위 명령어로 라우팅 정보를 확인해보자.

인증 과정에서 80포트를 사용하는데 나는 8000번 포트로 이동시키는 설정을 해놓았기 때문에 이 설정을 삭제해야 한다.
없으면 스킵해도 된다.
sudo iptables -t nat -D PREROUTING 2
위 명령어로 2번 설정을 제거해주었다.
설정하기만 하면 재부팅 후 원래대로 돌아가버리므로 다음 명령어를 실행한다.
패키지를 설치하고 저장하는 과정이다.
sudo apt install iptables-persistent
sudo netfilter-persistent save
refused
VPC 네트워크 > 방화벽에서 설정을 확인해본다. TCP 80 포트가 허용되어 있어야 한다.
또는 인스턴스 설정에서 다음과 같이 설정을 할 수도 있다.

기본적으로 대부분 80포트는 자동으로 열려있을테니 아마 크게 상관없을 것이다.

정상적으로 발급되었으면 위와 같이 뜰 것이다.
이제 설명에 나와 있는대로 해당 경로로 이동하자.
PKCS12 파일을 만들기 위해 fullchain.pem과 privkey.pem이 필요하다. 두 파일이 있는 위치에서 다음과 같은 명령어를 입력한다.
http://www.heydari.be/2016/05/14/Spring-Boot-Application-Secured-by-Lets-Encrypt-Certificate.html
Spring Boot Application Secured by Let's Encrypt Certificate
www.heydari.be
위 게시글을 참고하여 작성했다.
sudo openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name tomcat -CAfile chain.pem -caname root
비밀번호 설정하는 화면이 나오면 임의로 설정해주면 된다. 비밀번호 확인 화면도 한 번 더 나오는데 같은 비밀번호를 적으면 된다.

성공하면 같은 경로에 keystore.p12라는 파일이 만들어질텐데 이걸 다운로드 해준다.
GCP의 경우 절대 경로를 입력해서 다운로드 할 수 있다.
예시) /etc/letsencrypt/live/api.delibird.store/keystore.p12

근데 여기서 다운로드가 실패할 수도 있는데 이는 역시 권한 문제이다. 이것 역시 755로 설정하면 다운로드 받을 수 있다.
번외로 변환을 안 하고 두 파일 그대로 사용하고 싶으면 아래 방법을 시도해 볼 수도 있다.
https://velog.io/@developer_khj/Spring-Boot-SSL-Certificate
[Spring Boot] SSL 인증서 적용하기
이번 포스팅에서는 `Spring Boot`로 만든 애플리케이션에 `PEM` 형식의 `SSL` 인증서를 적용하는 방법에 대해 설명합니다.
velog.io
api-gateway 설정
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/tls-and-ssl.html
TLS and SSL :: Spring Cloud Gateway
The gateway maintains a client pool that it uses to route to backends. When communicating over HTTPS, the client initiates a TLS handshake. A number of timeouts are associated with this handshake. You can configure these timeouts can be configured (default
docs.spring.io
이제 다운로드 받은 keystore.p12를 Spring Cloud Gateway의 resources 폴더 내로 옮긴다.

server:
port: 8000
ssl:
enabled: true
key-alias: tomcat
key-store: classpath:keystore.p12
key-store-type: PKCS12
spring:
application:
name: gateway-service
config:
import:
- classpath:/bootstrap.yaml
- classpath:/secret.yaml # 이거도 추가
아까 설정했던 비밀번호를 입력해야 하는데 나는 따로 secret.yaml 파일을 만들어서 사용하였다. 해당 파일 내에 아래와 같이 비밀번호를 입력하면 된다.
server:
ssl:
key-store-password: [여기에 비밀번호 입력]
여기까지 하면 설정은 완료되었다.
GCP에서 설정하기
아래 과정은 따라하지 말고 보기만 할 것!
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8000
HTTPS 설정은 했지만 포트포워딩 설정을 아까 삭제했고 포트가 80에서 443으로 변경되었으니 새로 포워딩을 해주어야 한다. 443포트를 gateway의 8000번 포트로 포워딩 하도록 설정한다.
그런데 사실 이렇게 하면 문제가 발생한다.

잘 안 보일 수도 있는데 GitHub에서 설정 정보를 가져오지 못한다는 예외가 발생했다. 위 부분은 config-service에서 GitHub에 저장된 설정을 가져와서 적용하는 로직이다.
이렇게 다른 443포트를 사용하고 있는 서비스에서 제대로 통신을 하지 못한다는 문제가 발생한다.
https://megamaker.tistory.com/334
[Spring Cloud][GCP] NGINX로 리버스 프록시 구현하기
저번 과정에서 HTTPS 요청을 처리하도록 인증서를 발급받고 적용하는 과정에서 iptable을 이용하여 포트포워딩을 하면 다른 프로그램의 요청에서 문제가 발생했었다. 그래서 이 방법 대신 NGINX를
megamaker.tistory.com
그래서 NGINX로 리버스 프록시를 구성하여 사용하였다.
'공부 > Spring Cloud' 카테고리의 다른 글
| [Spring Cloud] SameSite와 Secure로 프론트 백엔드 쿠키 교환하기 (0) | 2024.06.24 |
|---|---|
| [Spring Cloud][GCP] NGINX로 리버스 프록시 구현하기 (0) | 2024.06.24 |
| [Spring Cloud] 나를 괴롭히는 CORS 오류 해결하기 (0) | 2024.06.18 |
| [Spring Cloud] EC2에서 Docker Kafka 에러 해결하기 (0) | 2024.05.13 |
| [Spring Cloud][7] config-service 추가 및 설정 대칭키 암호화 (0) | 2024.05.10 |