してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

Apache 2.4.52のOpenSSL3.0系への対応について

OpenSSL 3.0系に対応するApache HTTPD 2.4系のリリースが秒読みに入ってきました。

そこで、リリース候補版のApache HTTPD 2.4.52リリースされたApache HTTPD 2.4.54で、OpenSSL 3.0系を実際に使ってみようかと思います。

OpenSSL 3.0.8のインストール方法

基本的に、「インストールするもの」で説明したとおりの方法で、ソースコードのtar.gzファイルからコンパイル、インストールができます。

$ cd ~/src
$ curl -O https://www.openssl.org/source/openssl-3.0.8.tar.gz
$ gzip -dc openssl-3.0.8.tar.gz|tar xvf -
$ cd openssl-3.0.8
…(省略)…
$ ./config
…(省略)…
$ gmake depend
$ gmake
…(省略)…
$ sudo gmake install

続いてhttpdをインストールします。今回試した者は、リリース候補版(RC1)になります。なので、以下の手順は、正式リリースまでお待ち頂くことをオススメします。

こちらも、「インストールするもの」で説明したとおりの方法でOKです。

$ cd ~/src
$ wget hhttps://dlcdn.apache.org//httpd/httpd-2.4.56.tar.gz
…(省略)…
$ gzip -dc httpd-2.4.56.tar.gz |tar xvf -
…(省略)…
$ cd httpd-2.4.56
$ ./configure --enable-ssl --enable-ssl-staticlib-deps --enable-so --enable-http2  --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr/bin/apu-1-config --with-include-apr=/usr/local/apr/include/ --enable-mpms-shared=all --with-ssl=/usr/local --with-nghttp2=/usr/local/

…(省略)…
$ gmake
…(省略)…
$ sudo gmake install

コンパイル自体は、従来通りの方法で問題無いので、再起動します。

# /usr/local/apache2/bin/apachctl -t
Syntax OK
# /usr/local/apache2/bin/apachctl stop
# /usr/local/apache2/bin/apachctl start

とします。私の環境では、Syntax OKと出たので、Apacheのhttpd.confの設定自体を変更すること無く、OpenSSL 3.0.3に移行できました。

HTTP/2のnghttpのライブラリも特にいじる必要はありません。Apacheでは、HTTP/2のTLS部分をmod_sslが担っているため、今回のmod_sslの修正が肝となる感じですね。

OpenSSL1.1系以前のAPIを使ったモジュールについて

コンパイル自体は、従来通りの方法で問題無いのですが、自作のモジュール内で、OpenSSLのAPI関数を使用している場合、注意が必要です(そんな人あまり居ないと思いますが・・・)。

OpenSSL 1.1系以前から、OpenSSL 3.0系に移植した際に行った修正は、以下の通りです。

私が修正したものは、

EVP_PKEY_get0_RSA(OpenSSL3.0では非推奨の関数)の戻り値の型

修正前:
RSA* rsa =EVP_PKEY_get0_RSA(pkey);
⇒修正後:
const rsa_st* rsa =EVP_PKEY_get0_RSA(pkey);

EVP_PKEY_get0_EC_KEY(OpenSSL3.0では非推奨の関数)の戻り値の型

修正前:
EC_KEY *ec = EVP_PKEY_get0_EC_KEY(pkey);
⇒修正後:
const ec_key_st* ec = EVP_PKEY_get0_EC_KEY(pkey);

コールバック関数の定義バグの修正

CRYPTO_get_ex_new_indexの引数5個目の間違っていた定義がOpenSSL3.0で修正された影響

修正前:
typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from,
                           void *from_d, int idx, long argl, void *argp);
⇒修正後:
typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from,
                           void **from_d, int idx, long argl, void *argp);
↑の修正後の定義に基づいて、コールバック関数を書き直します。

の以上の修正でワーニングは出るもののコンパイルは通りました。

EVP_PKEY_get0_RSA関数や、EVP_PKEY_get0_EC_KEY関数自体が、廃止の方向なので、少しずつこの部分を修正していこうと思います。

NEXT >> OpenSSL3.0.0について

©Copyrights 2015-2023, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。