목표
- 패키지 관리자를 통한 바이너리 업데이트가 아니면서 현행 중 가장 stable 버전으로 업데이트 한다.
- 기존 사용중인 라이브러리를 건드리지 않는다.
- 시스템에 등록된 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/