내부망에서 TLS(HTTPS) 구성하기

사실 내부망에서만 쓰는 시스템들이라면 HTTPS를 구성할 당위성은 잘 없다.
HTTPS 자체가 중간 네트워크 레이어에서 탈취되는 것을 방어하고자 하는 것인데, 내부망이면 그럴 염려가 거의 없기 때문이다.

그럼에도 불구하고 HTTPS가 필요한 경우는 제법 있을 수 있다. 특정 플러그인이나 부가기능들이 HTTPS를 필수 조건으로 요구하기 때문이다.
예를 들어, WebRTC만 해도 HTTPS가 아니면 동작을 안한다.

그런 경우에 내부망용 TLS를 구성하는 방법을 정리해본다.


HAProxy 프록시로 라우팅된 내부 백오피스가 있다고 가정한다. 여기에 달 것이다.




인증서 만들기 (OpenSSL)

그럼 인증서를 만들어보자. 특정 IP에 대해서만 동작하도록 만들 것이다.

#!/bin/bash
# filepath: /scripts/create-ssl-cert.sh

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

# CSR 생성 (Certificate Signing Request)
openssl req -new -key server.key -out server.csr -config <(
cat <<EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req

[dn]
C=KR
ST=Seoul
L=Seoul
O=Self
OU=IT Department
CN=192.168.0.68

[v3_req]
subjectAltName = @alt_names

[alt_names]
IP.1 = 192.168.0.68
IP.2 = 127.0.0.1
EOF
)

# Self-Signed 인증서 생성 (10년 유효)
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt -extensions v3_req -extfile <(
cat <<EOF
[v3_req]
subjectAltName = @alt_names

[alt_names]
IP.1 = 192.168.0.68
IP.2 = 127.0.0.1
EOF
)

# HAProxy용 통합 인증서 생성
cat server.crt server.key > server.pem

192.168.0.68만 본인 IP로 바꾸면 된다.

그러면 이렇게 파일이 만들어질 것인데

우리가 여기서 쓸 것은 crt와 pem이다. pem키가 비밀키고 crt가 공개키다.


sudo mv ./server.pem /etc/ssl/certs/server.pem

적당히 pem키만 경로 적절히 바꿔주자.




HTTPS 리스너 구성 (HAProxy)

이건 서버측에서 할 작업이다.
HAProxy의 경우에는 단순하게 쉽게 처리할 수 있다.

방금 만든 pem키를 달고 기존 http 서버로 라우팅되게 하면 된다.

그러고 재시작해주면

동작...은 하는데


HTTPS로서는 기능하지 않을 것이다. 이러면 사실 HTTP로 동작한 것이다.
공개키 인증서가 제대로 제공되지 않기 때문이다.

각 클라이언트마다 상기한 crt 공개키 파일을 다운받아서 인증서로 등록해줘야 한다.
이건 OS 수준에서 할 수도 있고, 브라우저 수준에서도 할 수 있는데, OS에서 설정하면 보통 브라우저 등 하위시스템에도 자동으로 상속된다.




인증서 설정: Linux (Ubuntu)

우분투의 경우에는 다음 명령으로 인증서를 설정할 수 있다.

#!/bin/bash
# Ubuntu/Debian용 CA 인증서 설치 스크립트

set -e

echo "🐧 Ubuntu/Debian에 Acloset CA 인증서 설치 중..."

if [ ! -f "server.crt" ]; then
    echo "❌ acloset-ca.crt 파일이 없습니다."
    exit 1
fi

# 1. CA 인증서를 시스템 CA 디렉토리에 복사
echo "1️⃣ CA 인증서를 시스템에 복사..."
sudo cp server.crt /usr/local/share/ca-certificates/server.crt

# 2. CA 인증서 업데이트
echo "2️⃣ CA 인증서 데이터베이스 업데이트..."
sudo update-ca-certificates

# 3. 설치 확인
echo "3️⃣ CA 인증서 설치 확인..."
if [ -f "/usr/local/share/ca-certificates/server.crt" ]; then
    echo "✅ CA 인증서가 성공적으로 설치되었습니다."
else
    echo "❌ CA 인증서 설치에 실패했습니다."
    exit 1
fi

echo ""
echo "🎉 Ubuntu/Debian CA 인증서 설치 완료!"
echo "=========================================="
echo "✅ 이제 curl이나 브라우저로 HTTPS 접속이 가능합니다"
echo "📝 브라우저를 재시작하세요"
echo "=========================================="




인증서 설정: MacOS

MacOS는 다음 명령들을 사용해서 인증서를 등록할 수 있다.

# 시스템 키체인에 CA 인증서 추가 (관리자 권한 필요)
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain server.crt

# 현재 사용자 키체인에도 추가 (선택사항)
security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain server.crt

echo "macOS CA 인증서 설치 완료!"

# 설치 확인
security find-certificate -c "192.168.0.68" /Library/Keychains/System.keychain

그래서 이렇게 뜨면 잘 등록된 것이다.




인증서 설정: Windows

Powershell을 관리자 권한으로 실행한 뒤에 다음 스크립트를 실행하면 된다.

# Windows PowerShell 스크립트 (관리자 권한 필요)
# Windows에서 CA 인증서 설치

Write-Host "🪟 Windows에 CA 인증서 설치 중..." -ForegroundColor Green

# 관리자 권한 확인
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Host "❌ 이 스크립트는 관리자 권한으로 실행해야 합니다!" -ForegroundColor Red
    Write-Host "PowerShell을 관리자 권한으로 다시 실행하세요." -ForegroundColor Yellow
    exit 1
}

# CA 인증서 파일 확인
if (-not (Test-Path "server.crt")) {
    Write-Host "❌ server.crt 파일이 없습니다." -ForegroundColor Red
    exit 1
}

try {
    # 1. CA 인증서를 시스템 신뢰할 수 있는 루트 인증 기관에 추가
    Write-Host "1️⃣ CA 인증서를 시스템에 추가 중..." -ForegroundColor Cyan
    Import-Certificate -FilePath "server.crt" -CertStoreLocation Cert:\LocalMachine\Root

    # 2. 현재 사용자용으로도 추가 (선택사항)
    Write-Host "2️⃣ 현재 사용자용 CA 인증서 추가 중..." -ForegroundColor Cyan
    Import-Certificate -FilePath "server.crt" -CertStoreLocation Cert:\CurrentUser\Root

    # 3. 설치 확인
    Write-Host "3️⃣ CA 인증서 설치 확인 중..." -ForegroundColor Cyan
    $cert = Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Subject -like "*Internal Root CA*"}

    if ($cert) {
        Write-Host "✅ CA 인증서가 성공적으로 설치되었습니다!" -ForegroundColor Green
    } else {
        Write-Host "❌ CA 인증서 설치 확인에 실패했습니다." -ForegroundColor Red
    }

    Write-Host ""
    Write-Host "🎉 Windows CA 인증서 설치 완료!" -ForegroundColor Green
    Write-Host "==========================================" -ForegroundColor White
    Write-Host "✅ 이제 브라우저로 HTTPS 접속이 가능합니다" -ForegroundColor Green
    Write-Host "📝 모든 브라우저를 재시작하세요" -ForegroundColor Yellow
    Write-Host "==========================================" -ForegroundColor White

} catch {
    Write-Host "❌ CA 인증서 설치 중 오류가 발생했습니다:" -ForegroundColor Red
    Write-Host $_.Exception.Message -ForegroundColor Red
    exit 1
}




인증서 설정: 크롬의 경우

브라우저 수준에서도 설정을 할 수는 있다.
chrome://settings/certificates로 들어가서

crt 파일을 등록해주면 된다.




아무튼 인증서가 잘 등록되었다면, 이제부터는 오류 없이 https로 접속이 될 것이다.

성공이다.