Nginx로 SSL, IP Hash 기법 적용하기

 

 

 

 

 

환경구성

- 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