RHEL/CentOS 7 에 TLS 1.3 적용하기(OpenSSL 1.1 & Nginx compile)

RHEL/CentOS 8 은 높은 버전의 OpenSSL 이 설치되어 있으므로 아래처럼 컴파일해서 설치할 필요가 없습니다.


TL;DR

RedHat Linux 나 CentOS 7 은 안정성을 위해 엄격한 패키지 정책을 준용하다 보니 패키지 업데이트가 굉장히 느린 단점이 있습니다.


예로 새로 지정된 TLS 1.3 표준을 적용하려면 OpenSSL 1.1 이상이 필요하지만 정식 패키지에는 openssl 1.0.2 만 포함되어 있으므로 TLS1.3 을 사용할 수 없습니다.


개인적으로는 시스템 관리의 편리함때문에 사전 빌드된 패키지 설치를 선호하지만 이런 경우에는 소스를 내려 받아서 직접 설치하는 방법밖에는 없습니다.


아래는 컴파일 절차를 정리한 shell script 입니다.

 Click here to expand...


아래 명령으로 스크립트를 다운로드 받고 실행하면 nginx 와 OpenSSL 최신 버전을 쉽게 컴파일하고 설치할 수 있습니다.

wget https://gist.githubusercontent.com/lesstif/a332456a4a6fecdf50f2ccbfe4a02727/raw/84bab37c25d3869716c55003342acbcbfa7afcd4/nginx-with-tls13-compile.sh
wget https://gist.githubusercontent.com/lesstif/a332456a4a6fecdf50f2ccbfe4a02727/raw/84bab37c25d3869716c55003342acbcbfa7afcd4/openssl-1.1-compile.sh
wget https://gist.githubusercontent.com/lesstif/a332456a4a6fecdf50f2ccbfe4a02727/raw/c66d15f7c364437d229c4ac5970d97a90319811a/nginx.service

bash ./openssl-1.1-compile.sh


사전 준비

소스를 컴파일해야 하므로 컴파일러와 make 등 개발 도구를 사전에 설치해야 하며 아래 명령어를 실행하면 됩니다.

$ sudo yum groupinstall "Development tools"


OpenSSL 1.1 설치


  1. https://www.openssl.org/source/ 에 연결해서 1.1 대의 마지막 버전 소스를 다운 받습니다. 이 글을 쓰는 시점에서는 1.1.1h 입니다.

    $ OPENSSL=openssl-1.1.1h.tar.gz
    $ wget https://www.openssl.org/source/${OPENSSL}
  2. 압축을 해제하고 해당 폴더로 이동합니다.

    $ tar zxvf ${OPENSSL}
    $ cd $(basename ${OPENSSL} .tar.gz)
  3. build 환경을 구성합니다. openssl 에 의존적인 패키지가 많으므로 /usr/local 에 설치하고 공유 라이브러리를 만들기 위해 shared 옵션도 추가합니다.

    $ ./config shared no-idea no-md2 no-mdc2 no-rc5 no-rc4 --prefix=/usr/local/

    오래 됐거나 특허가 걸린 알고리즘을 제외하기 위해 no-idea no-md2 no-mdc2 no-rc5 no-rc4 를 추가합니다.

  4. 컴파일과 테스트를 수행합니다.

    $ make && make test
  5. 정상적으로 컴파일이 끝났으면 openssl 을 설치합니다.

    $ sudo make install

    make test 에서 "Can't locate Test/Harness.pm in @INC" 에러 메시지를 내고 실패한다면 다음 패키지를 설치합니다.


    $ sudo yum install perl-Test-Harness
  6. 라이브러리를 잘 찾도록 설정 파일에 추가합니다.

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64/
  7. 정상적으로 설치됐는지 확인합니다.

    $ /usr/local/bin/openssl version
    
    OpenSSL 1.1.1h  22 Sep 2020

Nginx 설치

  1. https://nginx.org/en/download.html 에서 마지막 버전을 다운 받습니다.  이 글을 쓰는 시점에서는 1.15.9 가 마지막입니다.

    $ NGINX=nginx-1.15.9.tar.gz
    
    $ wget https://nginx.org/download/${NGINX}
  2. 압축을 풀고 해당 폴더로 이동합니다.

    $ tar zxvf ${NGINX}
    $ cd $(basename $NGINX .tar.gz)
  3. ./configure 스크립트로 환경을 구성합니다. 복잡하므로 아래 gist 를 참고하며 주의할 점은 ./configure 의 마지막 줄의 --with-openssl 에는 위에서 다운로드 받은 openssl 의 소스 경로를 설정합니다.

     Click here to expand...

  4. 컴파일을 수행합니다.

    $ make
  5. 컴파일된 바이너리를 설치합니다.

    $ sudo make install

    .

  6. nginx 를 실행해서 버전을 확인합니다.

    $ nginx -v
    
    
    nginx version: nginx/1.15.9
  7. 설치가 완료되었으면 nginx 의 설정에 다음 내용을 넣고 재구동한 후에 https://www.ssllabs.com/ 에서 TLS1.3 이 제대로 설정되었는지 확인합니다.

    ssl_protocols TLSv1.2 TLSv1.3;

Ref