Intro::
nginx 자체서명 https 통신 예제
project-root/
├── docker-compose.yml
├── Dockerfile.nginx
├── Dockerfile.echo
├── conf/
│ └── default.conf
└── certs/
├── mockServer.crt
└── mockServer.key
Bash
복사
인증서 생성
# san.cnf
[ req ]
default_bits = 2048
prompt = no
distinguished_name = dn
x509_extensions = v3_req
default_md = sha256
[ dn ]
CN = 1.2.3.4
[ v3_req ]
subjectAltName = @alt_names
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
[ alt_names ]
IP.1 = 10.0.1.5 # 프라이빗 IP
IP.2 = 52.34.56.78 # Elastic IP
Bash
복사
openssl req -x509 -nodes -newkey rsa:2048 \
-keyout cert.key \
-out cert.crt \
-days 365 \
-config san.cnf
Bash
복사
인증서 공개키(.crt) | 644 | 공개되어도 괜찮음 |
개인키(.key) | 600 또는 640 | 반드시 root 또는 Nginx 유저만 읽을 수 있도록 제한 |
디렉토리(/data/nginx/certs) | 750 | 실행 유저가 접근 가능한 최소 권한 |
[ req ]
prompt = no
distinguished_name = dn
x509_extensions = v3_ca
default_bits = 4096
default_md = sha256
[ dn ]
CN = MyCompanyRootCA
[ v3_ca ]
basicConstraints = critical, CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always
JavaScript
복사
# 루트 CA 개인키 (2048비트 또는 4096비트)
openssl genrsa -out root-ca.key 4096
# 자체 서명 된 루트 CA 인증서
openssl req -x509 -new -nodes \
-key root-ca.key \
-out root-ca.crt \
-config root-ca.cnf \
-days 3650
JavaScript
복사
[ req ]
prompt = no
distinguished_name = dn
req_extensions = v3_req
default_bits = 2048
default_md = sha256
[ dn ]
CN = newshabit.org ; SAN에 DNS가 있거나, 대표 IP가 없다면 편의상 임의로 지정
[ v3_req ]
basicConstraints = critical, CA:FALSE
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 10.0.1.5
IP.2 = 10.0.1.6
IP.3 = 10.0.1.7
IP.4 = 10.0.1.8
IP.5 = 10.0.2.5
IP.6 = 52.34.56.78
IP.7 = 52.34.56.79
IP.8 = 52.34.56.80
JavaScript
복사
# 1) 개인키 생성
openssl genrsa -out server.key 2048
# 2) CSR 생성
openssl req -new \
-key server.key \
-out server.csr \
-config server.cnf
JavaScript
복사
openssl x509 -req \
-in server.csr \
-CA root-ca.crt -CAkey root-ca.key \
-CAcreateserial \
-out server.crt \
-extensions v3_req \
-extfile server.cnf \
-days 825
JavaScript
복사
클라이언트 crt 신뢰 등록
2.1. Linux (curl, 시스템 전역)
1.
cert.crt를 /usr/local/share/ca-certificates/ (Debian/Ubuntu) 또는
/etc/pki/ca-trust/source/anchors/ (RHEL/CentOS) 폴더에 복사
2.
신뢰 저장소 업데이트
bash
복사편집
# Debian/Ubuntu
sudo cp cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
# RHEL/CentOS
sudo cp cert.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust
Shell
복사
3.
그 후 curl https://127.0.0.1/ 또는 브라우저를 새로 띄우면 경고 없이 접속 가능
2.2. macOS (Keychain Access)
1.
Keychain Access 앱 실행
2.
왼쪽 상단 ‘시스템(SYSTEM)’ 키체인 선택
3.
cert.crt 파일을 드래그 앤 드롭
4.
인증서를 더블클릭 → [신뢰(Trust)] 펼쳐서 “항상 신뢰(Always Trust)” 선택
nginx.conf
server {
listen 443 ssl;
server_name 127.0.0.1;
ssl_certificate /etc/nginx/certs/mockServer.crt;
ssl_certificate_key /etc/nginx/certs/mockServer.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
location /echo {
proxy_pass http://echo-app:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Plain Text
복사
Dockerfile
nginx만 띄워도 상관없습니다. 리버스 프록시 적용해보기 위해 추가 컨테이너를 생성한 것입니다.
# 1단계: 빌드 단계
FROM gradle:8.10.0-jdk17-alpine AS builder
WORKDIR /app
COPY . .
# Gradle wrapper를 사용하여 build (테스트는 생략)
RUN ./gradlew clean build -x test
# 2단계: 실행 단계
FROM amazoncorretto:21-alpine as runner
WORKDIR /app
# 빌드된 JAR 파일 복사 (build/libs/디렉토리 기준)
COPY /app/build/libs/*.jar app.jar
# 애플리케이션 실행
CMD ["java", "-jar", "app.jar"]
Docker
복사
FROM nginx:latest
COPY conf/default.conf /etc/nginx/conf.d/default.conf
COPY certs /etc/nginx/certs
Docker
복사
services:
nginx-https:
container_name: nginx
build:
context: .
dockerfile: Dockerfile.nginx
ports:
- "443:443"
volumes:
- ./conf:/etc/nginx/conf.d:ro
- ./certs:/etc/nginx/certs:ro
networks:
- echo-net
depends_on:
- echo-app
echo-app:
container_name: echo-app
build:
context: .
dockerfile: Dockerfile.echoApp
ports:
- "8080:8080"
networks:
- echo-net
networks:
echo-net:
driver: bridge
name: echo-net
Docker
복사