백엔드 API를 배포하고 Swagger UI를 외부에서 접근 가능하게 하려다가 SSL 설정으로 한참을 헤맸다. Cloudflare와 Nginx Proxy Manager를 함께 쓰면서 발생한 여러 오류들과 해결 과정을 기록한다.
example.site (가비아에서 구매, Cloudflare DNS 관리)https://example.site/swagger-ui/index.html 접근 가능하게 만들기- Cloudflare: 주황 구름 (프록시 활성화) + Full SSL 모드
- Nginx Proxy Manager: SSL Certificate None
SSL handshake failed
Error code 525
| SSL 모드 | 사용자 → Cloudflare | Cloudflare → 서버 | 서버 요구사항 |
|---|---|---|---|
| Off | HTTP | HTTP | 없음 |
| Flexible | HTTPS | HTTP | 없음 (HTTP만) |
| Full | HTTPS | HTTPS | SSL 인증서 (자체 서명 가능) |
| Full (strict) | HTTPS | HTTPS | 유효한 SSL 인증서 필수 |
처음에는 "Cloudflare 프록시(주황 구름)가 켜져 있으면 Let's Encrypt HTTP Challenge를 막을 거야"라고 생각했다.
/.well-known/acme-challenge/ 경로로 검증그냥 됐다. 😳
graph TD
A[Cloudflare Full + Nginx None] -->|525 에러| B[Nginx에서 Let's Encrypt 인증서 발급]
B -->|HTTP Challenge 성공| C[Nginx에 인증서 적용]
C -->|HTTPS 지원| D[접속 성공!]
Cloudflare: Full 모드 + 주황 구름 (프록시)
Nginx: SSL None
결과: 525 에러
Nginx Proxy Manager 설정:
1. SSL Certificates → Add SSL Certificate
2. Let's Encrypt 선택
3. Domain Names: example.site
4. Email: 본인 이메일
5. Use a DNS Challenge: 체크 안 함 (HTTP Challenge)
6. I Agree to the Let's Encrypt Terms of Service 체크
7. Save 클릭
결과: 성공! 🎉
example.site 편집https://example.site/swagger-ui/index.html → 정상 작동!
Cloudflare는 Full 모드에서도 Let's Encrypt ACME Challenge를 자동으로 감지하고 특별 처리한다.
일반 요청:
사용자 → Cloudflare (HTTPS) → Nginx (HTTPS 시도)
→ Nginx가 SSL 인증서 없으면 525 에러
ACME Challenge 요청:
Let's Encrypt → Cloudflare → Nginx (HTTP로 폴백)
→ Nginx가 HTTP로 토큰 응답
→ 인증서 발급 성공!
http://example.site/.well-known/acme-challenge/토큰 요청인증서 발급 후:
1. Cloudflare: Full 모드 + 주황 구름 유지
2. Nginx: SSL None 상태로 Proxy Host 생성
3. Nginx에서 Let's Encrypt HTTP Challenge로 인증서 발급
4. Proxy Host에 인증서 적용
5. 완료!
Proxy Host 설정:
Domain Names: example.site
Scheme: http
Forward Hostname/IP: example-backend # 컨테이너 이름
Forward Port: 8080
SSL 탭:
SSL Certificate: Let's Encrypt 인증서 선택
Force SSL: ON
HTTP/2 Support: ON
HSTS Enabled: ON (선택)
Nginx Proxy Manager와 백엔드 컨테이너가 같은 Docker 네트워크에 있어야 한다:
# 네트워크 생성
docker network create web
# 컨테이너 실행 시 네트워크 연결
docker run -d \
--name example-backend \
--network web \
-p 8080:8080 \
your-image
Cloudflare는 개발자 친화적으로 설계되어 있어서, 프록시를 켠 상태로도 Let's Encrypt 인증서 발급이 가능하다.
처음에는 복잡하게 생각해서 여러 방법을 시도했지만, 결국 가장 간단한 방법이 정답이었다:
Cloudflare Full 모드 유지 → Nginx에서 Let's Encrypt HTTP Challenge → 인증서 적용
이것만 기억하면 된다! 🚀