RHEL/CentOS 7/6에서 Apache를 보안하는 Let’s Encrypt SSL 인증서 설치하는 방법

지난 Let’s Encrypt 튜토리얼을 확장하여 SSL/TLS 무료 인증서에 대해, 이 기사에서는 Let’s Encrypt 인증 기관에서 발급한 무료 SSL/TLS 인증서를 Apache 웹 서버에 설치하는 방법을 보여드리겠습니다. 또한 CentOS/RHEL 7/6 및 Fedora 배포판에서도 설치하는 방법을 안내합니다.

Debian 및 Ubuntu에 Apache용 Let’s Encrypt을 설치하려면 아래 가이드를 따르세요:

Debian 및 Ubuntu에서 Apache를 보호하기 위해 Let’s Encrypt 설정

테스트 샘플 환경
Install Lets Encrypt for Apache on CentOS and RHEL

요구 사항

  1. A registered domain name with valid A records to point back to your server public IP Address.
  2. SSL 모듈이 설치된 Apache 서버 및 다중 도메인 또는 서브도메인을 호스팅하는 경우 가상 호스팅이 활성화되어 있어야 합니다.

단계 1: Apache 웹 서버 설치

1. 이미 설치되어 있지 않은 경우, 아래 명령을 사용하여 httpd 데몬을 설치할 수 있습니다:

# yum install httpd

2. Let’s encrypt 소프트웨어가 Apache와 작동하도록 하려면 아래 명령을 사용하여 SSL/TLS 모듈이 설치되어 있는지 확인하세요:

# yum -y install mod_ssl

3. 마지막으로 다음 명령을 사용하여 Apache 서버를 시작하세요:

# systemctl start httpd.service          [On RHEL/CentOS 7]
# service httpd start                    [On RHEL/CentOS 6]

단계 2: Let’s Encrypt SSL 인증서 설치

4. Let’s Encrypt 클라이언트를 설치하는 가장 간단한 방법은 파일 시스템에서 github 저장소를 복제하는 것입니다. 시스템에 git을 설치하려면 다음 명령을 사용하여 Epel 저장소를 활성화해야 합니다.

# yum install epel-release

5. Epel 저장소가 시스템에 추가되면 아래 명령을 실행하여 git 클라이언트를 설치하세요:

# yum install git

6. 이제, Let’s Encrypt를 처리하기 위해 필요한 모든 종속성을 설치했다면, /usr/local/ 디렉토리로 이동하여 다음 명령을 사용하여 Let’s Encrypt 클라이언트를 공식 github 저장소에서 가져오세요:

# cd /usr/local/
# git clone https://github.com/letsencrypt/letsencrypt

단계 3: Apache용 무료 Let’s Encrypt SSL 인증서 획득

7. Apache용 무료 Let’s Encrypt 인증서를 획득하는 과정은 CentOS/RHEL에서 apache 플러그인 덕분에 자동화됩니다.

Let’s Encrypt 스크립트 명령을 실행하여 SSL 인증서를 획득하세요. /usr/local/letsencrypt에서 Let’s Encrypt 설치 디렉토리로 이동하고 letsencrypt-auto 명령을 실행하면서 --apache 옵션과 각 서브도메인에 대한 인증서가 필요한 경우 -d 플래그를 제공하세요.

# cd /usr/local/letsencrypt
# ./letsencrypt-auto --apache -d your_domain.tld 
Create Lets Encrypt SSL Certificate for Apache

8. Let’s Encrypt가 잃어버린 키를 복구하거나 긴급 공지를 받기 위해 사용할 이메일 주소를 입력하고 Enter를 눌러 계속하세요.

Add Email Address for Lets Encrypt

9. Enter 키를 눌러 라이선스 조건에 동의하세요.

Agree Lets Encrypt License

10. 기본적으로 CentOS/RHEL에서는 Apache 서버가 활성 호스트와 사용 가능하지 않은(비활성) 호스트를 구분하는 개념을 사용하지 않습니다. 이는 Debian 기반 배포판에서 하는 것과 다릅니다.

또한, 가상 호스팅은 기본적으로 비활성화되어 있습니다. 서버 이름을 지정하는 Apache 문장(ServerName)은 SSL 구성 파일에 존재하지 않습니다.

이 지시문을 활성화하려면, Let’s Encrypt가 가상 호스트를 선택하도록 요구할 것입니다. 사용 가능한 Vhost를 찾을 수 없기 때문에, Let’s Encrypt 클라이언트가 자동으로 수정할 ssl.conf 파일을 선택하고 계속하려면 Enter를 누르세요.

Active VirtualHost Directive and Select Mod_SSL

11. 다음으로, HTTP 요청에 대해 쉬운 방법을 선택하고 계속하려면 Enter를 누르세요.

Allow Easy HTTP Requests

12. 마지막으로, 모든 것이 순조롭게 진행되었다면, 환영 메시지가 화면에 표시될 것입니다. 프롬프트를 해제하려면 Enter를 누르세요.

Lets Encrypt Enabled on Domain

이게 다입니다! 도메인에 대한 SSL/TLS 인증서를 성공적으로 발급했습니다. 이제 HTTPS 프로토콜을 사용하여 웹사이트를 브라우징할 수 있습니다.

단계 4: 도메인에서 무료 Let’s Encrypt 암호화 테스트하기

13. 도메인 SSL/TLS 핸드셰이크의 직접성을 테스트하려면 아래 링크를 방문하여 도메인에서 인증서를 테스트하십시오.

https://www.ssllabs.com/ssltest/analyze.html
Verify Lets Encrypt Certificate on Domain

14. 만약 수행된 테스트에서 도메인 취약성에 관한 일련의 보고서를 받는다면, 그 보안 취약점을 즉시 수정해야 합니다.

전체 등급이 C 등급인 경우 도메인이 매우 불안전해집니다. 이러한 보안 문제를 해결하려면 Apache SSL 구성 파일을 열고 다음 변경 사항을 수행하십시오:

# vi /etc/httpd/conf.d/ssl.conf

SSLProtocol 문이 포함된 줄을 찾아 해당 줄 끝에 -SSLv3를 추가하십시오.

Fix Apache SSL Configuration

파일을 더 깊이 들어가서 SSLCipherSuite 문이 포함된 줄을 찾아 해당 줄 앞에 #를 넣어 주석 처리하고 해당 줄 아래에 다음 내용을 추가하십시오:

SSLCipherSuite          ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder     on
SSLOptions +StrictRequire
Configure SSL Configuration

15. 위의 모든 변경 사항을 적용한 후 파일을 저장하고 닫은 다음 Apache 데몬을 다시 시작하여 변경 사항을 적용하십시오.

# systemctl restart httpd.service          [On RHEL/CentOS 7]
# service httpd restart                    [On RHEL/CentOS 6]

16. 이제 도메인 암호화 상태를 다시 테스트하려면 위와 동일한 링크를 방문하여 테스트하십시오. 다시 테스트하려면 웹 사이트에서 캐시 지우기 링크를 클릭하십시오.

https://www.ssllabs.com/ssltest/analyze.html 
Test Lets Encrypt SSL Certificate on Website

이제 전체 등급이 A 등급인 것을 확인해야 합니다. 이는 도메인이 매우 안전하다는 것을 의미합니다.

단계 4: Apache에서 Let’s Encrypt 인증서 자동 갱신

17. Let’s Encrypt 소프트웨어의 베타 버전은 인증서를 90일 후 만료되는 날짜로 릴리스합니다. 따라서 SSL 인증서를 갱신하려면 만료일 이전에 동일한 옵션과 플래그를 사용하여 초기 인증서를 획득할 때 사용한 letsencrypt-auto 명령을 다시 실행해야 합니다.

인증서를 수동으로 갱신하는 예시가 아래에 제시되어 있습니다.

# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --apache --renew-by-default  -d your_domain.tld

18. 이 프로세스를 자동화하려면 다음 콘텐츠로 제공된 bash 스크립트를 만들어야 합니다. github erikaheidi에서 제공한 것을 /usr/local/bin/ 디렉토리에 만들어 주세요. (스크립트는 우리의 letsencrypt 설치 디렉토리를 반영하기 위해 약간 수정되었습니다).

# vi /usr/local/bin/le-renew-centos

le-renew-centos 파일에 다음 콘텐츠를 추가하세요.

!/bin/bash

domain=$1
le_path='/usr/local/letsencrypt'
le_conf='/etc/letsencrypt'
exp_limit=30;

get_domain_list(){
        certdomain=$1
        config_file="$le_conf/renewal/$certdomain.conf"

        if [ ! -f $config_file ] ; then
                echo "[ERROR] The config file for the certificate $certdomain was not found."
                exit 1;
        fi

        domains=$(grep --only-matching --perl-regex "(?<=domains \= ).*" "${config_file}")
        last_char=$(echo "${domains}" | awk '{print substr($0,length,1)}')

        if [ "${last_char}" = "," ]; then
                domains=$(echo "${domains}" |awk '{print substr($0, 1, length-1)}')
        fi

        echo $domains;
}

if [ -z "$domain" ] ; then
        echo "[ERROR] you must provide the domain name for the certificate renewal."
        exit 1;
fi

cert_file="/etc/letsencrypt/live/$domain/fullchain.pem"

if [ ! -f $cert_file ]; then
        echo "[ERROR] certificate file not found for domain $domain."
        exit 1;
fi

exp=$(date -d "`openssl x509 -in $cert_file -text -noout|grep "Not After"|cut -c 25-`" +%s)
datenow=$(date -d "now" +%s)
days_exp=$(echo \( $exp - $datenow \) / 86400 |bc)

echo "Checking expiration date for $domain..."

if [ "$days_exp" -gt "$exp_limit" ] ; then
        echo "The certificate is up to date, no need for renewal ($days_exp days left)."
        exit 0;
else
        echo "The certificate for $domain is about to expire soon. Starting renewal request..."
        domain_list=$( get_domain_list $domain )
        "$le_path"/letsencrypt-auto certonly --apache --renew-by-default --domains "${domain_list}"
        echo "Restarting Apache..."
        /usr/bin/systemctl restart httpd
        echo "Renewal process finished for domain $domain"
        exit 0;
fi

19. 스크립트에 실행 권한을 부여하고, bc 패키지를 설치하고, 스크립트를 실행하여 테스트하세요. 이 단계를 완료하기 위해 아래 명령어를 사용하세요.

# yum install bc
# chmod +x /usr/local/bin/le-renew-centos
# /usr/local/bin/le-renew-centos your_domain.tld

20. 마지막으로, 리눅스 스케줄링을 사용하여 매 두 달마다 스크립트를 실행하는 새로운 cron 작업을 추가하여 인증서가 만료되기 전에 업데이트되도록 보장하세요.

# crontab -e

파일의 맨 아래에 다음 줄을 추가하세요.

0 1 1 */2 * /usr/local/bin/le-renew-centos your_domain.tld >> /var/log/your_domain.tld-renew.log 2>&1

이것으로 끝났습니다! CentOS/RHEL 시스템 위에서 실행 중인 Apache 서버가 무료 Let’s Encrypt SSL 인증서를 사용하여 SSL 콘텐츠를 제공하고 있습니다.

Source:
https://www.tecmint.com/install-lets-encrypt-ssl-certificate-to-secure-apache-on-rhel-centos/