웹사이트 검색

Ubuntu 18.04에서 Apache용 자체 서명 SSL 인증서를 만드는 방법


소개

TLS 또는 전송 계층 보안보안 소켓 계층을 나타내는 전신인 SSL은 웹 프로토콜입니다. 보호되고 암호화된 래퍼에서 일반 트래픽을 래핑하는 데 사용됩니다.

이 기술을 사용하여 서버는 외부 당사자가 메시지를 가로챌 가능성 없이 서버와 클라이언트 간에 안전하게 트래픽을 보낼 수 있습니다. 인증서 시스템은 또한 사용자가 연결 중인 사이트의 신원을 확인하는 데 도움을 줍니다.

이 가이드에서는 Ubuntu 18.04에서 Apache 웹 서버와 함께 사용하기 위해 자체 서명된 SSL 인증서를 설정하는 방법을 배웁니다.

참고: 자체 서명된 인증서는 서버와 모든 클라이언트 간의 통신을 암호화합니다. 그러나 웹 브라우저에 포함된 신뢰할 수 있는 인증 기관(CA)에서 서명하지 않았기 때문에 사용자는 인증서를 사용하여 서버 ID를 자동으로 확인할 수 없습니다.

자체 서명된 인증서는 서버와 연결된 도메인 이름이 없고 암호화된 웹 인터페이스가 사용자를 향하지 않는 인스턴스에 적합할 수 있습니다. 도메인 이름이 있는 경우 대부분의 경우 CA 서명 인증서를 사용하는 것이 좋습니다. Ubuntu 18.04에서 Let’s Encrypt를 사용하여 Apache를 보호하는 방법에 대한 가이드를 통해 신뢰할 수 있는 무료 인증서를 설정하는 방법에 대해 자세히 알아보세요.

전제 조건

이 자습서를 완료하려면 다음이 필요합니다.

  • 루트가 아닌 사용자가 sudo 권한으로 구성되고 방화벽이 활성화된 Ubuntu 18.04 서버 1대. Ubuntu 18.04의 초기 서버 설정에 따라 이러한 사용자 계정을 설정할 수 있습니다.
  • Apache 웹 서버가 설치되었습니다. 서버에 전체 LAMP(Linux, Apache, MySQL, PHP) 스택을 설치하려면 Ubuntu 18.04에서 LAMP 설정 가이드를 따르세요. Apache 웹 서버만 원하는 경우 PHP 및 MySQL과 관련된 단계를 건너뜁니다.

사전 요구 사항을 완료했으면 다음 단계를 계속합니다.

1단계 - SSL 인증서 생성

TLS/SSL은 공개 인증서와 개인 키의 조합을 사용하여 작동합니다. SSL 키는 서버에서 비밀로 유지됩니다. 클라이언트로 전송되는 콘텐츠를 암호화하는 데 사용됩니다. SSL 인증서는 콘텐츠를 요청하는 모든 사람과 공개적으로 공유됩니다. 연결된 SSL 키로 서명된 콘텐츠를 해독하는 데 사용할 수 있습니다.

단일 OpenSSL 명령으로 자체 서명된 키 및 인증서 쌍을 생성할 수 있습니다.

  1. sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

그러면 일련의 질문이 표시됩니다. 이에 대해 논의하기 전에 실행 중인 명령에서 어떤 일이 발생하는지 검토해 보겠습니다.

  • openssl: 이것은 OpenSSL 인증서, 키 및 기타 파일을 만들고 관리하기 위한 기본 명령줄 도구입니다.
  • req: 이 하위 명령은 X.509 인증서 서명 요청(CSR) 관리를 사용하도록 지정합니다. "X.509\는 SSL 및 TLS가 키 및 인증서 관리를 위해 준수하는 공개 키 인프라 표준입니다. 새 X.509 인증서를 만들려면 이 하위 명령을 사용합니다.
  • -x509: 일반적으로 발생하는 인증서 서명 요청을 생성하는 대신 자체 서명된 인증서를 만들도록 유틸리티에 지시하여 이전 하위 명령을 추가로 수정합니다.
  • -nodes: OpenSSL에 암호로 인증서를 보호하는 옵션을 건너뛰도록 지시합니다. Apache는 서버가 시작될 때 사용자 개입 없이 파일을 읽을 수 있어야 합니다. 암호는 사용자가 다시 시작할 때마다 암호를 입력해야 하므로 이러한 일이 발생하지 않도록 합니다.
  • -days 365: 이 옵션은 인증서가 유효한 것으로 간주되는 기간을 설정합니다. 이 경우 1년으로 설정됩니다.
  • -newkey rsa:2048: 새 인증서와 새 키를 동시에 생성하도록 지정합니다. 인증서 서명에 필요한 키는 이전 단계에서 생성되지 않았으므로 인증서와 함께 생성해야 합니다. rsa:2048 부분은 2048비트 길이의 RSA 키를 만들도록 지시합니다.
  • -keyout: 이 행은 OpenSSL에 생성 중인 개인 키 파일을 저장할 위치를 알려줍니다.
  • -out: OpenSSL에게 생성 중인 인증서를 어디에 둘지 알려줍니다.

앞에서 설명한 것처럼 이러한 옵션은 키 파일과 인증서를 모두 생성합니다. 인증서에 정보를 올바르게 삽입하기 위해 서버에 대한 몇 가지 질문을 받게 됩니다.

프롬프트를 적절하게 작성하십시오. 가장 중요한 줄은 일반 이름(예: 서버 FQDN 또는 귀하의 이름)을 요청하는 줄입니다. 서버와 연결된 도메인 이름을 입력하거나 서버의 공용 IP 주소를 입력해야 합니다.

전체 프롬프트 목록은 다음과 같이 출력됩니다.

Output
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:server_IP_address Email Address []:admin@your_domain.com

생성한 두 파일 모두 /etc/ssl 아래의 적절한 하위 디렉토리에 배치됩니다.

2단계 - SSL을 사용하도록 Apache 구성

/etc/ssl 디렉토리 아래에 키 및 인증서 파일을 성공적으로 생성했습니다. 이제 이를 활용하려면 Apache 구성을 수정해야 합니다.

구성을 몇 가지 조정하면 됩니다.

  1. 구성 스니펫을 생성하여 강력한 기본 SSL 설정을 지정합니다.
  2. 생성된 SSL 인증서를 가리키도록 포함된 SSL Apache 가상 호스트 파일을 수정합니다.
  3. (권장) 요청을 암호화된 가상 호스트로 자동 리디렉션하도록 암호화되지 않은 가상 호스트 파일을 수정합니다.

완료되면 안전한 SSL 구성을 갖게 됩니다.

강력한 암호화 설정으로 Apache 구성 스니펫 생성

시작하려면 Apache 구성 스니펫을 만들어 일부 SSL 설정을 정의합니다. 이것은 강력한 SSL 암호화 제품군으로 Apache를 설정하고 서버 보안을 유지하는 데 도움이 되는 몇 가지 고급 기능을 활성화합니다. 설정할 매개변수는 SSL을 활성화하는 모든 가상 호스트에서 사용할 수 있습니다.

/etc/apache2/conf-available 디렉터리에 새 스니펫을 만듭니다. 이 예에서는 nano를 사용하여 파일을 만들고 목적을 명확히 하기 위해 파일 이름을 ssl-params.conf로 지정합니다. 선호하는 텍스트 편집기를 자유롭게 사용하십시오.

  1. sudo nano /etc/apache2/conf-available/ssl-params.conf

Apache SSL을 안전하게 설정하기 위해 널리 사용되는 소프트웨어에 사용되는 암호화 설정을 이해하는 데 유용하고 이해하기 쉬운 리소스인 Cipherlist.eu의 권장 사항을 적용합니다.

참고: Cipherlist.eu의 이러한 제안 설정은 강력한 보안을 제공합니다. 경우에 따라 클라이언트 호환성을 희생해야 합니다. 이전 클라이언트를 지원해야 하는 경우 "예, 레거시/오래된 소프트웨어에서 작동하는 암호화 제품군을 제공합니다.\라고 표시된 페이지의 링크를 클릭하여 액세스할 수 있는 대체 목록이 있습니다. 원하는 경우 해당 목록을 다음 예제 코드 블록의 콘텐츠로 대체할 수 있습니다.

사용할 구성의 선택은 지원해야 하는 항목에 따라 크게 달라집니다. 둘 다 훌륭한 보안을 제공합니다.

귀하의 목적을 위해 제공된 설정 전체를 복사하십시오. 그러나 Strict-Transport-Security 헤더(HSTS)를 비활성화하여 한 가지 작은 변화를 만들 수 있습니다.

HSTS를 미리 로드하면 보안이 강화되지만 실수로 활성화하거나 잘못 활성화하면 광범위한 결과를 초래할 수 있습니다. 이 가이드에서는 설정을 활성화하지 않지만 그 의미를 이해하고 있다고 확신하는 경우 수정할 수 있습니다.

결정하기 전에 잠시 시간을 내어 "사전 로드\ 기능에 대해 읽어 보십시오.

이제 구성을 ssl-params.conf 파일에 붙여넣습니다.


SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +TLSv1.3 +TLSv1.2
SSLOpenSSLConfCmd Curves X25519:secp521r1:secp384r1:prime256v1
# Older versions
# SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now.  You can use the commented out header line that includes 
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

완료되면 파일을 저장하고 닫습니다. nano를 사용하는 경우 CTRL + X를 누른 다음 YENTER를 눌러 이 작업을 수행할 수 있습니다.

기본 Apache SSL 가상 호스트 파일 수정

다음으로 기본 Apache SSL 가상 호스트 파일인 /etc/apache2/sites-available/default-ssl.conf를 수정합니다. 다른 서버 블록 파일을 사용하는 경우 다음 명령에서 해당 이름을 대체하십시오.

시작하기 전에 원본 SSL 가상 호스트 파일을 백업합니다.

  1. sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

이제 SSL 가상 호스트 파일을 열어 조정합니다.

  1. sudo nano /etc/apache2/sites-available/default-ssl.conf

내부에서 대부분의 주석이 제거된 가상 호스트 파일에는 기본적으로 다음 콘텐츠가 포함됩니다.

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

파일을 약간 조정하게 됩니다. 먼저 가상 호스트 파일에서 조정하려는 일반적인 항목(예: ServerAdmin 이메일 주소, ServerName 등을 설정하고 SSL 인증서 및 키 파일을 가리키는 지시문).

이러한 변경을 수행한 후 서버 블록의 결과는 다음과 같습니다.

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin your_email@example.com
                ServerName server_domain_or_IP

                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
                SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

완료되면 파일을 저장하고 닫습니다.

(권장) HTTPS로 리디렉션되도록 HTTP 호스트 파일 수정

현재 서버는 암호화되지 않은 HTTP 트래픽과 암호화된 HTTPS 트래픽을 모두 제공합니다. 더 나은 보안을 위해 대부분의 경우 HTTP를 HTTPS로 자동 리디렉션하는 것이 좋습니다. 이 기능을 원하지 않거나 필요하지 않은 경우 이 섹션을 건너뛸 수 있습니다.

모든 트래픽을 SSL 암호화로 리디렉션하도록 암호화되지 않은 가상 호스트 파일을 조정하려면 /etc/apache2/sites-available/000-default.conf 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-available/000-default.conf

VirtualHost 구성 블록 내에서 사이트의 SSL 버전에 대한 모든 트래픽을 가리키는 리디렉션 지시문을 추가합니다.

<VirtualHost *:80>
        . . .

        Redirect "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

완료되면 파일을 저장하고 닫습니다.

3단계 - 방화벽 조정

전제 조건 가이드에서 권장하는 대로 ufw 방화벽을 활성화한 경우 SSL 트래픽을 허용하도록 설정을 조정해야 할 수 있습니다. 다행스럽게도 Apache는 설치 시 ufw에 몇 개의 프로필을 등록합니다.

다음을 실행하여 사용 가능한 프로필 목록을 확인합니다.

  1. sudo ufw app list

출력은 다음과 같아야 합니다.

Output
Available applications: Apache Apache Full Apache Secure OpenSSH

상태를 확인하여 현재 설정을 검토할 수 있습니다.

  1. sudo ufw status

이전에 일반 HTTP 트래픽만 허용한 경우 출력 결과는 다음과 같습니다.

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)

추가 HTTPS 트래픽을 허용하려면 "Apache Full\ 프로필을 허용한 다음 중복 "Apache\ 프로필 허용을 삭제할 수 있습니다.

  1. sudo ufw allow 'Apache Full'
  2. sudo ufw delete allow 'Apache'

상태를 확인하여 변경 사항을 확인합니다.

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6)

이제 방화벽에 대한 Apache 트래픽을 성공적으로 허용했습니다.

4단계 - Apache에서 변경 사항 활성화

방화벽을 변경하고 조정했으므로 이제 Apache에서 SSL 및 헤더 모듈을 활성화하고 SSL 지원 가상 호스트를 활성화하고 Apache를 다시 시작할 수 있습니다.

a2enmod 명령을 사용하여 SSL 스니펫의 일부 설정에 필요한 mod_ssl, Apache SSL 모듈 및 mod_headers를 활성화합니다.

  1. sudo a2enmod ssl
  2. sudo a2enmod headers

다음으로 a2ensite 명령을 사용하여 SSL 가상 호스트를 활성화합니다.

  1. sudo a2ensite default-ssl

또한 설정한 값을 읽으려면 ssl-params.conf 파일을 활성화해야 합니다.

  1. sudo a2enconf ssl-params

이 시점에서 귀하의 사이트와 필요한 모듈이 활성화됩니다. 테스트를 통해 파일에 구문 오류가 없는지 확인하십시오.

  1. sudo apache2ctl configtest

모두 성공하면 다음과 같은 결과가 나타납니다.

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK

첫 번째 줄은 ServerName 지시문이 전체적으로 설정되지 않았음을 알리는 메시지입니다. 해당 메시지를 제거하려면 ServerName/etc/apache2/apache2.conf에서 서버의 도메인 이름 또는 IP 주소로 설정할 수 있습니다. 메시지가 해를 끼치지 않으므로 이것은 선택 사항입니다.

출력에 Syntax OK가 있으면 구성 파일에 구문 오류가 없는 것입니다. 이제 Apache를 안전하게 다시 시작하여 변경 사항을 구현할 수 있습니다.

  1. sudo systemctl restart apache2

변경을 완료하고 다음으로 SSL 서버를 테스트합니다.

5단계 - 암호화 테스트

이제 SSL 서버를 테스트할 차례입니다. 웹 브라우저를 열고 주소 표시줄에 https:// 다음에 서버의 도메인 이름 또는 IP를 입력하여 시작합니다.

https://server_domain_or_IP

생성한 인증서가 브라우저의 신뢰할 수 있는 인증 기관 중 하나에서 서명하지 않았기 때문에 다음과 같은 경고가 표시될 수 있습니다.

이는 정상적인 현상입니다. 우리는 인증서의 암호화 측면에만 관심이 있으며 호스트의 신뢰성에 대한 제3자 검증에는 관심이 없습니다. 고급을 클릭한 다음 호스트로 계속 진행할 수 있는 링크가 제공됩니다.

귀하의 사이트로 이동해야 합니다. 브라우저 주소 표시줄에 "x\가 표시된 자물쇠가 표시됩니다. 이는 인증서를 확인할 수 없음을 의미합니다. 여전히 연결을 암호화하고 있습니다.

HTTP를 HTTPS로 리디렉션하도록 Apache를 구성한 경우 리디렉션이 올바르게 작동하는지 확인할 수도 있습니다.

http://server_domain_or_IP

동일한 아이콘이 표시되면 리디렉션이 올바르게 작동했음을 의미합니다.

6단계 - 영구 리디렉션으로 변경

리디렉션이 올바르게 작동하고 암호화된 트래픽만 허용하려는 경우 리디렉션이 영구적으로 되도록 암호화되지 않은 Apache 가상 호스트를 다시 수정해야 합니다.

서버 블록 구성 파일을 다시 엽니다.

  1. sudo nano /etc/apache2/sites-available/000-default.conf

이전에 추가한 Redirect 줄을 찾습니다. 해당 행에 permanent를 추가하면 리디렉션이 302 임시 리디렉션에서 301 영구 리디렉션으로 변경됩니다.

<VirtualHost *:80>
        . . .

        Redirect permanent "/" "https://your_domain_or_IP/"

        . . .
</VirtualHost>

파일을 저장하고 닫습니다.

구문 오류에 대한 구성을 확인하십시오.

  1. sudo apache2ctl configtest

준비가 되면 Apache를 다시 시작하여 리디렉션을 영구적으로 만드십시오.

  1. sudo systemctl restart apache2

암호화된 트래픽만 허용하도록 리디렉션을 영구적으로 만들었습니다.

결론

클라이언트 연결에 강력한 암호화를 사용하도록 Apache 서버를 구성했습니다. 이렇게 하면 요청을 안전하게 처리할 수 있으며 외부인이 트래픽을 읽을 수 없습니다.