최근에 AWS 프리티어가 끝나가서 운영중이던 사이드 프로젝트의 스프링 서버를 새로운 계정을 파서 옮기려고 했다.
이건 백엔드 api 서버인데 http로는 배포된 웹에서 호출이 되지 않기 때문에 https도 붙이려고 했다.
옛날엔 EC2 서버에 SSL 인증서를 직접 설치하는 방식으로 https를 달았지만 이게 무료 인증서라 그런건지 시간이 지나니까 신통치가 않아서 다른 방법을 찾아보았다.
먼저 구글에 검색하면 흔하게 널려있는 방법인, 도메인을 구매한 뒤 로드밸런서와 Route53, AWS의 인증서 발급 서비스를 이용해 https를 붙이는 방법으로 시도해 보았다. 전에도 도메인을 구매해서 다는 방식으로 했으니까...
하지만 뭐가 문젠지 나는 안 됨
ㅠ.ㅠ
그래서 한 3일 헤메다가 EC2 HTTPS without domain
이라는 검색 키워드를 발견하게 되었고... 드디어 나의 api 서버에 https를 붙이는 데 성공했다. 흑흑... 역시 영어로 검색해야 자료가 많구먼
다음에 또 EC2로 서버 구축할 때 까먹지 말고 써먹어야 하니까 과정을 기록한다.
지메일을 아무거나 만들고 새로운 AWS 계정을 만들어서 EC2와 RDS 인스턴스를 만든다. 이건 구글에 이미 방법을 올려놓은 사람이 많기 때문에 과정은 생략하겠다.
Caddy란 https를 붙여주는 DNS라고 하는데, 오픈소스다. 그래서 무료로 사용할 수 있다.
https://stackoverflow.com/questions/60943536/how-to-use-ssl-for-a-backend-ec2-instance-without-a-domain
최초로 참고한 글은 이 글이다. 다만 여기엔 Caddy 설치방법은 나와있지 않기 때문에 또 구글링을 해서 EC2에 Caddy를 설치했다.
https://stackoverflow.com/questions/73347341/cannot-download-caddy-package-on-yum
나는 아마존 리눅스2를 썼는데 공식 Caddy 사이트에 있는 설치법으로는 설치가 되지 않아서 이 글을 따라 했다. 우분투 쓰면 공식 홈페이지에 있는 우분투 설치법으로 해도 될 거 같다.
go/bin/xcaddy build
에서 시간이 꽤 걸리는데 절대 멈춘거 아니니까 완료될 때까지 유튭 보면서 기다리면 된다.
일단 sudo mkdir /etc/caddy
여기까지만 실행한 뒤 config 파일을 만들어 줄 것이다.
https://stackoverflow.com/questions/73347341/cannot-download-caddy-package-on-yum
이 글에 나와있듯이 설치가 완료되고 나면 몇몇 설정 파일을 수동으로 만들어줘야 한다.
sudo vi /etc/systemd/system/caddy.service
root 관리자 권한으로 위 경로에 caddy.service
라는 이름의 파일을 만든 다음에
[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target
[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
파일 내용에는 얘네를 복붙하고 저장한다.
더 자세한 내용은
https://caddyserver.com/docs/running
여기에 들어가서 확인할 수 있다. 스택오버플로우의 Caddy 설치법 작성자가 써 놓은대로 확인하면 된다.
다음으로
sudo vi /etc/caddy/Caddyfile
역시 root 권한으로 위 경로에 Caddyfile
이라는 이름으로 파일을 만든 뒤 내용에는
{
admin 0.0.0.0:2020
}
<EC2 인스턴스의 퍼블릭 IPv4 주소>.nip.io {
reverse_proxy localhost:8080 # 들어오는 요청을 8080포트로 포워딩
}
# 예시 :
10.100.100.100.nip.io {
reverse_proxy localhost:8080
}
이렇게 복붙한다.
맨 위에 admin
어쩌고는 Caddy를 실행했을 때 Tcp 127.0.0.1:2019: bind: address already in use
와 같은 에러로 실행이 되지 않으면 추가하면 된다.
이와 관련한 내용은
https://stackoverflow.com/questions/60943536/how-to-use-ssl-for-a-backend-ec2-instance-without-a-domain
여기를 참고하면 이해가 쉽다.
다시 Caddy 설치법 글로 돌아가서
sudo systemctl daemon-reload
sudo systemctl enable --now caddy
systemctl status -l caddy
이 명령들을 마저 실행한다.
$ systemctl status caddy.service
● caddy.service - Caddy
Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)
Active: active (running) since 화 2023-04-11 13:27:50 UTC; 5s ago
Docs: https://caddyserver.com/docs/
Main PID: 11243 (caddy)
CGroup: /system.slice/caddy.service
└─11243 /usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
정상 활성화되었다면 이런식으로 로그가 나와야 한다.
이제 Caddy를 실행하면 내 서버는 ssl 인증을 받아 https를 달 수 있게 된다.
sudo caddy start
root 권한으로 실행한다. Caddy를 실행하는 명령어는 caddy run
과 caddy start
두 가지가 있는데,
caddy run
은 그냥 실행하는 것이라 ctrl+c
를 누르면 꺼지고(다른 행동 할 수 없음)
caddy start
는 백그라운드에서 실행하는 것이다. 서버가 혼자 돌게 둬야 하니까 백그라운드 모드로 실행한다.
2023/04/11 13:56:33.748 INFO using adjacent Caddyfile
2023/04/11 13:56:33.749 WARN Caddyfile input is not formatted; run the 'caddy fmt' command to fix inconsistencies {"adapter": "caddyfile", "file": "Caddyfile", "line": 2}
2023/04/11 13:56:33.749 INFO admin admin endpoint started {"address": "0.0.0.0:2020", "enforce_origin": false, "origins": ["//0.0.0.0:2020"]}
2023/04/11 13:56:33.750 WARN admin admin endpoint on open interface; host checking disabled {"address": "0.0.0.0:2020"}
2023/04/11 13:56:33.750 INFO http server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS {"server_name": "srv0", "https_port": 443}
2023/04/11 13:56:33.750 INFO http enabling automatic HTTP->HTTPS redirects {"server_name": "srv0"}
2023/04/11 13:56:33.751 INFO http enabling HTTP/3 listener {"addr": ":443"}
2023/04/11 13:56:33.751 INFO failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size for details.
2023/04/11 13:56:33.751 INFO http.log server running {"name": "srv0", "protocols": ["h1", "h2", "h3"]}
2023/04/11 13:56:33.751 INFO http.log server running {"name": "remaining_auto_https_redirects", "protocols": ["h1", "h2", "h3"]}
2023/04/11 13:56:33.752 INFO http enabling automatic TLS certificate management {"domains": ["10.100.100.100.nip.io"]}
2023/04/11 13:56:33.752 INFO autosaved config (load with --resume flag) {"file": "/root/.config/caddy/autosave.json"}
2023/04/11 13:56:33.752 INFO serving initial configuration
2023/04/11 13:56:33.753 INFO tls cleaning storage unit {"description": "FileStorage:/root/.local/share/caddy"}
2023/04/11 13:56:33.754 INFO tls finished cleaning storage units
2023/04/11 13:56:33.754 INFO tls.cache.maintenance started background certificate maintenance {"cache": "0xc000335490"}
Successfully started Caddy (pid=23624) - Caddy is running in the background
대충 이런식으로 나오면 성공적으로 실행된 것이다.
이제 마지막으로 Spring boot 프로젝트를 깃에서 클론받아서 실행하면 된다.
이 글이 보기 좋으니까 참고해서 연동하자.
그러면 이렇게... 도메인을 따로 사고 SSL 인증서를 추가하기 위한 각종 노력등등을 하지 않아도 https
가 붙는다!
이제 프론트엔드에서 배포 후에도 api 호출이 가넝한
덕분에 https 설정 완료했습니다! 감사합니다!