웹사이트 검색

CentOS 7용 Apache에서 SSL 인증서를 만드는 방법


소개

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

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

이 가이드에서는 CentOS 7 서버에서 Apache 웹 서버와 함께 사용할 자체 서명 SSL 인증서를 설정합니다.

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

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

보다 생산 준비가 된 인증서 솔루션에 대해서는 CentOS 7 자습서에서 Let’s Encrypt 인증서로 Apache 설정을 확인하십시오.

전제 조건

이 가이드를 시작하기 전에 먼저 완료해야 하는 몇 가지 단계가 있습니다.

  • sudo 권한이 있는 루트가 아닌 사용자로 CentOS 7 서버에 액세스해야 합니다. 아직 구성하지 않은 경우 CentOS 7 초기 서버 설정 가이드를 실행하여 이 계정을 만들 수 있습니다.
  • 또한 CentOS 7에 Apache 웹 서버를 설치하는 방법 자습서의 1단계에 설명된 대로 Apache를 설치해야 합니다.\n이 단계가 완료되면 SSH를 통해 루트가 아닌 사용자 계정으로 로그인하고 자습서를 계속 진행할 수 있습니다.

1단계 - mod_ssl 설치

자체 서명된 인증서를 설정하려면 먼저 SSL 암호화를 지원하는 Apache 모듈인 mod_ssl이 서버에 설치되어 있는지 확인해야 합니다. yum 명령으로 mod_ssl을 설치할 수 있습니다.

  1. sudo yum install mod_ssl

모듈은 설치 중에 자동으로 활성화되며 Apache는 다시 시작된 후 SSL 인증서를 사용하여 시작할 수 있습니다. mod_ssl을 사용할 수 있도록 추가 단계를 수행할 필요가 없습니다.

2단계 - 새 인증서 생성

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

공개 인증서를 보유하는 데 사용할 수 있는 /etc/ssl/certs 디렉토리는 서버에 이미 존재해야 합니다. 개인 키 파일을 보관하려면 /etc/ssl/private 디렉토리도 만들어야 합니다. 이 키의 비밀성은 보안에 필수적이므로 무단 액세스를 방지하기 위해 권한을 잠그는 것이 중요합니다.

  1. sudo mkdir /etc/ssl/private
  2. sudo chmod 700 /etc/ssl/private

이제 다음을 입력하여 단일 명령으로 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) [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 디렉토리의 적절한 하위 디렉토리에 배치됩니다.

OpenSSL을 사용하고 있으므로 클라이언트와 Perfect Forward Secrecy 협상에 사용되는 강력한 Diffie-Hellman 그룹도 만들어야 합니다.

다음을 입력하면 됩니다.

  1. sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

이 작업은 몇 분 정도 걸릴 수 있지만 완료되면 구성에서 사용할 수 있는 /etc/ssl/certs/dhparam.pem에 강력한 DH 그룹이 생성됩니다.

3단계 - 인증서 설정

이제 완성된 인터페이스의 모든 필수 구성 요소가 있습니다. 다음으로 할 일은 새 인증서를 표시하도록 가상 호스트를 설정하는 것입니다.

/etc/httpd/conf.d 디렉토리에서 새 파일을 엽니다.

  1. sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

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

<VirtualHost *:443>
    ServerName your_domain_or_ip
    DocumentRoot /var/www/html
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

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

보안 SSL 매개변수 설정

다음으로 사이트의 보안을 강화할 몇 가지 추가 SSL 옵션을 추가합니다. 사용할 옵션은 Cipherlist.eu의 권장 사항입니다. 이 사이트는 널리 사용되는 소프트웨어에 사용하기 쉬운 암호화 설정을 제공하도록 설계되었습니다.

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

두 주석 블록 사이의 위 구성에서 기본 제안 대신 호환성 목록을 사용할 수 있습니다. 사용하는 구성의 선택은 지원해야 하는 항목에 따라 크게 달라집니다.

수정할 구성이 몇 가지 있습니다. 먼저 resolver 지시문에 대한 업스트림 요청에 대해 선호하는 DNS 확인자를 추가할 수 있습니다. 이 가이드에 Google을 사용했지만 다른 기본 설정이 있는 경우 이를 변경할 수 있습니다.

마지막으로 잠시 시간을 내어 "사전 로드\ 기능에 대해 읽어보십시오. HSTS를 사전 로드하면 보안이 강화되지만 실수로 활성화하거나 잘못 활성화하면 광범위한 결과를 초래할 수 있습니다. 이 가이드에서는 설정을 사전 로드하지 않지만 다음을 수행할 수 있습니다. 의미를 이해했다고 확신하는 경우 수정하십시오.

다른 변경 사항은 +TLSv1.3을 제거하고 SSLSessionTicketsSSLOpenSSLConfCmd 지시문을 주석 처리하는 것입니다. CentOS 7과 함께 제공되는 Apache 버전.

VirtualHost 블록이 끝난 후 사이트의 설정을 붙여넣습니다.


    . . .
</VirtualHost>
. . .

# Begin copied text
# from https://cipherli.st/

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM
# Requires Apache 2.4.36 & OpenSSL 1.1.1
SSLProtocol -all +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 Strict-Transport-Security "max-age=63072000; includeSubdomains"
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
# SSLSessionTickets Off

이러한 변경을 마치면 파일을 저장하고 닫을 수 있습니다.

HTTP에서 HTTPS로 리디렉션 만들기(선택 사항)

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

모든 트래픽을 SSL 암호화로 리디렉션하려면 /etc/httpd/conf.d 디렉터리에서 .conf로 끝나는 파일을 만들고 엽니다.

  1. sudo vi /etc/httpd/conf.d/non-ssl.conf

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

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

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

4단계 - Apache 구성 변경 사항 적용

지금까지 SSL 인증서를 생성하고 이를 사이트에 적용하도록 웹 서버를 구성했습니다. 이러한 모든 변경 사항을 적용하고 SSL 암호화 사용을 시작하려면 Apache 서버를 다시 시작하여 해당 구성 및 모듈을 다시 로드할 수 있습니다.

먼저 다음을 입력하여 구문 오류에 대한 구성 파일을 확인하십시오.

  1. sudo apachectl configtest

출력이 Syntax OK로 끝나는 한 계속해도 안전합니다. 이것이 출력의 일부가 아닌 경우 파일의 구문을 확인하고 다시 시도하십시오.

Output
. . . Syntax OK

다음을 입력하여 변경 사항을 적용하려면 Apache 서버를 다시 시작하십시오.

  1. sudo systemctl restart httpd.service

다음으로 방화벽에서 포트 80 및 443이 열려 있는지 확인합니다. 방화벽을 실행하고 있지 않다면 건너뛸 수 있습니다.

firewalld 방화벽이 실행 중인 경우 다음을 입력하여 이러한 포트를 열 수 있습니다.

  1. sudo firewall-cmd --add-service=http
  2. sudo firewall-cmd --add-service=https
  3. sudo firewall-cmd --runtime-to-permanent

iptables방화벽이 실행 중인 경우 실행해야 하는 명령은 현재 규칙 세트에 크게 의존합니다. 기본 규칙 세트의 경우 다음을 입력하여 HTTP 및 HTTPS 액세스를 추가할 수 있습니다.

  1. sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
  2. sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

5단계 - 암호화 테스트

이제 SSL 서버를 테스트할 준비가 되었습니다.

웹 브라우저를 열고 주소 표시줄에 https:// 다음에 서버의 도메인 이름 또는 IP를 입력합니다.

https://your_domain_or_ip

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

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

귀하의 사이트로 이동해야 합니다. 브라우저 주소 표시줄을 보면 부분 보안 표시가 표시됩니다. 이것은 그 위에 "x\가 있는 자물쇠이거나 느낌표가 있는 삼각형일 수 있습니다. 이 경우 이는 인증서를 확인할 수 없음을 의미합니다. 여전히 연결을 암호화하고 있습니다.

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

http://your_domain_or_ip

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

결론

HTTP 및 HTTPS 요청을 모두 처리하도록 Apache 서버를 구성했습니다. 이렇게 하면 클라이언트와 안전하게 통신하고 외부인이 트래픽을 읽을 수 없도록 방지할 수 있습니다.

공개 웹 사이트에 SSL을 사용할 계획이라면 각 방문자에게 무서운 경고가 표시되지 않도록 신뢰할 수 있는 인증 기관에서 SSL 인증서를 구입해야 합니다.