Microsoft 社는 2022년 6월 15일 Internet Explorer 11의 지원을 종료했습니다.

openssl-3.0.9 / openssl-3.1.1 on CentOS 5.8

제목

openssl-3.0.9 / openssl-3.1.1 on CentOS 5.8

CentOS 5.8 에서 openssl-3.0.9 과 openssl-3.1.1 은 에러가 발생하는 원인 및 해결 방법도 동일하다.

0. 주의사항

0.1. 설치되어 있던 버전은 충분히 낡아 빠졌지만 걷어내지는 않는다.

OpenSSL 0.9.8e-fips 을 지우면 curl, yum 은 물론이고, cpan 도 사용할 수 없다.

만약 실수로 지웠다면, 다른 장비를 통해서 다운로드 한 뒤에 rpm 명령어로 다시 설치한다.

1. 준비작업

1.1. 다운로드

https://www.openssl.org/source/ 에서 다운로드 한다.

CentOS 5.8 에서 직접 다운로드 할 수 없고, 다른 장비에서 다운로드 한 파일을 sftp 따위로 올려야 한다.

$ curl -O https://www.openssl.org/source/openssl-3.0.9.tar.gz

혹은

$ curl -O https://www.openssl.org/source/openssl-3.1.1.tar.gz

1.2. gcc 및 make 설치

yum install gcc make -y

1.3. 의존성

perl v5.10.0 이상이 있어야 한다.

CentOS 5.8 에서 (perl-5.10.1 대신) perl-5.30.3 을 설치하는 방법은 필자가 작성한 다른 글을 참조한다.

perl 을 설치했다면, PATH 환경변수를 변경하는 것만으로는 부족하고, /usr/bin/perl 을 교체해야 한다.

$ cd /usr/bin
$ mv perl perl.5.8.8.backup
$ ln -s /opt/perl-5.30.3/bin/perl perl

2. 컴파일 및 설치

설치 디렉토리(--prefix) 와 openssl 디렉토리(--openssldir) 는 알아서 변경한다.

대부분의 Linux 배포판들은 /usr 혹은 / 이 설치 디렉토리(--prefix)이지만, 컴파일해서 설치하는 것들은 /usr/local 이나 /opt 아래에 두는 경우가 많다.

$ mkdir -p logs/openssl-3.0.9
$ tar xvfz openssl-3.0.9.tar.gz > logs/openssl-3.0.9/tar.`date +%Y%m%d.%H%M%S`.log 2>&1
$ cd openssl-3.0.9
$ ./config enable-fips --prefix=/opt/openssl-3.0.9 --openssldir=/opt/ssl/openssl-3.0.9 > ../logs/openssl-3.0.9/config.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make > ../logs/openssl-3.0.9/make.`date +%Y%m%d.%H%M%S`.log 2>&1

혹은

$ mkdir -p logs/openssl-3.1.1
$ tar xvfz openssl-3.1.1.tar.gz > logs/openssl-3.1.1/tar.`date +%Y%m%d.%H%M%S`.log 2>&1
$ cd openssl-3.1.1
$ ./config enable-fips --prefix=/opt/openssl-3.1.1 --openssldir=/opt/ssl/openssl-3.1.1 > ../logs/openssl-3.1.1/config.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make > ../logs/openssl-3.1.1/make.`date +%Y%m%d.%H%M%S`.log 2>&1

CentOS 5.8 순정 gcc 이라면 make test 에서 에러가 발생한다.

후술하는 내용을 참조하여 에러를 해결한 뒤에 다음 절차를 계속 진행한다.

$ make test > ../logs/openssl-3.0.9/test.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make install > ../logs/openssl-3.0.9/install.`date +%Y%m%d.%H%M%S`.log 2>&1

혹은

$ make test > ../logs/openssl-3.1.1/test.`date +%Y%m%d.%H%M%S`.log 2>&1
$ make install > ../logs/openssl-3.1.1/install.`date +%Y%m%d.%H%M%S`.log 2>&1

3. 적용

3.1. 현재 환경에 적용

현재 환경에서는 다음과 같이 적용한다.

$ export LD_LIBRARY_PATH=/opt/openssl-3.0.9/lib
$ export PATH=/opt/openssl-3.0.9/bin:${PATH}

pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.

$ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openssl-3.0.9/lib/pkgconfig

혹은

$ export LD_LIBRARY_PATH=/opt/openssl-3.1.1/lib
$ export PATH=/opt/openssl-3.1.1/bin:${PATH}

pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.

$ export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openssl-3.1.1/lib/pkgconfig

3.2. 현재 로그인한 사용자에게 적용

현재 로그인한 사용자에게 적용하려면, ".bash_profile" 파일의 끝에 위의 내용을 추가한다.

3.3. 시스템 전체에 적용

이건 신중할 필요가 있다.

3.3.1. ld.so.conf 변경

"/etc/ld.so.conf.d/openssl.conf" 파일을 편집(추가)한다.

$ vi /etc/ld.so.conf.d/openssl.conf

다음의 내용으로 교체(추가)한다.

/opt/openssl-3.0.9/lib

혹은

/opt/openssl-3.1.1/lib

변경사항을 적용한다.

$ ldconfig

3.3.2. PATH 환경변수 변경

"/etc/bashrc" 파일에 PATH 환경변수를 변경한다.

export PATH=/opt/openssl-3.0.9/bin:${PATH}

pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openssl-3.0.9/lib/pkgconfig

혹은

export PATH=/opt/openssl-3.1.1/bin:${PATH}

pkg-config 를 사용하는 경우 다음의 내용도 추가할 수 있다.

export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openssl-3.1.1/lib/pkgconfig

4. 문제해결

해결방법은 전술한 의존성 있는 모듈 설치에 대한 내용을 참조한다.

4.1. Perl v5.10.0 required--this is only v5.8.8

config 할 때 발생한다.

perl 버전을 업그레이드 한다.

4.2. 읽을거리

  • INSTALL.md : 설치방법에 대한 안내
  • README-FIPS.md : FIPS 에 관한 안내
  • test/README.md : make test 명령에 대한 안내

5. 후술

5.1. 현상

마지막 로그는 다음과 같다.

Test Summary Report
-------------------
90-test_threads.t (Wstat: 256 Tests: 2 Failed: 1)
Failed test: 1
Non-zero exit status: 1
Files=249, Tests=3478, 8664 wallclock secs (192.73 usr 21.70 sys + 7210.94 cusr 1024.66 csys = 8450.03 CPU)
Result: FAIL
make[1]: *** [run_tests] Error 1
make[1]: Leaving directory `/usr/local/src/openssl-3.0.9'
make: *** [tests] Error 2

"Fail" 로 검색해서 실제로 에러가 발생한 부분의 로그는 다음과 같다.

../../util/wrap.pl ../../test/threadstest -fips -config /usr/local/src/openssl-3.0.9/test/default-and-fips.cnf ../../test/recipes/90-test_threads_data => 139
not ok 1 - running test_threads with FIPS
# ------------------------------------------------------------------------------
# Looks like you failed 1 test of 2.90-test_threads.t ..................
Dubious, test returned 1 (wstat 256, 0x100)
Failed 1/2 subtests

fips 를 제외하고 다음과 같이 실행한다.

LD_LIBRARY_PATH=. test/threadstest -config test/default.cnf test/recipes/90-test_threads_data

실행결과의 마지막은 다음과 같다.

Segmentation fault 

5.2. 원인

gcc 에서 "-O3" 옵션이 추가했을 때 발생한다.

명시적으로 "-d" 나 "--debug" 를 추가하지 않았다면, "-O3" 이 기본값이다.

yum 저장소를 CentOs 5.11 로 변경한 후에 gcc 를 update 해도 결과는 달라지지 않는다.

CentOs 5.8 순정 gcc ("gcc 4.1.2 20080704") 혹은 openssl 의 버그이겠지만, 어느 쪽의 버그인지 판단하기 어렵다.

gcc ("gcc 4.1.2 20080704") 의 버그처럼 보이는 이유는 gcc 의 다른 버전(예를 들어 gcc 4.4.1 20090725) 에서 에러가 발생하지 않기 때문이다. 반대로 threadstest.c 를 작성할 때 gcc 4.1.2 에서 문제가 생기지 않도록 할 수 있었다면, openssl 의 버그 일수도 있는데, 회피가능성에 대해서는 잘 모르겠다.

5.3. 해결방법

logs 디렉토리의 "make." 으로 시작하는 로그파일에서 "threadstest" 로 검색해서 다음과 같은 부분을 찾는다.

gcc -Iinclude -Iapps/include -pthread -m64 -Wa,--noexecstack -Wall -O3 -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -MMD -MF test/threadstest-bin-threadstest.d.tmp -MT test/threadstest-bin-threadstest.o -c -o test/threadstest-bin-threadstest.o test/threadstest.c
rm -f test/threadstest
${LDCMD:-gcc} -pthread -m64 -Wa,--noexecstack -Wall -O3 -L. \
-o test/threadstest \
test/threadstest-bin-threadstest.o \
test/libtestutil.a -lcrypto -ldl -pthread

threadstest.c 만 "-O3" 을 "-O2" 로 변경해서 다시 컴파일 한다.

$ gcc -Iinclude -Iapps/include -pthread -m64 -Wa,--noexecstack -Wall -O2 -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -MMD -MF test/threadstest-bin-threadstest.d.tmp -MT test/threadstest-bin-threadstest.o -c -o test/threadstest-bin-threadstest.o test/threadstest.c
$ rm -f test/threadstest
$ gcc -pthread -m64 -Wa,--noexecstack -Wall -O2 -L. -o test/threadstest test/threadstest-bin-threadstest.o test/libtestutil.a -lcrypto -ldl -pthread

변경사항은 다음과 같다.

  • "-O3" 을 "-O2" 으로 변경
  • "${LDCMD:-gcc}" 를 "gcc" 로 변경
  • "\" 없애버리고 한줄로 변경

다음과 같이 테스트 한다.

make test TESTS='test_threads' V=1 

마지막 메시지가 다음과 같다면 성공이다.

All tests successful.
Files=1, Tests=2, 23 wallclock secs ( 0.07 usr 0.02 sys + 11.01 cusr 0.64 csys = 11.74 CPU)
Result: PASS
make[1]: Leaving directory `/usr/local/src/openssl-3.1.1'

이제 돌아가서 make test 를 수행하기로 한다.

threadstest 는 설치되는 것도 아니다.

5.4. 다른 해결방법

gcc 를 upgrade 하는 방법이 있기는 하다.

https://people.centos.org/tru/devtools-2/

하지만 https://people.centos.org/ 이하의 패키지는 사용자가 모든 위험을 감수해야 한다.

6. 여담

openssl 은 컴파일 하기 쉽고, 호환성이 높은 프로그램 중 하나이다.

다음의 운영체제에서 별다른 이슈 없이 컴파일 할 수 있었다.

  • Ubuntu 14.04.6 LTS Trusty Tahr (gcc 4.8.4, glibc 2.19, Kernel 3.13, 2014.04.17. 발표)
  • Ubuntu 16.04.7 LTS Xenial Xerus (Kernel 4.4, 2016.04.21. 발표)
  • Ubuntu 19.04 Disco Dingo (gcc 8.3.0, glibc 2.29, Kernel 5.0, 2019.04.18. 발표)
제목

첨부파일