nginx HTTPS
3. 코드 예제
예제 1: 키·CSR·자체 서명 인증서 생성 — 01_nginx_https.sh 발췌
openssl genrsa -out "$SSL/server.key" 2048 2>/dev/null
chmod 600 "$SSL/server.key"
openssl req -new -key "$SSL/server.key" -out "$SSL/server.csr" \
-subj "/C=KR/ST=Seoul/L=Seoul/O=StudyCo/OU=IT/CN=app.example.local" 2>/dev/null
openssl req -in "$SSL/server.csr" -noout -subject
openssl x509 -req -in "$SSL/server.csr" -signkey "$SSL/server.key" \
-days 3650 -set_serial 0x1000 -out "$SSL/server.crt" 2>/dev/null== 2. 개인 키 생성 ==
생성 완료: server.key (2048bit RSA, 권한 600)
== 3. CSR 생성 ==
subject=C=KR, ST=Seoul, L=Seoul, O=StudyCo, OU=IT, CN=app.example.local
== 4. 자체 서명 인증서 생성 ==
WORK/app/nginx/ssl/server.crt
WORK/app/nginx/ssl/server.csr
WORK/app/nginx/ssl/server.key-subj 를 고정해 질문 없이 실행되고, -set_serial 로 일련번호를 고정해 재실행해도 같은 결과가 나옵니다. $WORK 는 DRY_RUN=1 일 때만 붙는 임시 경로입니다.
예제 2: server 블록과 리다이렉트·HSTS 작성 — 01_nginx_https.sh 발췌
cat > "$APP" <<EOF
server {
listen 80;
server_name app.example.local;
return 301 https://\$host\$request_uri;
}
server {
listen 443 ssl http2;
ssl_certificate $BASE/nginx/ssl/server.crt;
ssl_certificate_key $BASE/nginx/ssl/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
EOF== 6. ssl 지시어 확인 ==
11: ssl_certificate /app/nginx/ssl/server.crt;
12: ssl_certificate_key /app/nginx/ssl/server.key;
13: ssl_protocols TLSv1.2 TLSv1.3;
14: ssl_ciphers HIGH:!aNULL:!MD5;
15: ssl_session_cache shared:SSL:10m;
== 7. 리다이렉트와 HSTS 확인 ==
4: return 301 https://$host$request_uri;
18: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;한 파일에 80 번 리다이렉트 블록과 443 블록을 같이 두면 인증서 관련 설정이 한곳에 모여 관리하기 쉽습니다.
예제 3: Tomcat 으로 scheme 전달과 설정 검증 — 01_nginx_https.sh 발췌
grep -n 'X-Forwarded-Proto' "$APP" | mask
echo " Tomcat server.xml 에 RemoteIpValve 를 등록해야 이 헤더를 신뢰합니다 (레슨 02 참조)"
awk 'BEGIN{o=0;c=0}
{o+=gsub(/{/,"{"); c+=gsub(/}/,"}")}
END{ if (o==c) printf " 중괄호 짝 검사 통과: 여는 %d 닫는 %d\n", o, c
else { printf " 중괄호 불일치: 여는 %d 닫는 %d\n", o, c; exit 1 } }' "$APP"
run "$BASE/nginx/sbin/nginx" -t -c "$NCONF/nginx.conf"== 8. Tomcat 으로 scheme 전달 ==
25: proxy_set_header X-Forwarded-Proto $scheme;
Tomcat server.xml 에 RemoteIpValve 를 등록해야 이 헤더를 신뢰합니다 (레슨 02 참조)
== 9. 설정 검증 ==
중괄호 짝 검사 통과: 여는 3 닫는 3
[dry] /app/nginx/sbin/nginx -t -c WORK/app/nginx/conf/nginx.confnginx 바이너리가 없는 이 PC 에서는 중괄호 짝 검사가 최소한의 문법 확인 역할을 하고, 실제 서버에서는 nginx -t 까지 통과해야 합니다.
예제 4: 만료 확인과 인증서 교체 — 01_nginx_https.sh 발췌
openssl x509 -in "$SSL/server.crt" -noout -enddate | maskdate
openssl genrsa -out "$SSL/server.key.new" 2048 2>/dev/null
openssl x509 -req -in "$SSL/server.csr.new" -signkey "$SSL/server.key.new" \
-days 3650 -set_serial 0x1001 -out "$SSL/server.crt.new" 2>/dev/null
mv "$SSL/server.key.new" "$SSL/server.key"
mv "$SSL/server.crt.new" "$SSL/server.crt"
run "$BASE/nginx/sbin/nginx" -t -c "$NCONF/nginx.conf"
run systemctl reload nginx== 10. 만료 확인 ==
notAfter=DATE
== 11. 인증서 교체와 반영 ==
새 키·인증서로 교체 완료 (파일명은 그대로, 내용만 갱신)
[dry] /app/nginx/sbin/nginx -t -c WORK/app/nginx/conf/nginx.conf
[dry] systemctl reload nginx
reload 는 워커 프로세스만 새로 띄워 연결이 끊기지 않습니다notAfter 실제 날짜는 실행 시점마다 달라져 DATE 로 가려 두었습니다. 교체는 파일 이름을 그대로 두고 내용만 바꿔, nginx 설정을 다시 고칠 필요가 없습니다.