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
을 설치할 수 있습니다.
- sudo yum install mod_ssl
모듈은 설치 중에 자동으로 활성화되며 Apache는 다시 시작된 후 SSL 인증서를 사용하여 시작할 수 있습니다. mod_ssl
을 사용할 수 있도록 추가 단계를 수행할 필요가 없습니다.
2단계 - 새 인증서 생성
이제 Apache가 암호화를 사용할 준비가 되었으므로 새 SSL 인증서 생성으로 이동할 수 있습니다. TLS/SSL은 공개 인증서와 개인 키의 조합을 사용하여 작동합니다. SSL 키는 서버에서 비밀로 유지됩니다. 클라이언트로 전송되는 콘텐츠를 암호화하는 데 사용됩니다. SSL 인증서는 콘텐츠를 요청하는 모든 사람과 공개적으로 공유됩니다. 연결된 SSL 키로 서명된 콘텐츠를 해독하는 데 사용할 수 있습니다.
공개 인증서를 보유하는 데 사용할 수 있는 /etc/ssl/certs
디렉토리는 서버에 이미 존재해야 합니다. 개인 키 파일을 보관하려면 /etc/ssl/private
디렉토리도 만들어야 합니다. 이 키의 비밀성은 보안에 필수적이므로 무단 액세스를 방지하기 위해 권한을 잠그는 것이 중요합니다.
- sudo mkdir /etc/ssl/private
- sudo chmod 700 /etc/ssl/private
이제 다음을 입력하여 단일 명령으로 OpenSSL을 사용하여 자체 서명된 키 및 인증서 쌍을 생성할 수 있습니다.
- 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 주소를 입력하는 것이 중요합니다. 여기에 있는 값은 사용자가 서버에 액세스하는 방법과 일치해야 합니다.
전체 프롬프트는 다음과 같습니다.
OutputCountry 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 그룹도 만들어야 합니다.
다음을 입력하면 됩니다.
- sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
이 작업은 몇 분 정도 걸릴 수 있지만 완료되면 구성에서 사용할 수 있는 /etc/ssl/certs/dhparam.pem
에 강력한 DH 그룹이 생성됩니다.
3단계 - 인증서 설정
이제 완성된 인터페이스의 모든 필수 구성 요소가 있습니다. 다음으로 할 일은 새 인증서를 표시하도록 가상 호스트를 설정하는 것입니다.
/etc/httpd/conf.d
디렉토리에서 새 파일을 엽니다.
- 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
을 제거하고 SSLSessionTickets
및 SSLOpenSSLConfCmd
지시문을 주석 처리하는 것입니다. 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
로 끝나는 파일을 만들고 엽니다.
- 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 서버를 다시 시작하여 해당 구성 및 모듈을 다시 로드할 수 있습니다.
먼저 다음을 입력하여 구문 오류에 대한 구성 파일을 확인하십시오.
- sudo apachectl configtest
출력이 Syntax OK
로 끝나는 한 계속해도 안전합니다. 이것이 출력의 일부가 아닌 경우 파일의 구문을 확인하고 다시 시도하십시오.
Output. . .
Syntax OK
다음을 입력하여 변경 사항을 적용하려면 Apache 서버를 다시 시작하십시오.
- sudo systemctl restart httpd.service
다음으로 방화벽에서 포트 80 및 443이 열려 있는지 확인합니다. 방화벽을 실행하고 있지 않다면 건너뛸 수 있습니다.
firewalld
방화벽이 실행 중인 경우 다음을 입력하여 이러한 포트를 열 수 있습니다.
- sudo firewall-cmd --add-service=http
- sudo firewall-cmd --add-service=https
- sudo firewall-cmd --runtime-to-permanent
iptables
방화벽이 실행 중인 경우 실행해야 하는 명령은 현재 규칙 세트에 크게 의존합니다. 기본 규칙 세트의 경우 다음을 입력하여 HTTP 및 HTTPS 액세스를 추가할 수 있습니다.
- sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
- 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 인증서를 구입해야 합니다.