Linux Nginx 에서 자체 서명 인증서로 HTTPS 설정하기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 자체 서명 인증서 (self-signed certificate) 를 사용하여 Linux 에서 Nginx 웹 서버를 안전하게 설정하는 방법을 배웁니다. 먼저 Nginx 웹 서버를 설치하고 올바르게 실행되는지 확인하여 보안 설정을 위한 기반을 마련합니다. 초기 설정 후에는 OpenSSL 툴킷을 사용하여 암호화된 통신을 활성화하는 중요한 구성 요소인 자체 서명 SSL 인증서를 생성합니다.

인증서가 생성되면 Nginx 설정을 수정하여 보안 HTTPS 프로토콜을 통해 웹 콘텐츠를 제공합니다. 실습의 마지막 단계는 검증 및 테스트에 중점을 둡니다. 새로운 설정을 활성화하고 curlopenssl과 같은 명령줄 도구를 사용하여 HTTPS 연결을 테스트하고 새로 생성된 자체 서명 인증서의 세부 정보를 검사하여 서버가 올바르게 보안되었는지 확인합니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Nginx 웹 서버 설치 및 시작

이 단계에서는 Nginx 웹 서버를 설치합니다. Nginx 는 웹 콘텐츠 제공에 널리 사용되는 고성능 웹 서버입니다. 먼저 Nginx 를 설치하고 올바르게 실행되는지 확인합니다. 이렇게 실행 중인 Nginx 인스턴스는 이후 HTTPS 구성을 위한 기반이 됩니다.

먼저, 시스템의 패키지 목록을 업데이트하는 것이 최신 버전의 소프트웨어를 가져오는 좋은 방법입니다.

터미널에서 다음 명령을 실행합니다.

sudo apt update

시스템이 구성된 소스에서 패키지 정보를 가져오는 것을 볼 수 있습니다. 출력은 다음과 유사하게 표시됩니다.

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,585 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

이제 Nginx 를 설치할 수 있습니다. apt install 명령을 사용합니다. -y 플래그는 설치를 자동으로 확인하여 대화형 프롬프트를 피합니다.

sudo apt install nginx -y

설치 프로세스는 Nginx 및 해당 종속성을 다운로드하고 설정합니다. 완료되면 nginx 패키지가 설정되었음을 나타내는 출력을 볼 수 있습니다.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  nginx-common nginx-core
...
Setting up nginx-common (1.18.0-6ubuntu14.4) ...
Setting up nginx-core (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for ufw (0.36.1-4ubuntu0.1) ...
Processing triggers for man-db (2.10.2-1) ...

설치 프로세스에서 종종 서비스를 시작하지만, 명시적으로 관리하는 것이 좋습니다. 최신 Linux 시스템에서 서비스를 제어하는 표준 유틸리티인 systemctl을 사용합니다.

이 명령으로 Nginx 서비스를 시작합니다.

sudo systemctl start nginx

이 명령은 성공적으로 실행되면 아무런 출력을 생성하지 않습니다. 서비스가 실행 중인지 확인하려면 상태를 확인합니다.

sudo systemctl status nginx

출력은 서비스에 대한 자세한 정보를 제공합니다. Active: active (running) 줄을 찾으면 Nginx 가 실행 중임을 확인할 수 있습니다.

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 4617)
     Memory: 4.8M
        CPU: 43ms
     CGroup: /system.slice/nginx.service
             ├─1234 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─1235 "nginx: worker process"

이제 Nginx 웹 서버를 성공적으로 설치하고 시작했습니다. 다음 단계에서는 HTTPS 를 활성화하기 위한 전제 조건인 디지털 인증서를 생성합니다.

OpenSSL 을 사용하여 자체 서명 SSL 인증서 생성

이 단계에서는 자체 서명 디지털 인증서와 해당 개인 키를 생성합니다. HTTPS 를 활성화하려면 웹 서버는 클라이언트에게 자신의 신원을 증명할 디지털 인증서와 안전하고 암호화된 연결을 설정할 개인 키가 필요합니다. SSL/TLS 작업을 위한 강력한 유틸리티인 openssl 명령줄 도구를 사용합니다.

디지털 인증서는 공개 키를 신원 (예: 웹사이트의 도메인 이름) 에 바인딩합니다. 일반적으로 인증서는 신뢰할 수 있는 **인증 기관 (CA)**에서 발급하고 서명합니다. 그러나 테스트 및 개발 목적으로는 자체 서명자로 서명된 자체 서명 인증서를 생성할 수 있습니다. 이러한 인증서에 대해 브라우저는 보안 경고를 표시하지만, 이와 같은 실험실 환경에서는 완벽하게 작동합니다.

먼저 Nginx 구성 폴더 내에 SSL 인증서와 키를 저장할 전용 디렉터리를 생성합니다. 이렇게 하면 파일을 체계적으로 안전하게 관리할 수 있습니다.

sudo mkdir -p /etc/nginx/ssl

이제 단일 openssl 명령을 사용하여 2048 비트 RSA 개인 키와 365 일 동안 유효한 자체 서명 인증서를 모두 생성합니다. 이 파일들을 /etc/nginx/ssl/ 디렉터리에 직접 배치할 것입니다.

명령 옵션에 대한 설명은 다음과 같습니다.

  • req -x509: 자체 서명 인증서를 생성합니다.
  • -nodes: 개인 키가 암호 구문으로 암호화되는 것을 방지합니다. 이는 Nginx 가 수동 개입 없이 시작할 수 있도록 하는 데 중요합니다.
  • -days 365: 인증서의 유효 기간을 1 년으로 설정합니다.
  • -newkey rsa:2048: 새로운 2048 비트 RSA 개인 키를 생성합니다.
  • -keyout: 개인 키의 출력 파일 (/etc/nginx/ssl/nginx.key) 을 지정합니다.
  • -out: 인증서의 출력 파일 (/etc/nginx/ssl/nginx.crt) 을 지정합니다.
  • -subj: 인증서의 주체 정보를 비대화형으로 제공합니다. CN=localhost는 일반 이름 (Common Name) 이며, 사이트에 액세스하는 데 사용하는 주소와 일치해야 합니다.

다음 명령을 실행합니다.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx.key \
  -out /etc/nginx/ssl/nginx.crt \
  -subj "/C=US/ST=State/L=City/O=LabOrg/OU=IT/CN=localhost"

명령을 실행한 후 키 생성을 확인하는 출력을 볼 수 있습니다.

Generating a RSA private key
writing new private key to '/etc/nginx/ssl/nginx.key'
-----

개인 키 (/etc/nginx/ssl/nginx.key) 는 매우 민감합니다. 손상되면 공격자가 서버를 사칭할 수 있습니다. 따라서 루트 사용자만 읽을 수 있도록 파일 권한을 제한하는 것이 중요합니다.

sudo chmod 600 /etc/nginx/ssl/nginx.key

이 명령은 소유자 (루트) 에게만 읽기 및 쓰기 권한을 부여하고 다른 사용자에게는 권한을 부여하지 않도록 권한을 설정합니다. 이는 중요한 보안 조치입니다.

훌륭합니다! 이제 자체 서명 인증서 (nginx.crt) 와 안전한 개인 키 (nginx.key) 를 생성했습니다. 다음 단계에서는 Nginx 를 구성하여 이 두 파일을 사용하여 HTTPS 를 활성화합니다.

Nginx HTTPS 를 통한 콘텐츠 제공 설정

이 단계에서는 Nginx 구성을 수정하여 HTTPS 를 활성화합니다. 이전 단계에서 인증서와 개인 키를 준비했으므로 이제 Nginx 가 이를 사용하도록 지시해야 합니다. 여기에는 Nginx 의 사이트 구성 파일을 편집하여 포트 443(HTTPS 의 표준 포트) 에서 수신 대기하고 인증서 및 키 파일의 경로를 지정하는 작업이 포함됩니다.

구성 파일을 편집하기 전에 백업을 만드는 것이 현명한 방법입니다. 이렇게 하면 문제가 발생했을 때 원래 상태로 쉽게 되돌릴 수 있습니다. 기본 Nginx 사이트 구성 파일을 백업해 보겠습니다.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

이제 nano 텍스트 편집기를 사용하여 기본 구성 파일을 편집합니다. 이 파일에는 Nginx 가 들어오는 요청을 처리하는 방법을 정의하는 서버 블록이 포함되어 있습니다.

sudo nano /etc/nginx/sites-available/default

nano 편집기 안에서 포트 80 에서 HTTP 에 대해 구성된 기본 서버 블록을 볼 수 있습니다. SSL 구성 섹션을 찾을 때까지 아래로 스크롤합니다. 이 섹션은 일반적으로 주석 처리되어 있습니다. 이 섹션의 주석을 해제하고 아래 구성과 일치하도록 해야 합니다. 이 블록은 Nginx 에 포트 443 에서 보안 연결을 수신 대기하도록 지시하고 TLS 핸드셰이크에 사용할 인증서와 키를 지정합니다.

기존에 주석 처리된 SSL 서버 블록을 삭제하고 다음 내용으로 바꾸거나, 단순히 주석을 해제하고 일치하도록 편집합니다.

## --- CONTENT TO ADD/UNCOMMENT IN /etc/nginx/sites-available/default ---
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name localhost;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
## --- END CONTENT ---

이 지시문들의 의미는 다음과 같습니다.

  • listen 443 ssl: Nginx 에 포트 443 에서 들어오는 연결을 수신 대기하고 SSL/TLS 프로토콜을 사용하여 처리하도록 지시합니다.
  • server_name localhost: localhost에 대한 요청에 사용할 서버 블록을 정의합니다.
  • ssl_certificate: 공개 인증서 파일 (nginx.crt) 의 경로를 지정합니다.
  • ssl_certificate_key: 개인 키 파일 (nginx.key) 의 경로를 지정합니다.

내용을 추가한 후 파일을 저장하고 Ctrl+X를 누른 다음 Y를 누르고 Enter를 눌러 nano를 종료합니다.

변경 사항을 적용하기 전에 Nginx 구성에 구문 오류가 있는지 테스트하는 것이 중요합니다. 이렇게 하면 잘못된 구성으로 인해 웹 서버가 다운되는 것을 방지할 수 있습니다.

sudo nginx -t

구성이 올바르면 성공 메시지가 표시됩니다.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

오류가 표시되면 구성 파일을 다시 열고 오타나 누락된 세미콜론이 있는지 주의 깊게 확인하십시오.

이제 Nginx 를 HTTPS 를 통해 콘텐츠를 제공하도록 성공적으로 구성했습니다. 다음 단계는 서비스를 다시 시작하고 연결을 테스트하여 이러한 변경 사항을 적용하는 것입니다.

curl 로 HTTPS 구성 활성화 및 테스트

이 단계에서는 새로운 Nginx 구성을 적용하고 웹 서버가 HTTPS 를 통해 콘텐츠를 올바르게 제공하고 있는지 확인합니다. 디스크의 구성 파일을 수정했지만 실행 중인 Nginx 프로세스는 여전히 이전 구성을 사용하고 있습니다. 변경 사항을 적용하려면 서비스를 다시 시작해야 합니다.

새 구성을 적용하려면 systemctl을 사용하여 Nginx 서비스를 다시 시작합니다.

sudo systemctl restart nginx

이 명령은 성공하면 아무런 출력을 생성하지 않습니다. Nginx 는 이제 포트 443 에서 수신 대기하고 제공한 인증서와 키를 사용하여 HTTPS 요청을 처리할 준비가 됩니다.

이제 HTTPS 엔드포인트를 테스트해 보겠습니다. URL 로 데이터를 전송하는 명령줄 도구인 curl을 사용합니다. https:// 프로토콜을 사용하여 서버의 홈페이지를 가져오려고 시도할 것입니다.

HTTPS 를 사용하여 서버에 연결할 때 클라이언트 (이 경우 curl) 는 서버의 인증서가 신뢰할 수 있는 인증 기관 (CA) 에서 서명되었는지 확인합니다. 자체 서명 인증서를 생성했기 때문에 기본적으로 신뢰되지 않으며, curl은 연결을 거부하고 인증서 유효성 검사 오류를 표시합니다.

테스트를 위해 이 문제를 해결하려면 -k 또는 --insecure 플래그를 사용합니다. 이 플래그는 curl에 인증서 유효성 검사를 건너뛰도록 지시합니다. 이는 안전하지 않으며 프로덕션 환경에서는 사용해서는 안 되지만, 실험실 환경에서 자체 서명 인증서를 테스트하는 데 필요합니다.

HTTPS 서버를 테스트하려면 다음 명령을 실행합니다.

curl -k https://localhost

구성이 올바르면 curl은 서버에 성공적으로 연결하고 기본 Nginx 환영 페이지의 HTML 콘텐츠를 출력합니다.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

이 HTML 출력을 받는 것은 Nginx 서버가 성공적으로 구성되었고 암호화된 HTTPS 연결을 통해 콘텐츠를 제공하고 있음을 확인합니다. 마지막 단계에서는 서버가 제공하는 인증서를 검사하는 방법을 배웁니다.

OpenSSL 로 서버 SSL 인증서 검사

이 마지막 단계에서는 Nginx 서버가 클라이언트에 제공하는 디지털 인증서의 세부 정보를 검사합니다. 이는 TLS/HTTPS 문제를 해결하고 서버의 신원을 확인하는 데 중요한 기술입니다. openssl 도구를 다시 사용하지만 이번에는 클라이언트로 사용하여 자체 서버에 연결하고 제공하는 인증서를 검사합니다.

파이프 (|) 로 연결된 두 개의 openssl 명령 조합을 사용합니다.

  • openssl s_client -connect localhost:443: 이 명령은 일반 SSL/TLS 클라이언트로 작동하며 지정된 서버 및 포트에 연결합니다. 세션 세부 정보와 함께 서버의 인증서를 출력합니다.
  • openssl x509 -text -noout: 이 명령은 X.509 인증서의 내용을 사람이 읽을 수 있는 형식으로 구문 분석하고 표시하는 데 사용됩니다.

s_client의 출력을 x509로 직접 파이프하여 인증서를 즉석에서 구문 분석합니다. 시작 부분의 echo |s_client가 사용자 입력을 기다리지 않도록 하고, 2>/dev/null은 연결 상태 메시지를 숨깁니다. 명확성을 위해 출력을 파일에 저장합니다.

다음 명령을 실행하여 서버에 연결하고, 인증서를 추출하고, 구문 분석하고, 세부 정보를 /tmp/server_certificate_details.txt라는 파일에 저장합니다.

echo | openssl s_client -connect localhost:443 2> /dev/null | openssl x509 -text -noout > /tmp/server_certificate_details.txt

이제 방금 만든 파일의 내용을 표시하여 인증서 세부 정보를 확인합니다.

cat /tmp/server_certificate_details.txt

인증서의 속성에 대한 자세한 분석을 볼 수 있습니다.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Validity
            Not Before: Oct 30 09:00:00 2023 GMT
            Not After : Oct 29 09:00:00 2024 GMT
        Subject: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:
                    ...
                Exponent: 65537 (0x10001)
...

잠시 시간을 내어 출력을 검토하십시오. 다음 주요 필드를 확인하십시오.

  • Issuer: 인증서를 서명한 주체입니다.
  • Subject: 인증서가 발급된 주체입니다.
  • CN (Common Name): 인증서가 적용되는 특정 도메인 (localhost) 입니다.

이것은 자체 서명 인증서이므로 IssuerSubject 필드가 동일합니다. 이것이 자체 서명 인증서의 특징입니다. 유효 기간과 공개 키 세부 정보도 볼 수 있습니다.

축하합니다! 자체 서명 SSL 인증서로 Nginx 웹 서버를 성공적으로 설정하고, HTTPS 를 위해 구성하고, 연결을 테스트하고, 인증서 세부 정보를 검사했습니다. 이제 TLS/HTTPS로 웹 트래픽을 보호하는 데 관련된 구성 요소에 대한 기본적인 이해를 갖추었습니다.

요약

이 실험실에서는 자체 서명 인증서를 사용하여 Linux 환경의 Nginx 웹 서버에 HTTPS 를 구현하는 엔드투엔드 프로세스를 배웠습니다. apt 패키지 관리자를 사용하여 시스템의 패키지 목록을 업데이트하고 Nginx 웹 서버를 설치하는 기반을 설정하는 것으로 시작했습니다. 실험실의 핵심은 보안에 중점을 두었으며, OpenSSL 툴킷을 사용하여 암호화된 연결을 활성화하는 데 필수적인 구성 요소인 개인 키와 해당 자체 서명 SSL 인증서를 생성했습니다.

인증서를 생성한 후 Nginx 서버를 구성했습니다. 여기에는 HTTPS 트래픽을 위해 포트 443 에서 수신 대기하는 서버 블록을 생성하고 새 인증서와 개인 키의 경로를 가리키도록 구성 파일을 수정하는 작업이 포함되었습니다. 프로세스를 완료하기 위해 새 구성을 활성화하고 중요한 확인 단계를 수행했습니다. curl 명령을 사용하여 명령줄에서 HTTPS 연결을 테스트하고 서버가 안전하게 응답하고 있음을 확인했습니다. 마지막으로 OpenSSL 을 클라이언트 도구로 사용하여 서버의 인증서를 검사하고 올바른 인증서가 제공되고 있는지 확인했습니다.