2017年9月5日火曜日

【備忘録】Postfix 3.2.2 と Nginx 1.13.4 に LibreSSL を組み込んでコンパイルしてアップグレード

Postfix 3.2.0 with LibreSSL 2.4.3 --> Postfix 3.2.2 with Libre 2.5.5
Nginx 1.13.4 with LibreSSL 2.4.3 --> Nginx 1.13.4 with Libre 2.5.5

 にしたときの話です。サーバーは、Redhat EL6です。1点、困ったところがあったのでメモしたものを備忘録がてら公開します。

過去の導入については下記を参考にしてみてください。


LibreSSLの更新


最新版をダウンロードして

tar -xzvf libssl-2.5.5.tar.gz
cd libressl-2.5.5
make ditclean
./configure
make
sudo make install
sudo ldconfig

なんかで普通にインストールできます。
※一点、 ldconfig してライブラリ更新しておかないと、postfix  upgrade 時にエラー(後述)でアップグレードできないので注意。

標準では /usr/local/lib 以下に入ります。筆者は nginx と postfix で LibreSSLを使っています。 

動作中の Postfix への影響なし


ldd /usr/sbin/postfix | grep libssl
libssl.so.39 => /usr/local/lib/libssl.so.39 (◯◯)

と postfix で LibreSSL 2.4.3 (/usr/local/lib/libssl.so.39)を使っていた場合、LibreSSL 2.5.5をインストールしても /usr/local/lib/libssl.so.43 なので影響を受けません。もし、/usr/local/lib/libssl.so にリンクしているものがあれば、最新の 43にかわるので注意が必要です。

動作中の Nginx への影響


コンパイル時に
 --with-openssl=../libressl-2.3.2
のように、明示的に libressl のソースディレクトリを指定して組み込むため、影響を受けません。

というわけで、Postfix と Nginx ならば LibreSSLを更新しただけでは影響を受けませんし、組み込まれません。ので、次の作業が必要です。

Postfix 3.2.2 に LibreSSL 2.5.5 を組み込む


postfix において

src/tls/tls.h 

#include <openssl/ssl.h> の下に

#undef OPENSSL_VERSION_NUMBER
#define OPENSSL_VERSION_NUMBER  0x10000002L

を書いて、バージョンをごまかします。
OpenSSL決め打ちで指定されているのが原因であり、詳細は
のほうをみてください。

念のため、 /etc/postfix の設定ファイルをすべてバックアップしておいてください。

make makefiles CCARGS="-DUSE_TLS -I/usr/local/include"  AUXLIBS="-L/usr/local/lib -lssl -lcrypto -lz -ldl"
make
sudo make upgrade

です。
ここで LibreSSL の更新後に、 ldconfig をしていなければ
bin/postconf -dhx shlib_directory
bin/postconf: error while loading shared libraries: libssl.so.43: cannot open shared object file: No such file or directory

とでてアップグレードがコケるので注意。

成功したら
/etc/init.d/postfix restart
とpostfixを再起動しておけばOK.

あと 
ldd /usr/sbin/postfix  | grep libssl 
libssl.so.43 => /usr/local/lib/libssl.so.43 (◯◯)

ってなっていたら、 新しい LibreSSLが使えるようになってます。

Nginx 1.13.4 に LibreSSL 2.5.5 を組み込む


違う所は、libressl のソース場所が異なる所です。

こういうのは自動化しておかないと超面倒なのでそうしておきましょう。
一応書き出しておきます。

Step 1  LibreSSLのソースに設定を加える


cd libressl-2.5.5
mkdir .openssl
cd .openssl
ln -s ../include .
mkdir lib
cp ../crypto/.libs/libcrypto.a lib
cp ../ssl/.libs/libssl.a lib
cd lib
strip -g libcrypto.a
strip -g libssl.a

というおまじないをしておきます。

Step 2  コンパイルオプションにいくつか追加


./configure 
... 
... 
--with-openssl= [nginxのコンパイル場所からみて、libresslソースのディレクトリ]/libressl-2.5.5  \
--with-ld-opt="-lrt" 

の2つを入れます。

で、./configure を実行

touch  libressl-2.5.5ソースディレクトリ/.openssl/include/openssl/ssl.h

と、ssl.h のタイムスタンプを ./configure をしたより後にしておいてください。
じゃないとエラーでます。

make

※念のため nginx の設定ファイルをバックアップ。

sudo make install

してあとは
/etc/init.d/nginx stop 
入れ替え作業(ソースからの場合にはロールバックできるように /usr/local/nginx-1.14.3 などバージョンごとに別フォルダにインストールして切り替えるのが普通かなと...)
/etc/init.d/nginx start

しておいて
nginx -V 
をして libresslが組み込まれていたらOK。

2017年9月5日 @kimipooh


0 件のコメント: