Search
🙊

nginx 자체서명 https 통신 예제

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 ; SANDNS가 있거나, 대표 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 --from=builder /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
복사

References::