弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

RHEL5.11のHTTPサーバがTLS1.2で喋れるよーにopenssl-1.0.2j環境でビルド。

RHEL5.11に付属するHTTPサーバはhttpd-2.2.31-1.el5で
openssl-0.9.8e-40.el5_11のmod_sslを使ってる。
なのでTLS1.2で喋ることができない。
TLS_DHE_RSA_WITH_AES_256_CBC_SHA、鍵長 256 bit、TLS 1.0)

このままではまたしてもプードルに殺されてしまうかもw

なのでRHEL5環境にTLS1.2を導入して
TLS_DHE_RSA_WITH_AES_256_CBC_SHA、鍵長 256 bit、TLS 1.0

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、鍵長 256 bit、TLS 1.2
へのアップグレードを試みる。

じゃぁ、openssl-1.1.0cまでyum updateすればいいだけなんじゃね?
と思ったら大間違い。

# rpm -e openssl-0.9.8e-40.el5_11.x86_64
エラー: 依存性の欠如:
	libcrypto.so.6()(64bit) は (インストール済み)curl-7.15.5-17.el5_9.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)gnupg-1.4.5-18.el5_10.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)wget-1.11.4-3.el5_8.2.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)OpenIPMI-libs-2.0.16-16.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)libwvstreams-4.2.2-2.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)neon-0.25.5-10.el5_4.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)cadaver-0.22.3-4.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)OpenIPMI-2.0.16-16.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)vorbis-tools-1.1.1-3.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)tcpdump-3.9.4-15.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)slrn-0.9.8.1pl1-1.2.2.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)elinks-0.11.1-8.el5_9.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)nspluginwrapper-1.3.0-9.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)python-libs-2.4.3-56.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)m2crypto-0.16-9.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)wpa_supplicant-0.5.10-10.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)openssh-4.3p2-82.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)cyrus-sasl-2.1.22-7.el5_8.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)python-ldap-2.2.0-2.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)hplip-1.6.7-6.el5_6.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)pyOpenSSL-0.6-2.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)fipscheck-1.2.0-1.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)fetchmail-6.3.6-4.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)mutt-1.4.2.2-6.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)openssh-clients-4.3p2-82.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)openssh-server-4.3p2-82.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)ipsec-tools-0.6.5-14.el5_8.5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)pam_ccreds-3-5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)libsane-hpaio-1.6.7-6.el5_6.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)gnome-vfs2-2.16.2-12.el5_9.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)evolution-data-server-1.12.3-18.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)net-snmp-libs-5.3.2.2-25.el5_11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)net-snmp-5.3.2.2-25.el5_11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)openldap-2.3.43-29.el5_11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)bind-libs-9.3.6-25.P1.el5_11.11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)sendmail-8.13.8-10.el5_11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)bind-utils-9.3.6-25.P1.el5_11.11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)stunnel-4.15-2.el5.2.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)ntp-4.2.2p1-18.el5_11.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postgresql84-libs-8.4.20-1.el5_10.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postgresql84-8.4.20-1.el5_10.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postgresql84-server-8.4.20-1.el5_10.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postgresql-libs-8.1.23-10.el5_10.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)cyrus-sasl-devel-2.1.22-7.el5_8.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postgresql84-devel-8.4.20-1.el5_10.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)pkcs11-helper-1.08-1.el5.rf.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)openvpn-2.3.13-1.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)mysql-5.0.95-5.el5_9.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)postfix-2.3.3-7.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)distcache-1.4.5-14.1.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)httpd-tools-2.2.31-1.el5.x86_64 に必要とされています
	libcrypto.so.6()(64bit) は (インストール済み)mod_ssl-2.2.31-1.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)curl-7.15.5-17.el5_9.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)gnupg-1.4.5-18.el5_10.1.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)wget-1.11.4-3.el5_8.2.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)libwvstreams-4.2.2-2.1.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)neon-0.25.5-10.el5_4.1.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)cadaver-0.22.3-4.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)vorbis-tools-1.1.1-3.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)slrn-0.9.8.1pl1-1.2.2.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)elinks-0.11.1-8.el5_9.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)nspluginwrapper-1.3.0-9.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)python-libs-2.4.3-56.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)m2crypto-0.16-9.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)wpa_supplicant-0.5.10-10.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)python-ldap-2.2.0-2.1.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)python-rhsm-1.11.3-5.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)pyOpenSSL-0.6-2.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)fetchmail-6.3.6-4.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)mutt-1.4.2.2-6.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)quota-3.13-8.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)gnome-vfs2-2.16.2-12.el5_9.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)evolution-data-server-1.12.3-18.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)openldap-2.3.43-29.el5_11.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)sendmail-8.13.8-10.el5_11.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)stunnel-4.15-2.el5.2.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postgresql84-libs-8.4.20-1.el5_10.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postgresql84-8.4.20-1.el5_10.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postgresql84-server-8.4.20-1.el5_10.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postgresql-libs-8.1.23-10.el5_10.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postgresql84-devel-8.4.20-1.el5_10.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)openvpn-2.3.13-1.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)mysql-5.0.95-5.el5_9.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)postfix-2.3.3-7.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)distcache-1.4.5-14.1.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)httpd-tools-2.2.31-1.el5.x86_64 に必要とされています
	libssl.so.6()(64bit) は (インストール済み)mod_ssl-2.2.31-1.el5.x86_64 に必要とされています
# 
こんなかんじでありとあらゆるプログラムがopenssl-0.9.8eを使ってるので
互換性のないopenssl-1.xに差し替えることは事実上不可能だ。
そんなことをするくらいならRHEL7.xを新規導入した方がマシになる。

しかし既存の環境をTLS1.2にアップグレードしなければならないサイトは多いはず。
なのでTLS1.2をサポートするためにopensslとhttpdをソースからビルドしてRHEL5に導入してみる。

https://www.openssl.org/source/
2016年11月25日の最新版は
5058 2016-Nov-10 14:15:12 openssl-1.1.0c.tar.gz (SHA256) (PGP sign) (SHA1)
5183 2016-Sep-26 10:04:14 openssl-1.0.2j.tar.gz (SHA256) (PGP sign) (SHA1)

https://httpd.apache.org/
Apache HTTP Serverの最新は
Apache httpd 2.4.23 Released

openssl-1.1.0cに2.4.23がまだ対応できてないとかで、openssl-1.0.2jを使う。

openssl-1.0.2jをconfigするのにperl-5.10以上が必要なのだけどRHEL5はperl-5.8.8なので ソースから最新のperl-5.24.0をビルドして導入した。

/usr/local/など他のプログラムと競合するディレクトリは避ける。/opt/openssl-1.0.2j/に導入してみる。

./config --prefix=/opt/openssl-1.0.2j --openssldir=/opt/openssl-1.0.2j shared
make clean;make;make installして導入。

次はhttpd 2.4.23

環境変数の設定はこんな。
/home/hoge/src/C_httpd-2.4.23.setEnv

export PKG_CONFIG_PATH=/opt/openssl-1.0.2j
export LIBS=-ldl
export LDFLAGS="-lssl -lcrypto -ldl"
export LD_LIBRARY_PATH=/opt/openssl-1.0.2j/lib
export CPPFLAGS="-I/opt/openssl-1.0.2j/include"
./configure -prefix=/opt/httpd-2.4.23_openssl-1.0.2j \
--enable-ssl=shared \
--with-ssl=/opt/openssl-1.0.2j \
--with-mpm=prefork --enable-modules="all" \
--enable-mods-shared="most" \
--with-included-apr
make;make installして導入。

/opt/httpd-2.4.23_openssl-1.0.2j/conf/httpd.conf

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

オレオレ証明書とパスワード無しのキー証明書を配置。

server.crtの代りにserver_cert.pemを、
server.keyの代りにserver_key_nopass.pemを、
server-ca.crtの代りにcacert.pemを置くだけ。

#SSLCertificateFile "/opt/httpd-2.4.23_openssl-1.0.2j/conf/server.crt"
SSLCertificateFile "/opt/httpd-2.4.23_openssl-1.0.2j/conf/server_cert.pem"

#SSLCertificateKeyFile "/opt/httpd-2.4.23_openssl-1.0.2j/conf/server.key"
SSLCertificateKeyFile "/opt/httpd-2.4.23_openssl-1.0.2j/conf/server_key_nopass.pem"

#SSLCertificateChainFile "/opt/httpd-2.2.31_openssl-1.0.2j/conf/server-ca.crt"
SSLCertificateChainFile "/opt/httpd-2.2.31_openssl-1.0.2j/conf/cacert.pem"

/opt/httpd-2.4.23_openssl-1.0.2j/bin/apachectl startする前に 環境変数(LD_LIBRARY_PATH)が必要。

# export LD_LIBRARY_PATH=/opt/openssl-1.0.2j/lib


ブラウザでhttpsで接続してTLS1.2を確認。

export PKG_CONFIG_PATH=/opt/openssl-1.1.0c
export LIBS=-ldl
export LDFLAGS="-lssl -lcrypto -ldl"
export LD_LIBRARY_PATH=/opt/openssl-1.1.0c/lib
export CPPFLAGS="-I/opt/openssl-1.1.0c/include"
/configure -prefix=/opt/httpd-2.4.23_openssl-1.1.0c \
--enable-ssl=shared \
--with-ssl=/opt/openssl-1.1.0c \
--with-mpm=prefork --enable-modules="all" \
--enable-mods-shared="most" \
--with-included-apr

--with-included-aprを使うので、 ./srclibの下に最新のapr-1.5.2.tar.gzを展開してディレクトリ名をapr-1.5.2からaprに直す。 apr-util-1.5.4.tar.gzも展開してapr-util-1.5.4をapr-utilに変更する。

/home/hoge/src/httpd-2.4.23/srclib/apr/libtool --silent --mode=compile gcc -std=gnu99 -I/opt/openssl-1.1.0c/include  -g -O2 -pthread      -DLINUX -D_REENTRANT -D_GNU_SOURCE  -I/opt/openssl-1.0.2j/include \
	      -I. -I/home/hoge/src/httpd-2.4.23/os/unix -I/home/hoge/src/httpd-2.4.23/include -I/home/hoge/src/httpd-2.4.23/srclib/apr/include -I/home/hoge/src/httpd-2.4.23/srclib/apr-util/include -I/usr/local/include -I/home/hoge/src/httpd-2.4.23/modules/aaa -I/home/hoge/src/httpd-2.4.23/modules/cache -I/home/hoge/src/httpd-2.4.23/modules/core -I/home/hoge/src/httpd-2.4.23/modules/database -I/home/hoge/src/httpd-2.4.23/modules/filters -I/home/hoge/src/httpd-2.4.23/modules/ldap -I/home/hoge/src/httpd-2.4.23/modules/loggers -I/home/hoge/src/httpd-2.4.23/modules/lua -I/home/hoge/src/httpd-2.4.23/modules/proxy -I/home/hoge/src/httpd-2.4.23/modules/session -I/home/hoge/src/httpd-2.4.23/modules/ssl -I/home/hoge/src/httpd-2.4.23/modules/test -I/home/hoge/src/httpd-2.4.23/server -I/home/hoge/src/httpd-2.4.23/modules/arch/unix -I/home/hoge/src/httpd-2.4.23/modules/dav/main -I/home/hoge/src/httpd-2.4.23/modules/generators -I/home/hoge/src/httpd-2.4.23/modules/mappers  -prefer-non-pic -static -c ab.c && touch ab.lo
ab.c: In function 'main':
ab.c:2357: warning: implicit declaration of function 'SSLv2_client_method'
ab.c:2357: warning: assignment makes pointer from integer without a cast
ab.c:2365: warning: 'TLSv1_1_client_method' is deprecated (declared at /opt/openssl-1.1.0c/include/openssl/ssl.h:1604)
ab.c:2367: warning: 'TLSv1_2_client_method' is deprecated (declared at /opt/openssl-1.1.0c/include/openssl/ssl.h:1610)
ab.c:2370: warning: 'TLSv1_client_method' is deprecated (declared at /opt/openssl-1.1.0c/include/openssl/ssl.h:1598)
ab.c:2416: warning: implicit declaration of function 'CRYPTO_malloc_init'
/home/hoge/src/httpd-2.4.23/srclib/apr/libtool --silent --mode=link gcc -std=gnu99  -g -O2 -pthread   -L/opt/openssl-1.1.0c/lib -lssl -lcrypto -luuid -lrt -lcrypt -lpthread  \
	        -ldl -o ab  ab.lo      /home/hoge/src/httpd-2.4.23/srclib/apr-util/libaprutil-1.la -lexpat /home/hoge/src/httpd-2.4.23/srclib/apr/libapr-1.la -luuid -lrt -lcrypt -lpthread -lm
ab.o: In function `main':
/home/hoge/src/httpd-2.4.23/support/ab.c:2416: undefined reference to `CRYPTO_malloc_init'
/home/hoge/src/httpd-2.4.23/support/ab.c:2357: undefined reference to `SSLv2_client_method'
collect2: ld returned 1 exit status
make[2]: *** [ab] エラー 1
make[2]: ディレクトリ `/home/hoge/src/httpd-2.4.23/support' から出ます
make[1]: *** [all-recursive] エラー 1
make[1]: ディレクトリ `/home/hoge/src/httpd-2.4.23/support' から出ます
make: *** [all-recursive] エラー 1
こんなエラーになる。httpd-2.4.23はopenssl-1.1.0cに対応できてないw

C_httpd-2.2.31.setEnv

export PKG_CONFIG_PATH=/opt/openssl-1.0.2j
export LIBS=-ldl
export LDFLAGS="-L/opt/openssl-1.0.2j/lib -lssl -lcrypto -ldl"
export LD_LIBRARY_PATH=/opt/openssl-1.0.2j/lib
export CPPFLAGS="-I/opt/openssl-1.0.2j/include"
./configure -prefix=/opt/httpd-2.2.31_openssl-1.0.2j \
--enable-ssl=shared \
--with-ssl=/opt/openssl-1.0.2j \
--with-mpm=prefork --enable-modules="all" \
--enable-mods-shared="most" \
--with-included-apr

make clean;make;make install

/opt/httpd-2.2.31_openssl-1.0.2j/conf/httpd.conf

Include conf/extra/httpd-ssl.conf
2.2.31もTLS1.2が喋れるようになった。
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384、鍵長 256 bit、TLS 1.2

投稿されたコメント:

コメント
コメントは無効になっています。