OpenSSL 최신버전 빌드하기 (CentOS 7)

(Last Updated On: May 31, 2020)

OpenSSL 최신버전 깔자!

# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

CentOS 7의 기본 repo를 받아 설치했더니 2020년인데 2017년 버전이다. 1.0.2는 TLS1.3도 지원하지 않는다. 버전이 최신버전이 아니라서 볼 때마다 토가 나올 것 같다. 하지만 openssl은 의존성이 매우 강하기 때문에 복잡한 어플리케이션이 설치되어 있는 경우 추천하지 않는 옵션이다. 그렇지만 보안이 점점 중요해지는 최근에는 새 어플리케이션은 최신 버전의 OpenSSL을 요구한다. 그렇기 때문에 최신버전을 수동 설치 할 필요성이 있다.

 

1 Source 파일 다운로드

openssl-1.???? 버전을 받는 것을 추천한다.

wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz

2 압축해제

tar xvf openssl-1.1.1g.tar.gz

3 빌드하기

cd openssl-1.1.1g/
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib

 

# ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1g (0x1010107fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************

 

make -j$(nproc)

-j 는 빌드에 사용할 프로세서 개수를 뜻한다.
nproc는 프로세서의 개수를 뜻한다.

crypto/comp/c_zlib.c:35:19: fatal error: zlib.h: No such file or directory
 # include <zlib.h>

이때 zlib가 없으면 zlib을 빌드해서 설치하던지.. CentOS 7 기준으로 zlib-devel 을 설치한다.

빌드가 성공적으로 되었으면 설치한다.

...
${LDCMD:-gcc} -pthread -m64 -Wa,--noexecstack -Wall -O3 -L.   \
        -o test/x509_internal_test test/x509_internal_test.o \
         test/libtestutil.a libcrypto.a -lz -ldl -pthread
make[1]: Leaving directory `/root/openssl-1.1.1g'
make install

 

...
/usr/local/ssl/share/doc/openssl/html/man7/passphrase-encoding.html
/usr/local/ssl/share/doc/openssl/html/man7/proxy-certificates.html
/usr/local/ssl/share/doc/openssl/html/man7/scrypt.html
/usr/local/ssl/share/doc/openssl/html/man7/ssl.html
/usr/local/ssl/share/doc/openssl/html/man7/x509.html
[root@localhost ~/openssl-1.1.1g]#

4 test

# /usr/local/ssl/bin/openssl version
/usr/local/ssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

실제로 빌드되자마자 바로 실행해보면  공유 라이브러리 관련한 오류가 뜬다.

5 공유 라이브러리 등록

라이브러리 등록을 위해서 동적 라이브러리 로딩 정보를 등록한다.

cat > /etc/ld.so.conf.d/openssl.conf <<< "/usr/local/ssl/lib"
# cat /etc/ld.so.conf.d/openssl.conf
/usr/local/ssl/lib

 

ldconfig -v
# ldconfig -v
...
/usr/local/ssl/lib:
        libssl.so.1.1 -> libssl.so.1.1
        libcrypto.so.1.1 -> libcrypto.so.1.1

...

 

6 test

# /usr/local/ssl/bin/openssl version
OpenSSL 1.1.1g  21 Apr 2020

드디어 실행할 수 있게 되었지만

# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

아직은 1.0.2 버전이다. 기본 경로인 /usr/bin/의 openssl 을 치워야한다.

7 Symbolic Link

ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
# ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln: failed to create symbolic link ‘/usr/bin/openssl’: File exists

하지만 openssl이 이미 있다고 한다.
과감히 기존의 openssl을 날려버리거나 백업한다.

ln -sf /usr/local/ssl/bin/openssl /usr/bin/openssl
# openssl version
OpenSSL 1.1.1g  21 Apr 2020

OpenSSL 업그레이드가 성공적이다.

8 System Variables

그러나 OpenSSL은 정상적으로 업그레이드 되었지만 다른 프로그램을 빌드할 때에는 OpenSSL의 정보를 따로 등록시켜 줄 필요가 있다. bash 를 실행하면 각종 환경변수의 설정을 담당하는 profile에 등록한다.

cat > /etc/profile.d/openssl.sh << _KERUS_
export OPENSSL_PATH="/usr/local/ssl/bin"
export OPENSSL_ROOT_DIR="/usr/local/ssl"
export OPENSSL_LIBRARIES="/usr/local/ssl/lib"
export OPENSSL_INCLUDE_DIR="/usr/local/ssl/include"
PATH=$PATH:$OPENSSL_PATH
_KERUS_
# cat /etc/profile.d/openssl.sh
export OPENSSL_PATH="/usr/local/ssl/bin"
export OPENSSL_ROOT_DIR="/usr/local/ssl"
export OPENSSL_LIBRARIES="/usr/local/ssl/lib"
export OPENSSL_INCLUDE_DIR="/usr/local/ssl/include"
PATH=/sbin:/bin:/usr/sbin:/usr/bin:

실행 파일이므로 실행 권한을 추가한다.

chmod 755 /etc/profile.d/openssl.sh

쉘을 껐다가 켜거나 source /etc/profile.d/openssl.sh  를 실행시켜 환경 변수를 현재 쉘에 등록시킨다.