Certbot을 사용하여 Apache 또는 Nginx용 Let’s Encrypt SSL 인증서를 얻는 방법

이제 SSL은 SEO (Search Engine Optimization) 신호 중 하나입니다. Google 웹마스터 블로그에서 읽어보세요.

웹사이트가 한두 개뿐이라면 큰 문제가 없습니다. 가장 저렴한 SSL 비용은 연간 약 4-5 USD에 불과합니다.

그러나 100 개의 도메인이 있고 여러 하위 도메인이 필요하다고 상상해보십시오. 연간 약 20 달러의 비용이 드는 SAN 도메인과 연간 약 40 달러의 와일드 카드 도메인이 필요합니다.

예 1 도메인에는 5 개의 하위 도메인이 필요하고 www가 제외되므로 SAN SSL의 경우 2,000 USD, 와일드 카드 SSL의 경우 4000 USD의 비용이 듭니다.

Let’s Encrypt의 무료 솔루션이 있습니다.

Let’s Encrypt는 공공의 이익을 위해 운영되는 무료 자동화 개방형 인증 기관(CA)입니다. ISRG(Internet Security Research Group)에서 제공하는 서비스입니다.

Let’s Encrypt SSL은 3개월 동안 유효하며 만료되기 약 1개월 전에 갱신할 수 있습니다.

Centos 7 및 8에서 Let’s Encrypt를 생성하는 방법

Let’s Encrypt SSL을 생성하려면 certbot binyary가 필요합니다.

기본적으로 Certbot 패키지는 Centos/RHEL 패키지 관리자에서 사용할 수 없습니다.

Certbot을 설치하려면 EPEL 리포지토리를 활성화해야 합니다.

For CentOS/RHEL 7 Only
# yum install epel-release

위의 명령이 작동하지 않거나 CentOS 6 / RHEL 6을 사용하여 수동으로 설치할 수 있습니다.

For CentOS/RHEL 7
# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
 
For CentOS/RHEL 6
# yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm

다음 명령을 사용하여 Certbot를 설치합니다.

# yum install certbot

Let’s Encrypt 인증서 얻기

Nginx에서 Let’s Encrypt Certificate를 사용합니다.

Nginx 또는 Apache용 SSL을 생성할 때 독립형으로 사용합니다. 이 명령은 포트 80에서 실행되는 Nginx 또는 Apache 서비스를 중지하지 않고도 작동합니다.

# certbot certonly -a webroot --webroot-path=/home/serverdiary/public_html --renew-by-default --email [email protected] --agree-tos -d serverdiary.com -d www.serverdiary.com -d img.serverdiary.com

예제 출력 :

# certbot certonly -a webroot --webroot-path=/home/serverdiary/public_html --renew-by-default --email [email protected] --agree-tos -d serverdiary.com -d www.serverdiary.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
........................

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/serverdiary.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/serverdiary.com/privkey.pem
   Your cert will expire on 2020-12-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

이제 SSL 인증서 체인이 /etc/letsencrypt/live/serverdiary.com/fullchain.pem 및 키 파일 /etc/letsencrypt/live/serverdiary.com/privkey.pem에 저장됨

샘플 Nginx 구성 :

server {
	listen       80;
	server_name  serverdiary.com;
	
	root   /home/serverdiary/public_html;
	index  index.php index.html index.htm;
	
	location / {
		return 301 https://serverdiary.com$request_uri;
	}
}
server {
	listen       80;
	server_name  www.serverdiary.com;
	
	root   /home/serverdiary/public_html;
	index  index.php index.html index.htm;
	
	location / {
		return 301 https://serverdiary.com$request_uri;
	}
}
server {
	listen  213.133.110.88:443 ssl http2;
	server_name www.serverdiary.com;
	
	root   /home/serverdiary/public_html;
	index  index.php index.html index.htm;

	access_log off;
	ssl_certificate    		/etc/letsencrypt/live/serverdiary.com/fullchain.pem;
	ssl_certificate_key		/etc/letsencrypt/live/serverdiary.com/privkey.pem;
	
	ssl_session_cache  builtin:1000  shared:SSL:10m;
    #enables all versions of TLS, but not SSLv2 or 3 which are weak and now deprecated.
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:10m;
	add_header Strict-Transport-Security max-age=6048000;
	
	location / {
		return 301 https://serverdiary.com$request_uri;
	}
}
	
server {
	listen  213.133.110.88:443 ssl http2;
	server_name serverdiary.com;
	
	root   /home/serverdiary/public_html;
	index  index.php index.html index.htm;

	gzip	on;
	ssl_certificate    		/etc/letsencrypt/live/serverdiary.com/fullchain.pem;
	ssl_certificate_key		/etc/letsencrypt/live/serverdiary.com/privkey.pem;
	
	#enables all versions of TLS, but not SSLv2 or 3 which are weak and now deprecated.
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
    ssl_prefer_server_ciphers on;
	ssl_session_timeout 1d;
	ssl_session_cache shared:SSL:10m;
	add_header Strict-Transport-Security max-age=6048000;
	
	access_log /var/log/nginx/serverdiary.com.ssl.access.log;
	error_log /var/log/nginx/serverdiary.com.ssl.error.log;
	
	location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|htm|eot|woff|woff2|ttf|svg|otf)$ {
		add_header Cache-Control "public";
		expires 60d;
		log_not_found off;
		access_log off;
	}
	location ~ /.well-known {
		allow all;
	}
	
	...........
	...........
}

연관된 글 :자동 갱신 Systemd를 사용하여 SSL 인증서를 암호화하고 성공하면 Nginx / Apache를 다시 시작합시다.

자동 갱신 : Systemd를 사용하여 SSL 인증서를 암호화하고 성공하면 Nginx / Apache를 다시 시작하기

약 100 또는 200 개의 SSL이 있고 다른 날짜에 생성하면 어떻게 될까요?

예, 큰 문제가 있으며 Let’s Encrypt조차도 SSL 인증서가 약 30일 또는 15일 후에 만료될 때 알려줍니다.

우리는 리눅스 크론잡을 사용할 수 있고, 나는 그것을 사용한 적이 있다. 그러나 그것은 좋은 생각이 아닙니다.

더 좋은 방법은 systemd 서비스와 systemd timer 를 사용하는 것입니다.

systemd.service 및 systemd.timer를 만들어 Let’s Encrypt SSL 인증서를 갱신합니다.

우리는 새로운 Let’s Encrypt SSL 인증서를 얻을 때 Certbot을 독립형으로 사용합니다.

갱신 구성은 /etc/letsencrypt/renewal에 있습니다.

이제 /etc/letsencrypt/renewal 파일을 확인합니다(예: /etc/letsencrypt/renewal/serverdiary.com.conf).

# renew_before_expiry = 30 days
version = 1.0.0
archive_dir = /etc/letsencrypt/archive/serverdiary.com
cert = /etc/letsencrypt/live/serverdiary.com/cert.pem
privkey = /etc/letsencrypt/live/serverdiary.com/privkey.pem
chain = /etc/letsencrypt/live/serverdiary.com/chain.pem
fullchain = /etc/letsencrypt/live/serverdiary.com/fullchain.pem

# Options used in the renewal proces
[renewalparams]
authenticator = webroot
account = hidden
server = https://acme-v02.api.letsencrypt.org/directory
webroot_path = /home/serverdiary/public_html
post_hook = systemctl restart nginx
[[webroot_map]]

webroot_path 동일하기 때문에 webroot_map에 대한 구성이 없습니다.

webroot_path가 다른 단일 SSL에 대한 webroot_map 예

[[webroot_map]]
serverdiary.com = /home/serverdiary/public_html
www.serverdiary.com = /home/serverdiary/public_html
img.serverdiary.com = /home/serverdiary/public_html/img

/etc/systemd/system/letsencrypt.service 파일을 만듭니다.

# vi /etc/systemd/system/letsencrypt.service

그리고 아래에 코드를 붙여 넣으십시오.

[Unit]
Description=Certbot Renewal

[Service]
ExecStart=/usr/local/bin/certbot renew --post-hook "systemctl reload nginx"

/etc/systemd/system/letsencrypt.time 파일을 만듭니다.

# vi /etc/systemd/system/letsencrypt.timer

아래에 코드를 붙여 넣으십시오.

[Unit]
Description=Timer for Certbot Renewal

[Timer]
OnBootSec=300
OnUnitActiveSec=6h

[Install]
WantedBy=multi-user.target

사용 권한을 755로 변경합니다.

# chmod 755 /etc/systemd/system/letsencrypt.service
# chmod 755 /etc/systemd/system/letsencrypt.timer

sysmctl 데몬을 다시 로드하고, 시스템 시작 시 활성화하고, 다음 명령으로 서비스를 시작합니다.

# systemctl daemon-reload
# systemctl enable /etc/systemd/system/letsencrypt.service
# systemctl enable /etc/systemd/system/letsencrypt.timer
# systemctl start /etc/systemd/system/letsencrypt.service
# systemctl start /etc/systemd/system/letsencrypt.timer

Letsencrypt.timer는 6시간마다 Letsencrypt.service를 호출하고 SSL이 하나 성공적으로 갱신되면 Nginx 서비스가 다시 시작됩니다.

이제 Let’s Encrypt SSL 만료 시간을 잊을 수 있습니다. 그러나 때로는 웹사이트의 SSL이 갱신되었는지 확인하는 것을 잊지 마십시오.

CentOS 9 Stream에서 REMI 저장소를 설치하고 활성화하는 방법

Remi 저장소는 Red Hat, CentOS, Fedora와 같은 Enterprise Linux에서 PHP의 최신 업데이트가 있는 타사 저장소 중 하나입니다.

Remi의 RPM 리포지토리 사이트에 대한 자세한 내용은 https://rpms.remirepo.net 에서 확인할 수 있습니다.

Centos에 Remi 저장소를 설치하려면 먼저 CentOS 9 Stream / RHEL 9에서 EPEL 저장소를 활성화해야합니다

CodeReady Linux Builder 리포지토리를 활성화합니다. 우리는 이미 그것에 액세스 할 수 있습니다. 활성화하기만 하면 됩니다.

CentOS 9 스트림에서:

CentOS 9 스트림에서:

sudo dnf config-manager --set-enabled crb

RHEL 9의 경우:

sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms

그런 다음 CentOS 9 Stream에서 Epel을 활성화하십시오.

sudo dnf install epel-release epel-next-release

RHEL 9의 경우:

sudo dnf install \
https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

Remi Repository 설치 및 활성화

sudo dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-9.rpm

그런 다음 DNF를 새로 고치고 GPG 키를 가져와야 합니다

sudo dnf update --refresh

CentOS 9 Stream에 PHP 8.2 설치

공식 CentOS 9 Stream 저장소, PHP 8이 포함되어 있으므로 비활성화해야 합니다

sudo dnf module reset php

시스템에서 사용할 수 있는 모든 모듈을 나열하려면 다음을 수행합니다.

sudo dnf module list php

예제 출력

# sudo dnf module list php
Last metadata expiration check: 0:09:25 ago on Thu 08 Jun 2023 01:21:06 PM CDT.
CentOS Stream 9 - AppStream
Name                                    Stream                                          Profiles                                                      Summary
php                                     8.1                                             common [d], devel, minimal                                    PHP scripting language

Remi's Modular repository for Enterprise Linux 9 - x86_64
Name                                    Stream                                          Profiles                                                      Summary
php                                     remi-7.4                                        common [d], devel, minimal                                    PHP scripting language
php                                     remi-8.0                                        common [d], devel, minimal                                    PHP scripting language
php                                     remi-8.1                                        common [d], devel, minimal                                    PHP scripting language
php                                     remi-8.2                                    common [d], devel, minimal                                    PHP scripting language

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

PHP 8.3 Remi 모듈 활성화 및 CentOS 9 Stream에 PHP 8.3 설치

sudo dnf module enable php:remi-8.3

그런 다음 다음 명령을 사용하여 PHP를 설치할 수 있습니다.

sudo dnf install php php-devel php-fpm php-cgi php-gd php-opcache php-apcu php-mbstring php-gd php-imagick php-xml php-json php-mysqlnd php-pdo

rkhunter 설치 & 사용법

# dnf -y install rkhunter
서브스크립션 관리 저장소를 최신화하기.

마지막 메타자료 만료확인(2:52:06 이전): 2024년 08월 30일 (금) 오전 05시 49분 17초.
종속성이 해결되었습니다.
=====================================================================================================================
 꾸러미                    구조                    버전                             저장소                      크기
=====================================================================================================================
설치 중:
 rkhunter                  noarch                  1.4.6-17.el9                     epel                       184 k
종속 꾸러미 설치 중:
 s-nail                    x86_64                  14.9.22-8.el9                    appstream                  622 k

연결 요약
=====================================================================================================================
설치  2 꾸러미

전체 내려받기 크기: 805 k
설치된 크기 : 2.0 M
꾸러미 내려받기 중:
(1/2): s-nail-14.9.22-8.el9.x86_64.rpm                                               2.4 MB/s | 622 kB     00:00    
(2/2): rkhunter-1.4.6-17.el9.noarch.rpm                                               86 kB/s | 184 kB     00:02    
---------------------------------------------------------------------------------------------------------------------
합계                                                                                 264 kB/s | 805 kB     00:03     
연결 확인 실행 중
연결 확인에 성공했습니다.
연결 시험 실행 중
연결 시험에 성공했습니다.
연결 실행 중
  준비 중     :                                                                                                  1/1 
  구현 중     : s-nail-14.9.22-8.el9.x86_64                                                                      1/2 
  설치 중     : s-nail-14.9.22-8.el9.x86_64                                                                      1/2 
  구현 중     : s-nail-14.9.22-8.el9.x86_64                                                                      1/2 
  설치 중     : rkhunter-1.4.6-17.el9.noarch                                                                     2/2 
  구현 중     : rkhunter-1.4.6-17.el9.noarch                                                                     2/2 
  확인 중     : s-nail-14.9.22-8.el9.x86_64                                                                      1/2 
  확인 중     : rkhunter-1.4.6-17.el9.noarch                                                                     2/2 
설치된 제품이 최신화되었습니다.

설치되었습니다:
  rkhunter-1.4.6-17.el9.noarch                              s-nail-14.9.22-8.el9.x86_64                             

완료되었습니다!


# rkhunter 업데이트
[root@localhost ~]# rkhunter --update


# 시스템 파일 속성 업데이트
[root@localhost ~]# rkhunter --propupd
[ Rootkit Hunter version 1.4.6 ]


# 루트킷 점검 실행
# [--sk] 엔터(Enter)키 입력 패스 옵션
# [--rwo] 경고(warnings)만 출력하는 옵션
[root@localhost ~]# rkhunter --check --sk

...
System checks summary
=====================

File properties checks...
    Files checked: 135
    Suspect files: 0

Rootkit checks...
    Rootkits checked : 495
    Possible rootkits: 0

Applications checks...
    All checks skipped

The system checks took: 1 minute and 59 seconds

All results have been written to the log file: /var/log/rkhunter/rkhunter.log

One or more warnings have been found while checking the system.
Please check the log file (/var/log/rkhunter/rkhunter.log)


# 점검 로그 보기
[root@localhost ~]# tail /var/log/rkhunter/rkhunter.log

...
[08:44:17] Rootkit checks...
[08:44:17] Rootkits checked : 495
[08:44:17] Possible rootkits: 0
[08:44:18]
[08:44:18] Applications checks...
[08:44:18] All checks skipped
[08:44:18]
[08:44:18] The system checks took: 1 minute and 59 seconds
[08:44:18]
[08:44:18] Info: End date is 2024. 08. 30. (금) 08:44:18 KST