환경구성
- Nginx
- centOS
- 인증서파일(.crt, key)
사전 정보
자체 서명과 인증기관 서명의 차이
👼🏻: 자체 서명과 인증기관 서명의 차이는 무엇일까요?
🍊: 말그대로 본인이 직접 발급했느냐와, 인증 기관의 인증이 있었냐는 뜻이죠. 직접 발급시에는 외부 사용자나 브라우저가 신뢰하지 않고요, 인증기관의 인증이 있었다면 대부분의 브라우저와 시스템에서 신뢰하게 됩니다.
👼🏻: 그렇다면 용도는 뭘까요?
🍊: 내부 테스트, 개발환경의 경우 자체 서명을 이용하며, 실제 운영 환경/상업용에서는 CA 인증서가 필요해요.
1. 자체 서명 SSL 인증서 생성
openssl 패키지를 다운로드한다.
yum install openssl
2. SSL 인증서 및 키 파일 생성
mkdir -p /etc/nginx/ssl #경로생성
# 키 파일 생성
sudo openssl genrsa -out /etc/nginx/ssl/nginx.key 2048
# 인증서 서명 요청 (CSR) 생성
sudo openssl req -new -key /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.csr
> County Name: KR
> State or Provine Name : 지역이름
> Locality Name : 지역이름
> Organization Name > 회사이름
> Organizational Unit Name : IT
> Common Name(server FQDN or YOUR name) : IP나 도메인
> Email Address: 이메일 주소
# 자체 서명된 인증서 생성
sudo openssl x509 -req -days 365 -in /etc/nginx/ssl/nginx.csr -signkey /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
1️⃣ SSL 인증 진행
1. Nginx 설치
# nginx-1.26.1.tar.gz가 존재하는 경로에서 압축 해제
tar -zxvf nginx-1.26.1.tar.gz
mv /현재경로/nginx-1.26.1.tar.gz /nginx-1.26.1
# 의존성 설치
sudo yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
# Nginx 컴파일 및 설치
cd nginx-12.1
./configure --prefix=/usr/local/nginx --with-http_ssl_module // 설치 경로 지정, ssl모듈 적용
make // Makefile에 정의된 규칙에 따라 소스 코드 컴파일 진행
sudo make install // 컴파일된 프로그램을 시스템에 설치
# 실행 및 정상 실행 확인
sudo /usr/local/nginx/sbin/nginx
sudo /usr/local/nginx/sbin/nginx -V
Nginx 폴더 기본 구조를 보면 아래와 같다.
/usr/local/nginx/
- sbin/: nginx 실행 파일 위치
- conf/: 설정 파일(nginx.conf) 위치
- html/: 기본 웹 페이지 파일 위치
- logs/: 로그 파일 위치
2️⃣ SSL 설정 (crt, key 이용)
1. Nginx 설정 파일 수정
vi /usr/local/nginx/conf/nginx.conf
// 하위 내용 기입
http {
include mime.types;
default_type application/octet-stream;
# SSL 설정
ssl_certificate /etc/nginx/ssl/cert_crt;
ssl_certificate_key /etc/nginx/ssl/prv.key;
ssl_client_certificate /etc/nginx/ssl/ca_crt;
// ssl_verify_client on; # 유효한 경우에만 연결할 때 사용
ssl_verify_client optional;
ssl_trusted_certificate /path/to/your/ca.crt;
# 업스트림 서버 설정
upstream backend_ {
ip_hash;
server RIP1;
server RIP2;
}
# 80번 포트로 받은 요청을 HTTPS로 로드 밸런싱
server {
listen 80 ssl;
server_name example.com;
location / {
proxy_pass https://backend_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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 받은 요청을 WebSocket으로 로드 밸런싱
server {
listen 82 ssl;
server_name example.com;
location / {
proxy_pass https://backend_wss_;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 지원
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
2. 테스트 및 재시작
sudo /usr/local/nginx/sbin/nginx -t
sudo /usr/local/nginx/sbin/nginx -s reload
*확인용 명령어
// 특정 프로세스의 사용중인 포트 확인
lsof -i -P -n | grep [프로세스이름]
// 로그확인
tail -f /var/log/nginx/error.log