certbot을 통한 SSL 적용(apache) 및 HTTP/2 적용

Last Updated on 4월 3, 2021 by 태랑(정현호)

Let's Encrypt를 통해 무료 인증서 발급


Let's Encrypt는 사용자에게 무료로 SSL/TLS 인증서를 발급해주는 비영리기관이며 한번 발급 받으면 90일간 사용이 가능하고

만료 30일 전에 갱신이 가능 합니다

인증서 발급은 certbot 이나 certbot-auto 을 이용 하면 됩니다.
* certbot – 패키지 설치시 ,  certbot-auto letencrypt 에서 바이너리를 직접 받은 경우


* 진행하는 환경은 Centos 7.8 / Apache 2.4 입니다.
* Oracle Cloud 생성 부터 APM 스택구성 ~ 워드프레스 구성 연재글  중간글 입니다
[관련된 이전글]
오라클 클라우드 프리티어 – 무료 VPS 사용(1)
리눅스에 APM(Apache+PHP+Mysql) 통한 웹 서비스 시작
웹 기반 mysql 관리 툴 – phpmyadmin 설치
상위 국가 무료 도메인 발급 받기 및 서브 도메인 설정
여러 도메인을 활용한 가상호스트 설정



* Ubuntu 에 Nginx+PHP+MariaDB 환경은 아래 글을 참조하시면 됩니다.





Diffie-Hellman Key 생성


Diffie와 Hellman이 1976년도에 발표한 비밀키 교환 방식의 알고리즘입니다
Client와 Server가 각자 선택한 정수와 소수를 이용하여 비밀키를 만들고 이를 통해 데이터를 암호화 입니다.
DH, DHE, ECDHE가 있으며 DHE(2048bits), ECDHE를 쓰는 것이 가장 좋으며
Key Exchange 방식 중에서 가장 권고되는 방식(ECDHE) 라고 합니다

그래서 Diffie-Hellman 생성 하여 사용 할 것 입니다.
만들수 있는 키 길이는 1024 / 2048 / 4096bit 이 되고 4096bit 로 만드는것이 현재로는 가장 안전 합니다

다만 생성하는 시스템의 성능에 따라 10분이상 소요가 될 수도 있습니다.
먼저 Diffie-Hellman  생성을 터미널에 걸어두고 아래를 진행 하시는게 좋을것 같습니다.


Apache를 소스컴파일한 환경 이면 편하신곳에 키를 생성 하면 됩니다
저는 /usr/local/apache2.4/conf/extra/  이곳에 키를 생성 할 것입니다.


Censtos 에 YUM으로 APM을 설치한 환경이라면
/etc/httpd/conf.d 위치에 파일을 생성 하시면 될 것 같습니다.


# openssl dhparam -out /usr/local/apache2.4/conf/extra/dhparam.pem 4096

or 

# openssl dhparam -out /etc/httpd/conf.d/dhparam.pem 4096


* 키가 생성 중이면 터미널을 유지하고 아래 내용으로 계속 진행 합니다.



certbot 설치


* 진행하는 환경은 Centos 7.8 / Apache 2.4 입니다.
* Source Compile 로 설치된 APM 과 YUM(RPM) 으로 설치된 APM 모두 동일 합니다.

[root]# yum -y install epel-release

[root]# yum -y install certbot


* YUM 으로 진행한 APM 환경은 mod_ssl 를 설치 해야 합니다
[root]# yum -y install mod_ssl



인증서 발급 방식


Let's Encrypt가 인증서를 발급하는 방식에는 3가지가 있으며, certbot을 이용하여 발급을 진행합니다.


standalone
standalone 명령어를 사용하면 certbot에 내장된 세팅을 사용해서 도메인만으로 인증서가 발급 되고, 갱신 절차도 자동으로 처리됩니다 *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없습니다.
인증이나 갱신시 임시 서버가 80, 443번 포트를 사용하기 때문에 운영 중인 서버가 해당 포트를 쓰게 된다면, 발급 또는 갱신 시 마다 잠시 서버를 내려야 하는 문제가 있습니다.

webroot
webroot 명령어를 사용하면 자신의 웹 서버에서 작동중인 웹사이트를 이용해서 인증서를 발급하고, 갱신 절차도 자동으로 처리된다. *.example.com 형태의 와일드카드 서브 도메인 인증서는 발급할 수 없다.
운영중엔 사이트의 / (root) 디렉토리에 도메인 인증을 위해 외부에서 접근 가능한 경로를 제공하고, Let’s Encrypt 측에서 해당 경로로 접속해 인증을 하는 방식입니다.
이 방식의 경우 웹데몬 서비스의 종료는 필요치 않습니다.

dns
도메인이 연결된 DNS에 TXT 레코드를 생성해서 인증서를 발급하는 방식으로, 인증서 발급 과정에 웹 서버가 필요 없고 *.example.com 형태의 와일드카드 서브 도메인 인증서를 발급할 수 있습니다.
매번 인증서를 갱신할 때마다 DNS에 TXT 레코드를 새로 생성해야 하므로, 외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우에는 갱신 과정을 자동으로 처리할 수 있습니다.

certbot을 통한 인증서 발급요청 과정중, 기재된 TXT Record를 아래와 같이 dns에 등록하여 인증을 받는 형식이고
_acme-challenge.hoing.io. 3600 IN TXT "xxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"
TXT key 레코드가 바뀐다는 점이 있어서 별도의 처리가 필요합니다.

* 나무위키 참조


그리고 SSL인증서를 발급 받기 위해서는 도메인이 반드시 필요 합니다
SSL 설정을 테스트 해보거나 빠르게 SSL을 적용해보려면 무료 도메인 발급 서비스를 이용 해보는것도 한가지의 방법 입니다

# freenom 을 통해 최상위 국가 무료 도메인 발급




저는 webroot 방식으로 진행하겠습니다 도메인이 2개이고 하여 따로 발급 받으려 합니다.

/bin/certbot certonly –webroot  \
–email admin@hoing.io –agree-tos \
-w /경로/경로/wordpress -d www.hoing.io -d hoing.io \
-w /경로/경로/phpsub -d phpsub.hoing.io

/bin/certbot certonly –webroot  \

–email admin@fedoralinux.or.kr –agree-tos \
-w /경로/경로/fedoralinux -d www.fedoralinux.or.kr -d fedoralinux.or.kr


간단 설명

– 인증서 발급 인증을 webroot 방식을 이용함
– 이용약관 동의는 자동으로 이뤄짐( agree tos )
– 이메일 주소는 xxx 으로 함
–  -w /site/wordpress 인증을 위한 외부접근 가능 경로 , -d www.hoing.io -d hoing.io 는 인증 도메인 입니다.
– webroot 은 와일드카드(*) 형태가 불가능하여 ssl을 사용할 서브 도메인 까지 같이 별도로 등록 해야 합니다.
– 위는 제가 사용한 커맨드 입니다(경로는 예시)



# 발급 완료 후 발급 내역 확인

[root]# /bin/certbot certificates

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Found the following certs:
Certificate Name: www.hoing.io
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io phpsub.hoing.io
Expiry Date: 2020-12-19 15:39:08+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/www.hoing.io/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.hoing.io/privkey.pem
Certificate Name: www.fedoralinux.or.kr
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.fedoralinux.or.kr fedoralinux.or.kr
Expiry Date: 2020-12-19 15:39:59+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/privkey.pem
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

위와 같이 경로 와 인증서 만료 일자 등을 확인 할 수 있습니다.

파일 위치는 공통적으로 /etc/letsencrypt/live 아래 도메인명 으로 디렉토리가 생성되어 파일이 생성 됩니다. 




Apache 설정


먼저 설정에 따라 방화벽을 오픈 해줍니다.
[root]# firewall-cmd –permanent –add-port=443/tcp

[root]# firewall-cmd –reload;firewall-cmd –list-all

* 서버 환경에 따라 cloud의 route table 에도 경로 추가 합니다.



= httpd-ssl.conf 재생성 


# ssl 설정 파일을 에서 변경할 사항이 많아서 default 설정 파일을 rename 후 새로 만들겠습니다.

# Source Compile 아파치 경로 및 파일 rename
[root]# cd /usr/local/apache2.4/conf/extra/
[root]# mv httpd-ssl.conf   httpd-ssl.conf.ori


# YUM 아파치 경로 및 파일 rename
[root]# cd /etc/httpd/conf.d
[root]# mv ssl.conf   ssl.conf.ori



# 파일 생성, 아래 내용으로 파일을 작성 합니다.


Listen 0.0.0.0:443

SSLCipherSuite "TLS_AES_128_GCM_SHA256 \

TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-CHACHA20-POLY1305 \
ECDHE-RSA-CHACHA20-POLY1305 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"


SSLProxyCipherSuite "TLS_AES_128_GCM_SHA256 \

TLS_AES_256_GCM_SHA384 \
TLS_CHACHA20_POLY1305_SHA256 \
ECDHE-ECDSA-AES128-GCM-SHA256 \
ECDHE-ECDSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-AES128-SHA \
ECDHE-ECDSA-AES256-SHA \
ECDHE-ECDSA-AES128-SHA256 \
ECDHE-ECDSA-AES256-SHA384 \
ECDHE-RSA-AES128-GCM-SHA256 \
ECDHE-RSA-AES256-GCM-SHA384 \
ECDHE-ECDSA-CHACHA20-POLY1305 \
ECDHE-RSA-CHACHA20-POLY1305 \
ECDHE-RSA-AES128-SHA \
ECDHE-RSA-AES256-SHA \
ECDHE-RSA-AES128-SHA256 \
ECDHE-RSA-AES256-SHA384 \
DHE-RSA-AES128-GCM-SHA256 \
DHE-RSA-AES256-GCM-SHA384 \
DHE-RSA-AES128-SHA \
DHE-RSA-AES256-SHA \
DHE-RSA-AES128-SHA256 \
DHE-RSA-AES256-SHA256 \
EDH-RSA-DES-CBC3-SHA"

SSLHonorCipherOrder on

SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache2.4/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

SSLOpenSSLConfCmd DHParameters "/usr/local/apache2.4/conf/extra/dhparam.pem"

SSLCompression off
SSLSessionTickets off

SSLUseStapling On
SSLStaplingCache "shmcb:/usr/local/apache2.4/logs/ssl_stapling(32768)"

BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0


= Source Compile – Apache
SSLOpenSSLConfCmd DHParameters "/usr/local/apache2.4/conf/extra/dhparam.pem"


= YUM Apache
SSLOpenSSLConfCmd DHParameters "/etc/httpd/conf.d/dhparam.pem"

  ==> 이부분은 위에서 생성한 Diffie-Hellman  키를 입력 하면 됩니다
  ==> 설치된 타입에 따라서 위의 내용을 따라 사용해도 됩니다.


YUM – APM 인 경우 2개의 경로는 아래의 경로나 /var/run 등의 경로로 사용 하면 됩니다.
SSLSessionCache "shmcb:/etc/httpd/conf.d/ssl_scache(512000)"
SSLStaplingCache "shmcb:/etc/httpd/conf.d/ssl_stapling(32768)"


# TLS은 1.2 와 1.3 만 사용 가능 하도록 하였습니다.
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1




[참고] TLS 1.3 은 openssl 1.1.1 버전이상 설치된 상태에서 Compile 된 apache 나 1.1.1 버전으로 빌드된 패키지(yum/rpm) 에서 사용 할 수 있습니다 또한 apache 2.4.37 이상이어야 합니다.

openssl 1.1.1 과 Apache Compile 설치는 아래 글을 참조하시면 됩니다.


centos 7.8 기준으로 YUM으로 설치 가능한 버전은 2.4.6 이기 때문에 TLS 1.3 을 사용 하기 위해서는 최신 버전 및 openssl 1.1.1 로 빌드된 패키지가 필요 합니다.
관련된 내용은 아래 포스트를 참조하시면 됩니다.




= httpd.conf 파일 수정

# Source Compile – Apache 인 경우, YUM Apache 는 주석 해제 되어 있음 
[root]# vi httpd.conf
LoadModule cache_socache_module modules/mod_cache_socache.so

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
==> 3개 모듈 주석 해제


# YUM – Apache 인 경우 주석 해제가 되어 있는지 확인 합니다
[root]# grep cache_socache_module 00-base.conf
LoadModule cache_socache_module modules/mod_cache_socache.so

[root]# grep socache_shmcb_module 00-base.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

[root]# grep ssl_module 00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so



# Source Compile – Apache 인 경우만 수행
# Secure (SSL/TLS) connections

Include conf/extra/httpd-ssl.conf
–> 주석 해제





# Source Compile 과 YUM 설치 형태 둘다 공통 내용 입니다.
Virtualhost 추가 및 기존 80(HTTP) 에서 redirect 설정 


<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=15768000"
SSLEngine On
ServerName hoing.io
ServerAlias hoing.io www.hoing.io
ServerAdmin admin@hoing.io
DocumentRoot "/파일경로"
ErrorLog "logs/hoing.io-error_log"
CustomLog "logs/hoing.io-access_log" geoip
LogLevel debug
 ==> 임시적으로, 설정 안해도 됩니다.

<Directory "/파일경로">
AllowOverride ALL
Options FollowSymLinks MultiViews
DirectoryIndex index.php index.html index.htm
FallbackResource /index.php

<RequireAll>
Require all granted
</RequireAll>
</Directory>


# 사용하시는 PHP-FPM Proxy 내용을 기재 하면 됩니다.
RewriteEngine On
ProxyErrorOverride on
<FilesMatch .php$>
SetHandler "proxy:fcgi://node3:9000"
</FilesMatch>


#  위에서 발급 받은 SSL 키를 추가 합니다
# 경로는 /etc/letsencrypt/live/ 밑에 입니다.

SSLCertificateFile /etc/letsencrypt/live/www.hoing.io/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.hoing.io/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.hoing.io/fullchain.pem

</VirtualHost>



# 기존 80(http) 서비스에는 redirect 를 설정

<VirtualHost *:80>
ServerAdmin admin@hoing.io
DocumentRoot "/경로"
ServerName hoing.io
ServerAlias hoing.io www.hoing.io
ErrorLog "logs/hoing.io-error_log"
CustomLog "logs/hoing.io-access_log" geoip

RewriteEngine on
RewriteRule ^/.well-known/ – [L]
RewriteCond %{SERVER_NAME} =www.hoing.io [OR]
RewriteCond %{SERVER_NAME} =hoing.io
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

</VirtualHost>

=> 위의 와 같이  할 수 도 있고 아래처럼 간단 하게도 가능합니다.
RewriteRule 은 상당히 다양하게 작성 하여 사용 할 수 있습니다.

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]




설정을 완료 하였다면 apache 재기동 및 로그를 확인 하여 추가조치를 수행 합니다.


인증서 갱신


letsencrypt의 SSL 인증서의 유효기간은 90일 입니다
90일이 되기전에 갱신이 필요 합니다.

renew 옵션을 통해서 수행 가능하며 renew 테스트를 하려면 –dry-run 옵션을 사용하면 됩니다.
/bin/certbot renew –dry-run
   -> 테스트 모드


실제 갱신시(apache 재시작 필요)

/bin/certbot renew
* 갱신은 인증서 만료 30일 이전에 가능 합니다.


#crontab 등록

0 6 15 * * /bin/certbot renew –renew-hook "/bin/systemctl reload httpd"
만료 30일 이전에 갱신 가능함을 한달에 한번 정도만 수행 해줘도 됩니다.



SSL Test  및 평가

위의 링크를 통해서 사이트에 SSL 적용 여부 확인 및 사용하는 알고리즘 및 설정 내역에 따른 평가를 확인 할 수 있습니다

테스트 결과 A+ 로 양호하게 설정 되었음을 확인 할수 있습니다.



지원 TLS 버전 체크


아래 링크 등을 통해 구성된 HTTS 에서 설정된 SSL/TLS 버전을 확인 할 수 있습니다.
https://www.cdn77.com/tls-test
https://gf.dev/tls-test








인증서 서브 도메인 변경


서브 도메인의 추가나 서브도메인의 삭제는 아래와 같이 모든 내용을 다시 입력하면 됩니다.


[root]# certbot –webroot certonly –cert-name www.hoing.io \
-w /site/commit -d www.hoing.io -d hoing.io \
-w /site/old.commit  -d old.hoing.io

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

You are updating certificate www.hoing.io to include new domain(s):
+ old.hoing.io

You are also removing previously included domain(s):
(None)

Did you intend to make this change?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(U)pdate cert/(C)ancel: U
Renewing an existing certificate


–cert-name 은 아래 명령어로 조회한 결과에 확인 가능 합니다.
[root]# /bin/certbot certificates

Certificate Name: www.hoing.io  <—
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io


변경 후 apache 재시작 이나 reload 필요합니다.

systemctl restart httpd
or
systemctl reload httpd



인증서 삭제

아래와 같이 certbot delete 명령어를 통해 대화형으로 SSL인증서를 삭제 할 수 있습니다.

[root]# /bin/certbot delete
Saving debug log to /var/log/letsencrypt/letsencrypt.log

Which certificate(s) would you like to delete?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: www.hoing.io-0001
2: www.hoing.io
3: www.fedoralinux.or.kr
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Deleted all files relating to certificate www.hoing.io-0001.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –


[root@]# /bin/certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Found the following certs:
Certificate Name: www.hoing.io
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.hoing.io hoing.io
Expiry Date: 2020-12-19 15:39:08+00:00 (VALID: 88 days)
Certificate Path: /etc/letsencrypt/live/www.hoing.io/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.hoing.io/privkey.pem

Certificate Name: www.fedoralinux.or.kr
Serial Number: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Domains: www.fedoralinux.or.kr fedoralinux.or.kr
Expiry Date: 2020-12-19 15:39:59+00:00 (VALID: 88 days)
Certificate Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/fullchain.pem
Private Key Path: /etc/letsencrypt/live/www.fedoralinux.or.kr/privkey.pem





2015년에 IETF에서 발표된 HTTP/1.1의 차기 버전


HTTP/2(Hypertext Transfer Protocol Version 2)는 월드 와이드 웹에서 쓰이는 HTTP 프로토콜의 두 번째 버전입니다.

SPDY에 기반하고 있으며, 국제 인터넷 표준화 기구(IETF)에서 개발되고 있습니다.
1997년 RFC 2068로 표준이 된 HTTP 1.1을 개선한 것으로,
2014년 12월 표준안 제안(Proposed Standard)으로 고려되어,
2015년 2월 17일 IESG에서 제안안으로 승인되었고 2015년 5월, RFC 7540로 공개되었습니다.

자세한 내용은 아래 링크를 확인 해보시면  됩니다.



* HTTP/2 는 Apache 2.4.17 이상 부터 사용 가능 합니다.




HTTP/2 사용을 위한 설치 및 변경 – Source Compile


* YUM으로 APM 이 구성되어 있거나 Source Compile 로 APM 스택이 구성된 상태에서 HTTP2 적용을 하는 내용 입니다.



# Apache 를 Source Compile 하여 사용시 절차
* YUM 이나 RPM방식의 설치는 아래 쪽에 내용이 별도로 있습니다.


[참고] HTTP/2 를 사용하기 위해서는 libnghttp2 libnghttp2-devel 라이브러리와

openssl 1.0.2 이상 버전이 필요 합니다
또한 Apache는 2.4.17 이상이어야 합니다.


# 먼저 EPEL 을 활성화 합니다.
[root]# yum -y install epel-release


[root]# yum -y install libnghttp2 libnghttp2-devel openssl
*openssl은 centos 7 버전기준으로 1.0.2 버전이 가능함


[참고.1] apache MPM 방식 + http2

apache 에서 http2를 사용하고자 할때는 prefork 방식은 사용할수 없습니다 

[참고.2] HTTPS 의 TLS1.3을 사용하기 위해서는 OpenSSL의 컴파일 설치 및 Apache 재설치가 필요 합니다. 
HTTP/2 적용을 위해 Apache 를 재설치를 할 때 OpenSSL 과 같이 재설치 하여 TLS1.3까지 적용 하시려면 아래글을 참조하시면 됩니다.



OS 기본 repository 에서 설치 가능한 openssl 은 1.0.2 버전으로 TLS 1.2 버전 까지는 가능함으로 그대로 사용하시려면 바로 아래 내용으로 진행하시면 됩니다.




= event 방식으로 –enable-http2 옵션을 추가하여 다시 컴파일을 하였습니다.

[root]# ./configure –prefix=/usr/local/apache2.4.46_http2 \
–enable-mods-shared=all –enable-http2 \
–enable-ext-filter –enable-ssl -with-ssl –enable-so \
–enable-cache –enable-proxy
–enable-deflate \
–enable-ssl –enable-suexec \
–enable-file-cache –with-mpm=event \

–with-apr=/usr/local/apr-1.7.0 \
–with-apr-util=/usr/local/apr-util-1.6.1 \
–with-pcre=/usr/local/pcre-8.44/bin/pcre-config \

–enable-modules=all –enable-module=shared

[root]# make;make install



기존에 사용하던 apache 가 있던 관계로 디렉토리 변경 작업을 진행 하겠습니다.

저는 대표 디렉토리를 심볼릭 링크를 걸어서 사용 중이었습니다.

아래 작업 내역은 


신규디렉토리 필요 파일 복사
cp /usr/local/apache2.4/logs/* /usr/local/apache2.4.46_http2/logs
mv /usr/local/apache2.4.46_http2/conf /usr/local/apache2.4.46_http2/ori.conf
cp -rp /usr/local/apache2.4/conf /usr/local/apache2.4.46_http2

*그외 기존에 추가하여 사용한 모듈 복사(환경에 따라 다름)

cp /usr/local/apache2.4/modules/mod_security2.so /usr/local/apache2.4.46_http2/modules/





## httpd.conf  내용 추가
[root]# vi /usr/local/apache2.4.46_http2/conf
[root]# vi httpd.conf

<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>




커널 파라미터 수정


적용 완료 이후 블로그가 응답이 매우 느린 현상을 확인 하였고 apache 로그를 확인 하였을 때
packet 과 window size 관련 메세지가 확인 되어 apache 서버와 php가 설치된
다른 서버(중간 mw 서버) 에서 커널 파라미터를 모두 변경/적용 후
 apache , php-fpm 재시작을 해주었습니다.

[root]# vi /etc/sysctl.conf

net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216

[root]# sysctl -p


참조





apache 서비스 재시작 및 디텍토리 변경

## Apache 중지
[root]# systemctl stop httpd


## 디렉토리 변경
[root]# cd /usr/local

[root]# rm apache2.4
  –> 심볼릭 링크 삭제 / 삭제전 구조
   lrwxrwxrwx. 1 root root 12 Sep 9 18:03 apache2.4 -> apache2.4.43


[root]# cd /usr/local
[root]# ln -s apache2.4.46_http2 apache2.4

  –> 심볼릭 링크 재생성



## apache 서비스 시작

systemctl start httpd


##로그 확인

cd /usr/local/apache2.4.43_http2/logs/
tail -100f error_log


[참고] yum 이나 rpm 으로 Apache 를 설치 환경일 경우
/etc/httpd/conf.modules.d/00-mpm.conf 에서 아래와 같이 사용하는 모듈을 변경 하면 됩니다.

# LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
-> 주석 처리

LoadModule mpm_event_module modules/mod_mpm_event.so
-> 주석 해제


HTTP/2 사용을 위한 설치 및 변경 – Yum APM


YUM 으로 APM 설치한 환경에서 설정 입니다.
HTTP/2 는 mod_http2 를 통해 사용이 가능한 기능입니다. mod_http2 는 apache 2.4.17 부터 사용가능 합니다
즉 apache의 버전이 2.4.17 이상이어야 합니다.
centos 7.8 기준 기본 repository 에서 설치할 수 있는 가장 높은 버전은 2.4.6 입니다.
그래서 HTTP2.0 을 사용하기 위해서는 별도의 repository 를 통해 최신 버전을 설치 해야 이 기능도 사용 할 수 있습니다.


그래서 CodeIT Repository 를 통해 Apache 의 설치를 해야 합니다
CodeIT 에서의 최신버전의 Apache 설치 및 PHP + Mysql  연동 설치는 아래를 참조하시면 됩니다.


CodeIT이나 다른 Repository 를 통해 2.4.17 이상 설치 된 환경은 설치 및 설정만 변경 하면 됩니다.


# 패키지 설치
[root]# yum -y install mod_http2
-> 의존성으로 로 인하여 이미 설치 되어 있을수 있습니다.


# 10-h2.conf 설정 변경
[root]# /etc/httpd/conf.modules.d

[root]# vi 10-h2.conf
-> 앞에 10 숫자는 다를 수 있습니다. h2 나 http2 의 설정파일을 찾으시면 됩니다.
-> 파일이 맞다면 아래와 같이  mod_http2.so 파일을 load하는 구문을 확인 할 수 있습니다.
-> LoadModule http2_module modules/mod_http2.so


= 10-h2.conf 파일에 아래 내용을 추가 합니다.
<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>


파일 저장 후 apache 를 재시작 이나 reload 합니다.

[root]# systemctl reload httpd
or
[root]# systemctl restart httpd



HTTP/2 적용 확인

위의 링크를 통해서 HTTP/2 사용/적용 여부를 확인 할 수 있습니다.

확인 결과 정상적으로 동작 하는 것을 확인 할수 있습니다.

Source Compile Apache 환경 사이트 반영 결과



Yum APM 환경 적용 결과




이어지는 다음글 : WordPress(워드프레스) 구성 – 개인 블로그 및 사이트

 

“certbot을 통한 SSL 적용(apache) 및 HTTP/2 적용” 에 대한 2 댓글

  1. 핑백: 워드프레스 - 설치형 블로그 및 개인 사이트 구축 | | 작은 공간,하지만 꿈이있는

  2. 핑백: PHP OpCacheGUI 설치 - OpCache 관리 및 모니터링 | | 작은 공간,하지만 꿈이있는

답글 남기기