Self-Signed SSL 인증서로 HTTPS 테스트[RHEL 8]

leekyungryul·2025년 4월 18일

web

목록 보기
6/6

TOMCATNGINX-WEBSERVER-환경구성

Openssl 최신버전으로 변경

기본으로 제공되는 버전은 아래와 같다.

openssl download

위 사이트에서 최신버전의 파일을 다운받는다.
내가 받은 파일은 openssl-3.5.0.tar.gz

  • 의존 패키지 설치
sudo dnf groupinstall "Development Tools" -y
sudo dnf install perl-core zlib-devel -y
  • openssl 파일 다운로드 및 설치
# 아래 경로에 파일을 다운로드 하였다.
mkdir ~/sw
cd ~/sw
tar -zxf openssl-3.5.0.tar.gz
ln -s openssl-3.5.0 openssl
cd openssl

# 빌드 및 설치 (절대경로로 하여야함)
./Configure --prefix=/home/ec2-user/sw/openssl --openssldir=/home/ec2-user/sw/openssl shared zlib

make -j$(nproc)
make install
  • 특정 사용자에게만 최신버전으로 적용
vi ~/.bashrc
# 아래 내용 추가

export OPENSSL_HOME=/usr/local/openssl
export PATH=$OPENSSL_HOME/bin:$PATH
export LD_LIBRARY_PATH=$OPENSSL_HOME/lib64:$LD_LIBRARY_PATH
  • 버전 확인

인증서 발급

# 인증서를 저장할 디렉터리 생성

cd /etc/nginx
mkdir ssl

디렉터리 구조 생성

# home directory에서 작업
cd
# root, server 디렉터리 생성
mkdir -p myCA/root myCA/server

ROOT CA 개인키 및 인증서 생성

cd ~/myCA/root

# CA 개인키 생성
openssl genrsa -out ca.key 2048

# CA 인증서 생성 (자체 서명, 10년 유효)
# 아래 ca.crt는 브라우저나 시스템에서 신뢰할 수 있는 루트로 등록할 수 있음
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
  -subj "/C=KR/ST=Seoul/O=MyTestCA/CN=MyTestRootCA"

서버용 CSR 및 키 생성

cd ~/myCA/server

# 서버용 키 생성
openssl genrsa -out server.key 2048

# CSR 생성 (서버용 인증서 요청)
# CN에는 실제 접속할 주소를 입력한다.
# 현재는 도메인으로 접속하지 않고 ip주소로 접속할 것이므로 아래와 같다.
openssl req -new -key server.key -out server.csr \
  -subj "/C=KR/ST=Seoul/O=MyCompany/CN="3.39.227.149"

서버 인증서 서명(ROOT CA로 서명)

cd ~/myCA/root

# 서버 인증서에 서명하여 PEM 인증서 발급
openssl x509 -req -in ../server/server.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out ../server/server.crt -days 365 -sha256

Nginx 설치

cd /etc/yum
mkdir repos.d
cd repos.d
vi nginx.repo

# 아래내용 추가
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

yum install -y nginx
systemctl start nginx
systemctl enable nginx
systemctl status nginx

nginx 설정파일 수정

server {
    listen 80;
    server_name 3.39.227.149;

    return 301 https://$host$request_uri;
}

# HTTPS 요청 처리
server {
    listen 443 ssl;
    server_name 3.39.227.149;

    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_client_certificate /etc/nginx/ssl/ca.crt
    ssl_protocols       TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://127.0.0.1:8080;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

NGINX 재시작

sudo nginx -t && sudo systemctl restart nginx

TEST

curl --cacert ~/myCA/root/ca.crt https://3.39.227.149

브라우저가 인증서를 신뢰하도록 설정

MAC

  • 위에서 발급받은 ca.crt파일을 로컬로 복사
  • 키체인접근 프로그램 실행
  • 파일 - 항목가져오기 - ca.crt 업로드
  • 업로드한 인증서 더블클릭
  • 아래처럼 항상신뢰로 설정

전체 자동화 스크립트

vi create_ssl_with_root_ca.sh


#!/bin/bash

# 📁 디렉토리 설정
ROOT_DIR="$HOME/myCA"
ROOT_CA_DIR="$ROOT_DIR/root"
SERVER_DIR="$ROOT_DIR/server"
IP_ADDR="3.39.227.149"

mkdir -p "$ROOT_CA_DIR" "$SERVER_DIR"

echo "✅ 디렉토리 구조 생성 완료"

# 📌 Root CA 개인키 및 인증서 생성
openssl genrsa -out "$ROOT_CA_DIR/ca.key" 2048

openssl req -x509 -new -nodes -key "$ROOT_CA_DIR/ca.key" \
    -sha256 -days 3650 -out "$ROOT_CA_DIR/ca.crt" \
    -subj "/C=KR/ST=Seoul/O=MyTestCA/CN=MyTestRootCA"

echo "✅ Root CA 생성 완료"

# 📌 서버 개인키 및 CSR 생성
openssl genrsa -out "$SERVER_DIR/server.key" 2048

# CSR 생성을 위한 설정 파일 (SAN 포함)
cat > "$SERVER_DIR/server.cnf" <<EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[dn]
C=KR
ST=Seoul
O=MyCompany
CN=$IP_ADDR

[req_ext]
subjectAltName = @alt_names

[alt_names]
IP.1 = $IP_ADDR
EOF

# CSR 생성
openssl req -new -key "$SERVER_DIR/server.key" -out "$SERVER_DIR/server.csr" \
    -config "$SERVER_DIR/server.cnf"

echo "✅ 서버 CSR 생성 완료 (SAN 포함)"

# 📌 서버 인증서 Root CA로 서명
openssl x509 -req -in "$SERVER_DIR/server.csr" -CA "$ROOT_CA_DIR/ca.crt" -CAkey "$ROOT_CA_DIR/ca.key" \
    -CAcreateserial -out "$SERVER_DIR/server.crt" -days 365 \
    -sha256 -extfile "$SERVER_DIR/server.cnf" -extensions req_ext

echo "✅ 서버 인증서 서명 완료"

# 🔎 출력 요약
echo ""
echo "📂 인증서 및 키 파일 목록:"
echo "Root CA cert : $ROOT_CA_DIR/ca.crt"
echo "Server cert  : $SERVER_DIR/server.crt"
echo "Server key   : $SERVER_DIR/server.key"

echo ""
echo "🔧 NGINX 설정 예:"
cat <<EOL
server {
    listen 443 ssl;
    server_name $IP_ADDR;

    ssl_certificate     $SERVER_DIR/server.crt;
    ssl_certificate_key $SERVER_DIR/server.key;
    ssl_client_certificate $ROOT_CA_DIR/ca.crt;
    ssl_verify_client off;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host \$host;
        proxy_set_header X-Real-IP \$remote_addr;
    }
}
EOL

echo ""
echo "🧪 테스트 명령:"
echo "curl --cacert $ROOT_CA_DIR/ca.crt https://$IP_ADDR"
profile
끊임없이 노력하는 개발자

0개의 댓글