🦔

OpenSSLソースのビルド&インストールガイド

2023/07/06に公開

検証環境

  • ホスト

    • 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

クイックインストール(※留意事項あり)

コマンドの 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の標準共有ライブラリパスを参照するため、同じくソースインストールした libssllibcrypto の共有ライブラリを使用しません。
その結果、ソースインストールした openssl コマンドを実行するとエラーが発生したり、異なるバージョンのパッケージライブラリの libssllibcrypto を参照する可能性があります。
この問題を解決するためには、「構成スクリプトオプション」の「-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

下記の出力結果から、共有ライブラリの libssllibcrypto が見つからないことがわかります。

# 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