[Apache 2.4.48] Apache 웹서버에 TLS 1.3 적용하기

2021. 6. 21. 23:59CentOS 7/Web Server

반응형
  1. TLS 1.3 을 지원하려면?
  2. openssl 1.1.1 수동설치
    1. openssl 1.1.1 설치
    2. 공유 라이브러리 등록
    3. openssl 관련 라이브러리 확인 및 추가
    4. openssl 관련 라이브러리 확인 및 등록
  3. httpd 2.4.51 수동설치
    1. 필수 패키지 사전 설치
    2. apr, pcre 라이브러리 설치
      1. 3.2.1. apr 라이브러리 설치
      2. apr-util 라이브러리 설치
      3. pcre 라이브러리 설치
    3. Apache 2.4.51 설치
  4. TLS 1.3 적용
    1. 웹서버 기본 실행
    2. ssl 관련 설정 추가 (httpd.conf)
    3. TLS 1.3 접속 테스트
    4. 가상호스팅 관련 설정 추가 (httpd.conf)

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 버전을 확인할 수 있습니다.

37

현재에는 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 가 나옵니다.

33


그 이유는, 아직 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

그리고 다시 버전 체크를 하면 아래와 같이 변경된것을 확인할 수 있습니다.

34


새로 변경한 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 주소는 바뀔 수 있습니다.


3.2.1. apr 라이브러리 설치

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

3.2.2. apr-util 라이브러리 설치

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

3.2.3. pcre 라이브러리 설치

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.conf
User 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.conf
ServerName jiniworld.me:80

ip또는 도메인을 이용하여 접속해봅니다.

06

위와 같이 기본 페이지가 로드됩니다.
위의 페이지는 아직 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 이 적용된 기본 화면이 출력되는 것을 확인할 수 있습니다.

35


※ 참고

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 디렉토리 하위에 복사하거나, 링크를 추가하면 됩니다.

참고 : [Apache 2.4] VirtualHost(가상호스트) 설정하기

저의 경우, 가상호스트 설정 파일이 위치한 /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 이 적용된 것을 확인할 수 있습니다.

36


++ 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?
반응형