Apache + mod_ssl 빌드가 내 OpenSSL 빌드에 연결되지 않았습니다.

Apache + mod_ssl 빌드가 내 OpenSSL 빌드에 연결되지 않았습니다.

나는 온라인에서 검색하는 데 시간을 보냈지만 내가 찾은 것 중 아무것도 도움이 되지 않는 것 같습니다.

CentOS 6 64비트를 실행 중이고 mod_ssl을 사용하여 Apache를 컴파일하고 이를 내 OpenSSL 버전(OS에서 제공하는 것보다 최신 버전)에 연결하려고 합니다.

OpenSSL 1.1.0i는 다음과 같이 구성됩니다.

./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared

Apache 2.4는 다음과 같이 구성됩니다.

./configure --enable-layout=mycustomlayout \
    --prefix=/opt/httpd-2.4.34 \
    --exec-prefix=/opt/httpd-2.4.34 \
    --with-mpm=prefork \
    --enable-so \
    --enable-ssl \
    --with-ssl=/opt/openssl-1.1.0 \
    --enable-cgi \
    --enable-http2 \
    --enable-proxy-http2 \
    --with-included-apr

잘 컴파일되는 것 같지만 mod_ssl은 OpenSSL 1.1.0이 설치된 위치를 모릅니다.

[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

따라서 이것은 어디를 볼 것인지 명시적으로 알려주는 경우에만 작동합니다.

[root@host .libs]# export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007f069149a000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007f069100a000)

httpd 바이너리에 mod_ssl을 정적으로 구축하는 것조차 --enable-mods-static=ssl도움이 되지 않습니다.

--enable-ssl, --enable-ssl --enable-ssl-staticlib-deps, 를 시도했지만 --enable-ssl --enable-ssl-staticlib-deps --enable-mods-static=ssl여전히 동일한 결과가 나왔습니다.

    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

또한 운 없이 다음 변수를 설정해 보았습니다 ./configure.

export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib"

/etc/ld.so.conf.d새로운 OpenSSL 라이브러리를 자동 로딩하는 기능을 추가하거나 Apache의 init 스크립트를 조정하여 이를 추가할 수 있다는 것을 알고 있지만 , PHP 빌드처럼 LD_LIBRARY_PATH작동하도록 하고 프로그램이 libssl.so/ 를 찾도록 하는 것이 더 좋습니다.libcrypto.so

[root@host php]# export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib" \
       PHP_PREFIX=/opt/php-7.2.9 \
       EXTENSION_DIR=$PHP_PREFIX/usr/lib64/php/modules
[root@host php]# ./configure […] \
    --with-imap=shared \
    --with-imap-ssl \
    --with-openssl=shared \
    --with-openssl-dir=/opt/openssl-1.1.0/bin

[root@host php]# make
[root@host php]# unset PKG_CONFIG_PATH LD_LIBRARY_PATH LDFLAGS

[root@host modules]# ldd ./openssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007fc2220a6000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007fc221c17000)

내가 뭘 잘못했나요? 이것이 버그일까요?

답변1

LDFLAGS 환경 변수에 다음을 추가해 보세요.

-Bstatic -lssl -lcrypto

.so또한 openssl libdir에 파일이 없고 정적 .a파일만 있는지 확인하십시오. 이상적으로 이는 no-sharedopenssl 구성에 매개변수를 전달하여 수행됩니다.

./configure우리가 명시적으로 정적 버전을 요청하더라도 링커가 공유 버전을 선호하는 이유는 여전히 확실하지 않습니다. 그러나 이는 httpd의 스크립트가 라이브러리 종속성을 처리하는 방식과 관련이 있을 수 있습니다.

구성 스크립트의 패치가 더 깔끔할 수 있지만 .so파일이 없다는 것만으로도 링커가 정적 버전을 선택하기에 충분한 것 같습니다.

관련 정보