OpenSSLソースのビルド&インストールガイド
検証環境
-
ホスト
- CPU: Apple M1 Pro
- macOS 13.4.1
- Docker Desktop v4.20.1
-
ゲスト(Docker image)
- Amazon Linux 2 (amazonlinux:2)
- Amazon Linux 2023 (amazonlinux:2023)
- Red Hat Enterprise Linux 8 (redhat/ubi8)
- Red Hat Enterprise Linux 9 (redhat/ubi9)
- Ubuntu 20.04 (ubuntu:20.04)
- Ubuntu 22.04 (ubuntu:22.04)
-
OpenSSL
- Source
- 3.1
- 3.0
- 1.1.1
- Package
- 3.0
- Amazon Linux 2023
- Red Hat Enterprise Linux 9
- Ubuntu 22.04
- 1.1.1
- Red Hat Enterprise Linux 8
- Ubuntu 20.04
- 1.0.2
- Amazon Linux 2
- 3.0
- Source
クイックインストール(※留意事項あり)
コマンドの openssl
は /usr/local/bin
にインストールされます。また、共有ライブラリの libssl
および libcrypto
は /usr/local/lib
または /usr/local/lib64
にインストールされます。
3.0, 3.1の場合
# curl -O https://www.openssl.org/source/openssl-3.1.1.tar.gz
# tar zxvf openssl-3.1.1.tar.gz
# cd openssl-3.1.1
# ./Configure
# make
# make install
1.1.1の場合
# curl -O https://www.openssl.org/source/openssl-1.1.1u.tar.gz
# tar zxvf openssl-1.1.1u.tar.gz
# cd openssl-1.1.1u
# ./config
# make
# make install
留意事項1
クイックインストールでは、ソースインストールした openssl
コマンドは、OSの標準共有ライブラリパスを参照するため、同じくソースインストールした libssl
と libcrypto
の共有ライブラリを使用しません。
その結果、ソースインストールした openssl
コマンドを実行するとエラーが発生したり、異なるバージョンのパッケージライブラリの libssl
と libcrypto
を参照する可能性があります。
この問題を解決するためには、「構成スクリプトオプション」の「-Wl,-rpath,$(LIBRPATH)」を参照してください。
共有ライブラリが見つけられずエラーになるケース
例:Red Hat Enterprise Linux 8 に OpenSSL 3.1 をソースインストール
ソースインストールしたライブラリは /usr/local/lib に存在しますが、コマンド openssl
を実行するとエラーが発生します。
# ls -l /usr/local/lib | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 9502302 Jun 29 14:52 libcrypto.a
lrwxrwxrwx 1 root root 14 Jun 29 14:52 libcrypto.so -> libcrypto.so.3
-rwxr-xr-x 1 root root 5177584 Jun 29 14:52 libcrypto.so.3
-rw-r--r-- 1 root root 1266612 Jun 29 14:52 libssl.a
lrwxrwxrwx 1 root root 11 Jun 29 14:52 libssl.so -> libssl.so.3
-rwxr-xr-x 1 root root 793608 Jun 29 14:52 libssl.so.3
# /usr/local/bin/openssl version
/usr/local/bin/openssl: error while loading shared libraries: libssl.so.3: cannot open shared object file: No such file or directory
下記の出力結果から、共有ライブラリの libssl
と libcrypto
が見つからないことがわかります。
# ldd /usr/local/bin/openssl
linux-vdso.so.1 (0x0000ffff98ee3000)
libssl.so.3 => not found
libcrypto.so.3 => not found
libdl.so.2 => /lib64/libdl.so.2 (0x0000ffff98e84000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000ffff98e4f000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff98cd9000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff98ea5000)
パッケージの共有ライブラリを参照しバージョン違いでエラーになるケース
例:Ubuntu 22.04(検証時のパッケージOpenSSL最新が3.0.2) に OpenSSL 3.1.1 をソースインストール
ソースインストールしたライブラリは /usr/local/lib
に存在します。
# ls -l /usr/local/lib | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 9767734 Jun 29 15:25 libcrypto.a
lrwxrwxrwx 1 root root 14 Jun 29 15:25 libcrypto.so -> libcrypto.so.3
-rwxr-xr-x 1 root root 5156648 Jun 29 15:25 libcrypto.so.3
-rw-r--r-- 1 root root 1308108 Jun 29 15:25 libssl.a
lrwxrwxrwx 1 root root 11 Jun 29 15:25 libssl.so -> libssl.so.3
-rwxr-xr-x 1 root root 792024 Jun 29 15:25 libssl.so.3
パッケージでインストールしたOpenSSLのバージョンは次のとおりで、共有ライブラリは /usr/lib/aarch64-linux-gnu
に存在します。
# /usr/bin/openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
# ls -l /usr/lib/aarch64-linux-gnu | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 4032672 May 24 17:12 libcrypto.so.3
-rw-r--r-- 1 root root 630720 May 24 17:12 libssl.so.3
# ldd /usr/bin/openssl
linux-vdso.so.1 (0x0000ffffb0d83000)
libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffb0ba0000)
libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffffb07b0000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffb0600000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb0d4a000)
ソースインストールしたコマンドを実行すると、次のエラーが発生します。
# /usr/local/bin/openssl version
/usr/local/bin/openssl: /lib/aarch64-linux-gnu/libcrypto.so.3: version `OPENSSL_3.0.9' not found (required by /usr/local/bin/openssl)
下記の出力から、共有ライブラリの libssl
および libcrypto
の参照先がパッケージでインストールされたライブラリであることがわかります。
# ldd /usr/local/bin/openssl
/usr/local/bin/openssl: /lib/aarch64-linux-gnu/libcrypto.so.3: version `OPENSSL_3.0.9' not found (required by /usr/local/bin/openssl)
linux-vdso.so.1 (0x0000ffffbd440000)
libssl.so.3 => /lib/aarch64-linux-gnu/libssl.so.3 (0x0000ffffbd250000)
libcrypto.so.3 => /lib/aarch64-linux-gnu/libcrypto.so.3 (0x0000ffffbce60000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffbccb0000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffbd407000)
以上より、ソースインストールしたバージョン(3.1.1)とパッケージインストールしたバージョン(3.0.2)が異なるためにエラーが発生していることがわかります。(3.1.1をインストールしたのに3.0.9が見つからないとエラーメッセージに出ている点については「バージョンが異なるパッケージの共有ライブラリを参照して動作するケース」を参照して下さい)
バージョンが異なるパッケージの共有ライブラリを参照して動作するケース
例: Amazon Linux 2023(検証時のパッケージOpenSSL最新が3.0.8) に OpenSSL 3.1.0 をソースインストール
ソースインストールしたライブラリは /usr/local/lib
に存在します。
# ls -l /usr/local/lib | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 9477358 Jun 29 16:35 libcrypto.a
lrwxrwxrwx 1 root root 14 Jun 29 16:35 libcrypto.so -> libcrypto.so.3
-rwxr-xr-x 1 root root 5207992 Jun 29 16:35 libcrypto.so.3
-rw-r--r-- 1 root root 1267540 Jun 29 16:35 libssl.a
lrwxrwxrwx 1 root root 11 Jun 29 16:35 libssl.so -> libssl.so.3
-rwxr-xr-x 1 root root 852992 Jun 29 16:35 libssl.so.3
パッケージでインストールしたOpenSSLのバージョンは次のとおりで、共有ライブラリは /usr/lib64
に存在します。
# /usr/bin/openssl version
OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
# ls -l /usr/lib64 | grep -e libssl -e libcrypto
lrwxrwxrwx 1 root root 18 Feb 15 14:45 libcrypto.so.3 -> libcrypto.so.3.0.8
-rwxr-xr-x 1 root root 4304736 Feb 15 14:45 libcrypto.so.3.0.8
lrwxrwxrwx 1 root root 15 Feb 15 14:45 libssl.so.3 -> libssl.so.3.0.8
-rwxr-xr-x 1 root root 750840 Feb 15 14:45 libssl.so.3.0.8
# ldd /usr/bin/openssl
linux-vdso.so.1 (0x0000ffff9c23e000)
libssl.so.3 => /lib64/libssl.so.3 (0x0000ffff9c033000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x0000ffff9bc1d000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff9ba4f000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff9c1f1000)
libz.so.1 => /lib64/libz.so.1 (0x0000ffff9ba0e000)
ソースインストールしたコマンドを実行すると、正常に終了しますが、コマンドのバージョンとライブラリのバージョンには差異があります。
# /usr/local/bin/openssl version
OpenSSL 3.1.0 14 Mar 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)
下記の出力から、共有ライブラリの libssl
および libcrypto
はパッケージでインストールされたバージョンを参照していることがわかります。
# ldd /usr/local/bin/openssl
linux-vdso.so.1 (0x0000ffff897f2000)
libssl.so.3 => /lib64/libssl.so.3 (0x0000ffff896f1000)
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x0000ffff892db000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff8910d000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff897a5000)
libz.so.1 => /lib64/libz.so.1 (0x0000ffff890cc000)
OpenSSLの3系では、マイナーバージョンが異なってもリリース時期や改版内容が同じであれば、動作する可能性があります(ただし、正常に動作するかどうかは未検証です)。したがって、ソースのバージョンが3.1.1であっても、パッケージのバージョンが3.0.9であれば、ソースのコマンド openssl
でエラーは発生しないと考えられます。
留意事項2
構成スクリプトはRedHat系のマルチライブラリインストール(/usr/local/lib
もしくは /usr/local/lib64
)に対応していますが、64ビット環境でもx86_64アーキテクチャでは /usr/local/lib64
に、aarch64アーキテクチャでは /usr/local/lib
にインストールされます。
したがって、Apacheなどをソースビルドする際にOpenSSLの共有ライブラリパスを渡す場合は注意が必要です。
対処法としては、「構成スクリプトオプション」の「--libdir=DIR」を参照してください。
構成スクリプトオプション
-Wl,-rpath,$(LIBRPATH)
構成スクリプトのオプションとして-Wl,-rpath,$(LIBRPATH)
を使用することで、Makefileにソースインストールされる共有ライブラリのパスを渡すことができます。
3.0, 3.1の場合
# ./Configure '-Wl,-rpath,$(LIBRPATH)'
# make
# make install
# /usr/local/bin/openssl version
OpenSSL 3.1.1 30 May 2023 (Library: OpenSSL 3.1.1 30 May 2023)
# ldd /usr/local/bin/openssl
linux-vdso.so.1 (0x0000ffff8a5d2000)
libssl.so.3 => /usr/local/lib64/libssl.so.3 (0x0000ffff8a4d0000)
libcrypto.so.3 => /usr/local/lib64/libcrypto.so.3 (0x0000ffff8a07a000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffff89eac000)
/lib/ld-linux-aarch64.so.1 (0x0000ffff8a585000)
1.1.1の場合
# ./config '-Wl,-rpath,$(LIBRPATH)'
# make
# make install
# /usr/local/bin/openssl version
OpenSSL 1.1.1u 30 May 2023
# ldd /usr/local/bin/openssl
linux-vdso.so.1 (0x0000ffffa3fa5000)
libssl.so.1.1 => /usr/local/lib64/libssl.so.1.1 (0x0000ffffa3ec3000)
libcrypto.so.1.1 => /usr/local/lib64/libcrypto.so.1.1 (0x0000ffffa3c0c000)
libc.so.6 => /lib64/libc.so.6 (0x0000ffffa3a5e000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffa3f68000)
--libdir=DIR
共有ライブラリのインストール先を指定できます。
3.0, 3.1の場合
# ./Configure --libdir=/usr/local/hoge
# make
# make install
# ls -l /usr/local/hoge | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 9477518 Jul 4 13:04 libcrypto.a
lrwxrwxrwx 1 root root 14 Jul 4 13:04 libcrypto.so -> libcrypto.so.3
-rwxr-xr-x 1 root root 5207944 Jul 4 13:04 libcrypto.so.3
-rw-r--r-- 1 root root 1267756 Jul 4 13:04 libssl.a
lrwxrwxrwx 1 root root 11 Jul 4 13:04 libssl.so -> libssl.so.3
-rwxr-xr-x 1 root root 852992 Jul 4 13:04 libssl.so.3
1.1.1の場合
# ./config --libdir=/usr/local/hoge
# make
# make install
# ls -l /usr/local/hoge | grep -e libssl -e libcrypto
-rw-r--r-- 1 root root 5371836 Jul 2 06:05 libcrypto.a
lrwxrwxrwx 1 root root 16 Jul 2 06:05 libcrypto.so -> libcrypto.so.1.1
-rwxr-xr-x 1 root root 3154904 Jul 2 06:05 libcrypto.so.1.1
-rw-r--r-- 1 root root 1001634 Jul 2 06:05 libssl.a
lrwxrwxrwx 1 root root 13 Jul 2 06:05 libssl.so -> libssl.so.1.1
-rwxr-xr-x 1 root root 702880 Jul 2 06:05 libssl.so.1.1
--prefix=DIR
bin
, lib
, include
, share/man
, share/doc/openssl
ディレクトリを含むOpenSSLインストールの接頭辞です。
これがMakefileの INSTALLTOP
の値になります。(デフォルト: /usr/local
)
3.0, 3.1の場合
# ./Configure --prefix=/usr/local/hoge
# make
# make install
# ls -l /usr/local/hoge
total 20
drwxr-xr-x 2 root root 4096 Jul 4 22:59 bin
drwxr-xr-x 3 root root 4096 Jul 4 22:59 include
drwxr-xr-x 5 root root 4096 Jul 4 22:59 lib
drwxr-xr-x 4 root root 4096 Jul 4 23:00 share
drwxr-xr-x 5 root root 4096 Jul 4 22:59 ssl
1.1.1の場合
# ./config --prefix=/usr/local/hoge
# make
# make install
# ls -l /usr/local/hoge
total 20
drwxr-xr-x 2 root root 4096 Jul 4 22:59 bin
drwxr-xr-x 3 root root 4096 Jul 4 22:59 include
drwxr-xr-x 5 root root 4096 Jul 4 22:59 lib
drwxr-xr-x 4 root root 4096 Jul 4 23:00 share
drwxr-xr-x 5 root root 4096 Jul 4 22:59 ssl
--openssldir=DIR
openssl.cnf、証明書、鍵などのOpenSSLのデータディレクトリを指定します。相対ディレクトリの場合は --prefix
で指定したディレクトリに追加されます。これがMakefileやC言語の OPENSSLDIR
の値になります。(デフォルト: PREFIX/ssl
)
3.0, 3.1の場合
# ./Configure --openssldir=/usr/local/etc/hoge
# make
# make install
# ls -l /usr/local/etc/hoge
total 52
drwxr-xr-x 2 root root 4096 Jul 4 13:04 certs
-rw-r--r-- 1 root root 412 Jul 4 13:04 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 4 13:04 ct_log_list.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 4 13:04 misc
-rw-r--r-- 1 root root 12324 Jul 4 13:04 openssl.cnf
-rw-r--r-- 1 root root 12324 Jul 4 13:04 openssl.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 4 13:04 private
1.1.1の場合
# ./config --openssldir=/usr/local/etc/hoge
# make
# make install
# ls -l /usr/local/etc/hoge
total 44
drwxr-xr-x 2 root root 4096 Jul 2 06:05 certs
-rw-r--r-- 1 root root 412 Jul 2 06:05 ct_log_list.cnf
-rw-r--r-- 1 root root 412 Jul 2 06:05 ct_log_list.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 2 06:05 misc
-rw-r--r-- 1 root root 10909 Jul 2 06:05 openssl.cnf
-rw-r--r-- 1 root root 10909 Jul 2 06:05 openssl.cnf.dist
drwxr-xr-x 2 root root 4096 Jul 2 06:05 private
Makeターゲット
install_sw
bin
, lib
, include
のソフトウェアファイルをインストールします。
install_ssldirs
openssl.cnf、証明書、鍵などのOpenSSLのデータディレクトリおよびファイルをインストールします。
install_docs
share/man
, share/doc/openssl
のドキュメントファイルをインストールします。
install
install_sw
, install_ssldirs
, install_docs
を全て実行します。
uninstall_docs
share/man
, share/doc/openssl
のドキュメントファイルをアンインストールします(空になる場合インストール先のディレクトリも削除されます)
uninstall_sw
bin
, lib
, include
のソフトウェアファイルをアンインストールします(空になる場合インストール先のディレクトリも削除されます)
uninstall
uninstall_docs
, uninstall_sw
を全て実行します。
その他
- Apacheソースのビルドとは異なり、
config.nice
というものが残りませんので、構成スクリプト実行時には別途スクリプトを用意してオプションを記録しておくと後々便利です。
Discussion