목차

OpenSSL을 컴파일을 통해 버전 업그레이드 하기

🗓️

목표

  1. 패키지 관리자를 통한 바이너리 업데이트가 아니면서 현행 중 가장 stable 버전으로 업데이트 한다.
  2. 기존 사용중인 라이브러리를 건드리지 않는다.
  3. 시스템에 등록된 OpenSSL을 현행 stable 대체한다.

시스템 준비 기준

  • Rocky Linux 또는 RHEL 기반 리눅스
  • 인터넷 연결
  • root 환경

반드시 확인해야 할 것

  • 시스템에 설치된 OpenSSL 버전이 낮으면 높은 버전의 OpenSSL이 필요한 타켓 어플리케이션도 컴파일 해야한다. 그리고 이 경우 컴파일 옵션에서 반드시 libssl의 경로를 별도 지정해야 하는 경우가 있다.
  • 이 경우에는 아래에서 진행되는 심볼릭 링크 경로가 아닌 원본 링크를 지정하는 편이 낫다.
  • 패키지 관리자에 등록된 OpenSSL이 가장 최신 버전이 낮은 경우도 마찬가지다.
  • 현재 시스템에서 libssl에 가장 의존하는 어플리케이션이 어떤것인지 사전 조사하고, 라이브러리 교체시 영향도가 없는지 꼭 파악할 것.

필요한 패키지 준비

dnf install -y \
    perl \
    perl-IPC-Cmd \
    glibc \
    glibc-devel \
    gcc \
    systemd-devel \
    zlib \
    zlib-devel

dnf를 사용할 수 없는 시스템에서는 perl, libgcc, gcc, zlib을 별도로 준비한다.
이후 OpenSSL 사이트를 방문하여 소스를 다운로드 받는다.

mkdir /opt/openssl
cd /opt/openssl

wget https://www.openssl.org/source/openssl-3.2.0.tar.gz --no-check-certificate
tar -xf openssl-3.2.0.tar.gz
cd openssl-3.2.0/

컴파일 이후 저장될 공간을 지정한다. 설치 시에만 사용하면 된다.

export CUSTOMSSL=/usr/local/ssl
mkdir -p $CUSTOMSSL

OpenSSL 컴파일

컴파일 설정을 한다.

./config --prefix=$CUSTOMSSL \
    --openssldir=$CUSTOMSSL \
    -DOPENSSL_TLS_SECURITY_LEVEL=0 \
    -Wl,-rpath=$CUSTOMSSL/lib64 \
    shared enable-des zlib enable-weak-ssl-ciphers

다른 것은 몰라도 shared 키워드는 꼭 들어가야 현행 라이브러리를 대체할 수 있다.

성공하면 아래와 같은 출력화면이 나온다.

Configuring OpenSSL version 3.2.0 for target linux-x86_64
Using os-specific seed configuration
Created configdata.pm
Running configdata.pm
Created Makefile.in
Created Makefile
Created include/openssl/configuration.h

**********************************************************************
***                                                                ***
***   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.md file first)      ***
***                                                                ***
**********************************************************************

컴파일 한다.

make -j $(nproc)
make install

타겟 위치를 방문하여 컴파일이 잘 됐는지, 공유라이브러리가 생성되었는지 확인한다.

cd $CUSTOMSSL/lib64
cd $CUSTOMSSL/bin

기존 버전 백업

OpenSSL은 크게 3개의 파일을 교체한다. 먼저 파일을 적절한 위치에 백업을 한다

mkdir -p ~/openssl_backup/bin/

cp -rfp /bin/openssl ~/openssl_backup/bin/

여기서 중요한 부분은, 메이저 버전이 같으면 해당 공유 라이브러리도 같이 백업한다.

# 업그레이드 하는 메이저 버전이 같을 경우
cp -rfp /usr/lib64/libssl.so.3 ~/openssl_backup/
cp -rfp /usr/lib64/libcrypto.so.3 ~/openssl_backup/

업그레이드 (교체)

교체 전에 충분한 여분의 ssh 세션을 먼저 만들어 둔 다음 아래 스크립트 스니펫을 한번에 실행한다.

rm -rf /bin/openssl
rm -rf /usr/lib64/libssl.so.3
rm -rf /usr/lib64/libcrypto.so.3

ln -s /usr/local/ssl/lib64/libssl.so.3 /usr/lib64/libssl.so.3
ln -s /usr/local/ssl/lib64/libcrypto.so.3 /usr/lib64/libcrypto.so.3
ln -s /usr/local/ssl/bin/openssl /bin/openssl

교체 후 바로 아래 명령어를 통해 버전을 확인한다.

openssl version

아래와 같이 나오면 된다.

OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2023)

특히 의존을 많이 하는 ssh 서버를 재시작하여 확인해본다.

systemctl restart sshd

(부록1) 공유 라이브러리를 사용하는가?

어플리케이션이 라이브러리에 제대로 연결되어있는지 확인한다.

# ldd /sbin/haproxy | grep ssl
    libssl.so.3 => /usr/local/ssl/lib64/libssl.so.3 (0x00007f426ecb9000)
    libcrypto.so.3 => /usr/local/ssl/lib64/libcrypto.so.3 (0x00007f426e608000)

(부록2) 만약의 사태를 대비하여

혹시 libssl, libcrypto를 읽어오지 못하는 문제가 생기면 아래와 같이 공유 라이브러리를 다시 인식시킨다.

## dynamic shared library cache flush (libssl 인식 안되는 경우에만)
cat <<EOF>> openssl-3.2.0.conf
/usr/local/ssl/lib64/
EOF

ldconfig


참고 링크

  • https://wiki.openssl.org/index.php/Compilation_and_Installation
  • https://www.openssl.org/source/