2021. 6. 21. 23:59ㆍWeb Server/CentOS 7
- TLS 1.3 을 지원하려면?
- openssl 1.1.1 수동설치
- httpd 2.4.51 수동설치
- TLS 1.3 적용
1. TLS 1.3 을 지원하려면?
이전 포스팅에서는 yum을 통해 httpd와 openssl을 설치하여 Apache 웹서버에 가상호스트 설정과 SSL/TLS 인증서 설정을 하였습니다.
yum을 통해 설치되는 Apache 웹서버 버전은 2.4.6이고, openssl 버전은 1.0.2k-fips 입니다 (2021년 11월 24일 기준)
TLS 1.3은 최소 Apache 2.4.37 이상 버전에 openssl 1.1.1 이상 버전에서 지원되기 때문에 yum을 통해 설치한 웹서버로는 서비스할 수 없습니다.
기존에 yum을 통해 설치한 openssl의 버전과
openssl version OpenSSL 1.0.2k-fips 26 Jan 2017
Apache 웹서버 버전입니다.
httpd -version Server version: Apache/2.4.6 (CentOS) Server built: Apr 2 2020 13:13:23
당연히, 지원하고 있는 TLSv1.3 버전의 SSL cipher suite는 출력되지 않습니다.
openssl ciphers -v | grep TLSv1.3
아래는 Apache 2.4.6 버전의 웹서버에 올려진 Jenkins 화면입니다.
크롬 브라우저의 개발자도구의 Security 탭을 보면 지원하고 있는 TLS 버전을 확인할 수 있습니다.
현재에는 TLS 1.2 버전으로 적용된 것을 확인할 수 있습니다.
1. openssl 1.1.1 수동 설치
편의상 홈 디렉터리에 Module 디렉터리를 생성하여 해당 디렉터리 내에서 수동설치에 이용될 라이브러리 압축파일들을 다운받도록 하겠습니다.
mkdir ~/Module cd ~/Module
1.1. openssl 1.1.1 설치
OpenSSL 공식 사이트로 부터 openssl 1.1.1 이상 버전의 다운로드 링크를 읽어옵니다.
wget 명령어로 openssl 1.1.1l를 다운받고 압축해제합니다.
wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1l.tar.gz tar xvf openssl-1.1.1l.tar.gz
소스를 컴파일 하기 전에, Makefile(환경설정파일)을 생성합니다.
cd openssl-1.1.1l ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl shared
설치할 위치를 --prefix
와 --openssldir
에 설정했고,
동적 라이브러리로 빌드를 하기위해 shared 옵션을 추가했습니다
Makefile을 이용하여 파일을 컴파일하고
make
컴파일된 설치파일을 config 명령어 시 --prefix에 설정한 위치에 설치합니다.
sudo make install
/usr/local/openssl
경로에 openssl 1.1.1l가 설치되었습니다.
2.2. 공유 라이브러리 등록
설치한 openssl은 동적 라이브러리를 이용하도록 설정했기 때문에, 동적 라이브러리 로딩 정보에 새로 설치한 openssl 과 관련된 라이브러리 경로글 추가합니다.
sudo vim /etc/ld.so.conf.d/openssl-1.1.1l.conf
/usr/local/openssl/lib
그 다음에 ldconfig 명령어를 통해 공유라이브러리 캐시를 재설정합니다.
sudo ldconfig -v
/usr/local/openssl/lib: libssl.so.1.1 -> libssl.so.1.1 libcrypto.so.1.1 -> libcrypto.so.1.1
2.3. openssl 관련 라이브러리 확인 및 추가
ll /usr/lib64 | grep libssl
기존에 yum을 통해 설치한 ssl관련 라이브러리는 아래와 같습니다.
보시다시피 기존에 설치되어있던 openssl 라이브러리는 버전은 1.0.2k 입니다.
/usr/lib64
디렉토리에 새로 만든 라이브러리의 링크를 추가해줍시다.
sudo ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1 sudo ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
링크를 추가한 후 다시 라이브러리를 조회하면 아래와 같이 추가된 모습을 확인할 수 있습니다.
2.4. openssl 관련 라이브러리 확인 및 등록
그럼에도 openssl 버전을 조회하면 위와 같이 1.0.2k 가 나옵니다.
그 이유는, 아직 openssl 명령어는 예전에 yum을 통해 설치한 명령어이기 때문입니다.
which openssl
/usr/bin/openssl
기존 명령어의 이름을 변경하고
sudo mv /usr/bin/openssl /usr/bin/openssl_1.0.2k
새로 설치한 1.1.1l 버전의 명령어를 /usr/bin/openssl
에 링크 생성해봅시다.
sudo ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
그리고 다시 버전 체크를 하면 아래와 같이 변경된것을 확인할 수 있습니다.
새로 변경한 openssl에서 지원하고 있는 TLSv1.3 버전의 SSL cipher suite를 출력해보면 아래와 같이 출력되는 것을 확인할 수 있습니다.
openssl ciphers -v | grep TLSv1.3
TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
3. httpd 2.4.51 수동설치
yum을 통해 설치한 Apache 2.4.6 버전은 TLS 1.3 버전을 지원하지 않기 때문에 openssl과 마찬가지로 직접 압축파일을 다운받아 컴파일 후 설치하는 과정을 거쳐야 합니다.(Apache 2.4.37 이상 버전)
3.1. 필수 패키지 사전 설치
설치하기 전에 컴파일시 이용되는 패키지를 설치합니다.
sudo yum install gcc-c++ expat-devel
3.2. apr, pcre 라이브러리 설치
Apache httpd를 수동으로 빌드하기 위해서는 apr, apr-util, pcre 라이브러리가 필수적으로 필요하지만, httpd 설치파일에 포함되어있지 않습니다. [참고]
따라서, Apache httpd를 수동으로 설치하기위해서는 apr, apr-util, pcre 라이브러리를 먼저 설치해야합니다.
Apache 2.4.x 버전부터는 수동설치 파일에 apr과 pcre 라이브러리가 포함되어있지 않기 때문에, 관련 라이브러리도 별도로 추가해주는 과정이 필요합니다.
Aache Portable Runtime Project에서 Unix용 apr, apr-util 압축파일 링크를 가져옵니다.
Mirror 주소는 바뀔 수 있습니다.
cd ~/Module wget --no-check-certificate https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz tar xvf apr-1.7.0.tar.gz cd apr-1.7.0
```sh ./configure --prefix=/usr/local/apr ``` ```sh make sudo make install ```
apr 라이브러리 설치시 출력된 메시지의 맨 하단<
Libraries have been installed in: /usr/local/apr/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the '-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /usr/bin/install -c -m 644 apr.exp /usr/local/apr/lib/apr.exp /usr/bin/install -c -m 644 apr.pc /usr/local/apr/lib/pkgconfig/apr-1.pc for f in libtool shlibtool; do \ if test -f ${f}; then /usr/bin/install -c -m 755 ${f} /usr/local/apr/build-1; fi; \ done /usr/bin/install -c -m 755 /home/jini/Tools/apr-1.7.0/build/mkdir.sh /usr/local/apr/build-1 for f in make_exports.awk make_var_export.awk; do \ /usr/bin/install -c -m 644 /home/jini/Tools/apr-1.7.0/build/${f} /usr/local/apr/build-1; \ done /usr/bin/install -c -m 644 build/apr_rules.out /usr/local/apr/build-1/apr_rules.mk /usr/bin/install -c -m 755 apr-config.out /usr/local/apr/bin/apr-1-config
cd ~/Module wget --no-check-certificate https://dlcdn.apache.org//apr/apr-util-1.6.1.tar.gz tar xvf apr-util-1.6.1.tar.gz cd apr-util-1.6.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make sudo make install
Libraries have been installed in: /usr/local/apr-util/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the '-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the 'LD_RUN_PATH' environment variable during linking - use the '-Wl,-rpath -Wl,LIBDIR' linker flag - have your system administrator add LIBDIR to '/etc/ld.so.conf' See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- /usr/bin/install -c -m 644 aprutil.exp /usr/local/apr-util/lib /usr/bin/install -c -m 755 apu-config.out /usr/local/apr-util/bin/apu-1-config
Perl Compatible Regular Expressions
pcre 공식 홈페이지로 부터 압축파일을 링크를 가져와서 압축해제합니다.
wget --no-check-certificate https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.zip unzip pcre-8.45.zip
pcre의 경우, openssl과 같이 환경설정 및 컴파일 및 설치 과정을 진행합니다.
cd pcre-8.45 ./configure --prefix=/usr/local/pcre
make
sudo make install
3.3. Apache 2.4.51 설치
Apache 웹서버를 설치하기위한 라이브러리들의 설치가 모두 끝났으니 이제 웹서버를 설치하러 갑니다.
Apache HTTP Server Project에서 source 링크를 복사합니다.
압축파일을 설치할 디렉토리로 이동한 후
cd ~/Module
압축파일 다운로드 후 압축해제합니다.
wget --no-check-certificate https://dlcdn.apache.org//httpd/httpd-2.4.51.tar.gz tar xvf httpd-2.4.51.tar.gz
httpd-2.4.51 이 설치된 위치로 이동합니다.
cd ~/Module/httpd-2.4.51
컴파일하기 전에 새로 설치한 openssl와 pcre를 이용하여 httpd에 대한 환경설정을 합니다.
./configure --prefix=/usr/local/httpd --enable-mods-shared=all --enable-modules=all --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr-util/bin/apu-1-config --with-mpm=prefork --with-ssl=/usr/local/openssl --with-pcre=/usr/local/pcre/bin/pcre-config
그리고, 컴파일 후 설치합니다.
make sudo make install
4. TLS 1.3 적용
4.1. 웹서버 기본 실행
수동 설치한 httpd 가 위치한 디렉토리로 이동합니다.
cd /usr/local/httpd
bin 디렉토리에는 apachectl, httpd 등의 명령어가 위치합니다.
apachectl을 이용하여 서버를 실행해봅니다.
sudo ./bin/apachectl start
※ 수동 설치한 httpd를 실행시킬 때, 아래와 같은 메시지를 출력시킬 수 있습니다.
AH00543: httpd: bad user name daemon
웹서버 설정파일에 기본으로 설정되어있는 User와 Group이 daemon인데 해당 사용자가 존재하지 않기때문에 발생되는 문제입니다.
daemon 사용자를 추가하거나 다른 사용자로 대체하면 관련 에러를 해결할 수 있습니다.sudo vim ./conf/httpd.confUser daemon Group daemon
※ 수동 설치한 httpd를 실행시킬 때, 아래와 같은 메시지를 출력시킬 수 있습니다.
AH00558: httpd: Could not reliably determine the server′s fully qualified domain name, using ::1. Set the 'ServerName' directive globally to suppress this message
이는 ServerName이 명시적으로 설정되어있지 않아서 출력되는 메시지입니다.
conf/httpd.conf 에서 ServerName을 IP또는 도메인 주소로 설정해주도록 합시다.sudo vim ./conf/httpd.confServerName jiniworld.me:80
ip또는 도메인을 이용하여 접속해봅니다.
위와 같이 기본 페이지가 로드됩니다.
위의 페이지는 아직 SSL/TLS 인증서가 설정되지 않은 화면입니다.
4.2. ssl 관련 설정 추가 (httpd.conf)
ssl을 이용하기 위해서는 ssl 모듈과 SSLSessionCache 모듈이 필요합니다.
우리는 httpd를 DSO(Dynamic Shared Object) 방식으로 설치하였기 때문에 별도의 설치 없이 conf파일에 모듈 추가를 통해 기능을 이용할 수 있습니다.
sudo vim ./conf/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule ssl_module modules/mod_ssl.so Include conf/extra/httpd-ssl.conf
mod_socache_shmcb.so, mod_ssl.so 모듈을 로드하도록 주석 해제하고, SSL에 대한 기본 설정이 담겨있는 conf/extra/httpd-ssl.conf
구성파일을 포함시킵니다.
4.3. TLS 1.3 접속 테스트
TLS 1.3 접속을 위해서는 SSL/TLS 인증서가 설정되어있어야 합니다.
저의 경우, 기존에 사용하고 있었던 SSL/TLS 인증서가 있으며, 도메인에 가상 호스팅 설정도 되어있었기 때문에 기존에 사용하던 인증서를 이용하였습니다.
만약 SSL/TLS 인증서 발급에 대해 알고 싶다면 아래의 포스팅을 먼저 확인하고 오시길 바랍니다.
기존에 사용하고 있던 가상호스팅 설정을 이용하기 이전에, 먼저 SSL/TLS 인증서를 이용한 간단한 https 접속만 테스트 해보도록 합시다.
conf/extra/httpd-ssl.conf
파일에는 SSL에 대한 기본설정이 들어있는데, 그 중 개인키나 인증서 관련 설정정보는 본인이 가지고 있는 인증서 정보로 교체해줘야합니다.
기본적으로 설정되어있는 SSLCertificateFile, SSLCertificateKeyFile 관련 설정을 주석처리하고 기존에 사용하고 있던 SSL 인증서 정보를 추가합니다.
sudo vim ./conf/extra/httpd-ssl.conf
# SSLCertificateFile "/usr/local/httpd/conf/server.crt" # SSLCertificateKeyFile "/usr/local/httpd/conf/server.key" SSLCertificateKeyFile /etc/letsencrypt/live/jiniworld.me/privkey.pem SSLCertificateFile /etc/letsencrypt/live/jiniworld.me/cert.pem SSLCACertificateFile /etc/letsencrypt/live/jiniworld.me/fullchain.pem
그리고, Apache 웹서버를 재시작해봅니다.
sudo bin/apachectl graceful
https://jiniworld.me
로 접속해보면 아래와 같이 TLS 1.3 이 적용된 기본 화면이 출력되는 것을 확인할 수 있습니다.
※ 참고
strings /usr/local/httpd/modules/mod_ssl.so | egrep '^mod_ssl\/|^OpenSSL 'OpenSSL configuration command OpenSSL 1.1.1l 24 Aug 2021 mod_ssl/2.4.51 OpenSSL 1.1.1l 24 Aug 2021
4.4. 가상호스팅 관련 설정 추가 (httpd.conf)
기존에 설정한 가상호스팅 설정을 이용하기 위해 모듈을 활성화 시킵니다.
sudo vim ./conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_connect_module modules/mod_proxy_connect.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule rewrite_module modules/mod_rewrite.so
mod_proxy는 Proxy 설정을 이용하기 위한 모듈이고, mod_rewrite는 http 접근시 자동으로 https로 접속하도록 규칙을 변경해주는 모듈입니다.
그리고 예전에 설정했었던 가상호스트 구성파일을 새로 설치한 httpd 디렉토리 하위에 복사하거나, 링크를 추가하면 됩니다.
저의 경우, 가상호스트 설정 파일이 위치한 /etc/httpd/sites-enabled 디렉토리를 conf/site-enabled 에 링크 추가한 후,
sudo ln -s /etc/httpd/sites-enabled /usr/local/httpd/conf/site-enabled
임시로 포함시켰던 httpd-ssl.conf 파일은 다시 주석처리 하고, site-enabled 하위 구성파일을 Include 합니다.
httpd-ssl.conf 파일을 주석처리했기 때문에 443 포트를 사용하기 위한 설정은 httpd.conf 에 직접 추가해야합니다.
Listen 80
아래에 Listen 443
을 추가합니다.
sudo vim ./conf/httpd.conf
Listen 80 Listen 443 ... # Include conf/extra/httpd-ssl.conf Include conf/site-enabled/*.conf
그리고 가상 호스팅 설정한 도메인에 접속해보면 아래와 같이 TLS 1.3 이 적용된 것을 확인할 수 있습니다.
++ tip
xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory #include <expat.h> ^ compilation terminated. make[1]: *** [xml/apr_xml.lo] Error 1
expat-devel 패키지가 사전에 설치되지 않았을 경우, apr-util 컴파일 중 위와 같은 에러와 함께 컴파일 되지 않습니다.
checking for windows.h... no configure: error: Invalid C++ compiler or C++ compiler flags
gcc-c++ 패키지가 사전에 설치되지 않았을 경우, pcre Makefile만드는 중 위와 같은 에러를 발생시킵니다.
++
- openssl 1.0.2k 에 서 openssl 1.1.1 버전으로 변경하기
- Apache 웹서버에 TLS 1.3 적용하기
- TLSv1.3 적용을 위한 Apache Webserver 수동설치
- TLSv1.3 적용을 위한 httpd 수동설치
- How to enable TLSv1.3 in Apache2?
'Web Server > CentOS 7' 카테고리의 다른 글
[CentOS 7] Let's Encrypt CA의 무료 SSL 인증서 발급 및 자동갱신하기 (1) | 2021.08.27 |
---|---|
[CentOS 7] Apache 2.4 웹서버에 Let's Encrypt CA의 와일드카드 무료 SSL/TLS 인증서 적용하기 (0) | 2020.09.17 |
[CentOS 7] Apache 웹서버의 VirtualHost에 SSL 인증서 설정하기 (0) | 2020.08.31 |
[CentOS 7] Apache 2.4 웹서버에 VirtualHost(가상호스트) 설정하기 (0) | 2019.07.30 |