웹사이트 검색

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


소개

TLS(Transport Layer Security)와 이전 SSL(Secure Sockets Layer)은 일반 트래픽을 보호되고 암호화된 래퍼로 래핑하는 데 사용되는 웹 프로토콜입니다.

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

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

참고: 자체 서명된 인증서는 서버와 모든 클라이언트 간의 통신을 암호화합니다. 그러나 웹 브라우저 및 운영 체제에 포함된 신뢰할 수 있는 인증 기관에서 서명하지 않았기 때문에 사용자는 인증서를 사용하여 서버 ID를 자동으로 확인할 수 없습니다. 결과적으로 사용자는 사이트를 방문할 때 보안 오류를 보게 됩니다.

이러한 제한으로 인해 자체 서명된 인증서는 대중에게 서비스를 제공하는 프로덕션 환경에 적합하지 않습니다. 일반적으로 대체 통신 채널을 통해 인증서의 유효성에 대한 신뢰를 설정할 수 있는 단일 사용자 또는 소규모 사용자 그룹이 사용하는 중요하지 않은 서비스를 보안하거나 테스트하는 데 사용됩니다.

보다 생산 준비가 된 인증서 솔루션에 대해서는 Ubuntu 16.04 자습서에서 Let’s Encrypt로 Apache를 보호하는 방법을 확인하십시오.

전제 조건

이 튜토리얼을 시작하기 전에 다음이 필요합니다.

  • Access to a Ubuntu 16.04 server with a non-root, sudo-enabled user. Our Initial Server Setup with Ubuntu 16.04 guide can show you how to create this account.

  • You will also need to have Apache installed. You can install Apache using apt. First, update the local package index to reflect the latest upstream changes:

    1. sudo apt update

    Then, install the apache2 package:

    1. sudo apt install apache2

    And finally, if you have a ufw firewall set up, open up the http and https ports:

    1. sudo ufw allow "Apache Full"

이 단계를 완료한 후 루트가 아닌 사용자로 로그인했는지 확인하고 자습서를 계속 진행하십시오.

1단계 - mod_ssl 활성화

모든 SSL 인증서를 사용하려면 먼저 SSL 암호화를 지원하는 Apache 모듈인 mod_ssl을 활성화해야 합니다.

a2enmod 명령으로 mod_ssl을 활성화합니다.

  1. sudo a2enmod ssl

모듈을 활성화하려면 Apache를 다시 시작하십시오.

  1. sudo systemctl restart apache2

이제 mod_ssl 모듈이 활성화되어 사용할 준비가 되었습니다.

2단계 - SSL 인증서 생성

이제 Apache가 암호화를 사용할 준비가 되었으므로 새 SSL 인증서 생성으로 넘어갈 수 있습니다. 인증서는 사이트에 대한 몇 가지 기본 정보를 저장하고 서버가 암호화된 데이터를 안전하게 처리할 수 있도록 하는 키 파일과 함께 제공됩니다.

openssl 명령을 사용하여 SSL 키와 인증서 파일을 만들 수 있습니다.

  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에 우리가 만들고 있는 인증서를 둘 위치를 알려줍니다.

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

프롬프트를 적절하게 작성하십시오. 가장 중요한 줄은 일반 이름을 요청하는 줄입니다. 서버에 액세스하는 데 사용할 호스트 이름이나 서버의 공용 IP를 입력해야 합니다. 일치하지 않으면 더 많은 보안 오류가 발생하므로 이 필드는 사이트에 액세스하기 위해 브라우저의 주소 표시줄에 입력하는 내용과 일치해야 합니다.

전체 프롬프트는 다음과 같습니다.

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com

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

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

이제 자체 서명된 인증서와 키를 사용할 수 있으므로 이를 사용하려면 Apache 구성을 업데이트해야 합니다. Ubuntu에서 새 Apache 구성 파일(.conf로 끝나야 함)을 /etc/apache2/sites-available/에 배치하면 다음에 로드됩니다. Apache 프로세스가 다시 로드되거나 다시 시작됩니다.

이 자습서에서는 새로운 최소 구성 파일을 생성합니다. (이미 Apache 가 설정되어 있고 여기에 SSL을 추가하기만 하면 SSL로 시작하는 구성 줄을 복사해야 할 가능성이 높습니다. VirtualHost 포트를 80에서 443으로 전환합니다. 다음 단계에서 80 포트를 처리하겠습니다. )

/etc/apache2/sites-available 디렉토리에서 새 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

다음 최소 VirtualHost 구성을 붙여넣습니다.

<VirtualHost *:443>
   ServerName your_domain_or_ip
   DocumentRoot /var/www/your_domain_or_ip

   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

서버 주소를 지정하려는 방식으로 ServerName 행을 업데이트해야 합니다. 이것은 호스트 이름, 전체 도메인 이름 또는 IP 주소일 수 있습니다. 선택한 항목이 인증서를 만들 때 선택한 일반 이름과 일치하는지 확인하십시오.

나머지 줄은 파일을 제공할 DocumentRoot 디렉토리와 Apache를 새로 생성된 인증서 및 키로 지정하는 데 필요한 SSL 옵션을 지정합니다.

이제 DocumentRoot를 만들고 테스트 목적으로만 HTML 파일을 넣겠습니다.

  1. sudo mkdir /var/www/your_domain_or_ip

텍스트 편집기로 새 index.html 파일을 엽니다.

  1. sudo nano /var/www/your_domain_or_ip/index.html

빈 파일에 다음을 붙여넣습니다.

<h1>it worked!</h1>

물론 이것은 전체 HTML 파일이 아니지만 브라우저가 관대하므로 구성을 확인하기에 충분합니다.

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

  1. sudo a2ensite your_domain_or_ip.conf

구성을 활성화하기 위해 Apache를 다시 시작하라는 메시지가 표시되지만 먼저 구성 오류를 테스트해 보겠습니다.

  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 reload apache2

이제 처음에 https://를 사용하여 브라우저에서 사이트를 로드합니다.

오류가 표시됩니다. 이는 자체 서명된 인증서의 경우 정상입니다! 브라우저는 알려진 인증 기관에서 인증서에 서명하지 않았기 때문에 서버의 ID를 확인할 수 없다고 경고합니다. 테스트 목적 및 개인적인 용도로는 괜찮을 수 있습니다. 고급 또는 추가 정보를 클릭하여 계속 진행하도록 선택할 수 있어야 합니다.

이렇게 하면 브라우저가 it works! 메시지를 로드합니다.

참고: 브라우저가 서버에 전혀 연결되지 않는 경우 연결이 방화벽에 의해 차단되고 있지 않은지 확인하십시오. ufw를 사용하는 경우 다음 명령은 포트 80443을 엽니다.

  1. sudo ufw allow "Apache Full"

다음으로 구성에 다른 VirtualHost 섹션을 추가하여 일반 HTTP 요청을 제공하고 HTTPS로 리디렉션합니다.

4단계 - HTTP를 HTTPS로 리디렉션

현재 구성은 포트 443의 HTTPS 요청에만 응답합니다. 모든 트래픽을 강제로 암호화하려는 경우에도 80 포트에서 응답하는 것이 좋습니다. 이러한 암호화되지 않은 요청에 응답하고 HTTPS로 리디렉션하도록 VirtualHost를 설정해 보겠습니다.

이전 단계에서 시작한 것과 동일한 Apache 구성 파일을 엽니다.

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

맨 아래에서 다른 VirtualHost 블록을 만들어 포트 80의 요청과 일치시킵니다. ServerName 지시문을 사용하여 도메인 이름 또는 IP 주소를 다시 일치시킵니다. 그런 다음 Redirect를 사용하여 모든 요청을 일치시키고 SSL VirtualHost로 보냅니다. 후행 슬래시를 포함해야 합니다.

<VirtualHost *:80>
    ServerName your_domain_or_ip
    Redirect / https://your_domain_or_ip/
</VirtualHost>

완료되면 이 파일을 저장하고 닫은 다음 구성 구문을 다시 테스트하고 Apache를 다시 로드합니다.

  1. sudo apachectl configtest
  2. sudo systemctl reload apache2

주소 앞에 일반 http://가 있는 사이트를 방문하여 새로운 리디렉션 기능을 테스트할 수 있습니다. 자동으로 https://로 리디렉션되어야 합니다.

결론

이제 자체 서명된 SSL 인증서를 사용하여 암호화된 요청을 제공하고 암호화되지 않은 HTTP 요청을 HTTPS로 리디렉션하도록 Apache를 구성했습니다.

공개 웹사이트에 SSL을 사용할 계획이라면 도메인 이름을 구입하고 Let’s Encrypt와 같이 널리 지원되는 인증 기관을 사용하는 것을 고려해야 합니다.

Let's Encrypt with Apache 사용에 대한 자세한 내용은 Ubuntu 16.04에서 Let's Encrypt로 Apache를 보호하는 방법 자습서를 참조하십시오.