September 28, 2023

CentOS 7でOpenSSL LTS 3.0.xを使う

概要

EoLまで1年もないCentOS 7は新OSに変えるのが正道だけど、2023/09/11にEoLを迎えたOpenSSL 1.1.1の代わりにOpenSSL 3.0.0が使えるか調べてみた。

Bing AIに聞いたら、普通にビルドすれば使えるらしい、ホントかな…
→ホントだったよ!

※ OpenSSL 3.0.xのrpmを作るならこちら

用意したもの

最小セットアップしたCentOS 7.9

[nissy@cent7-openssl30x ~]$ sudo yum update
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
No packages marked for update
[nissy@cent7-openssl30x ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[nissy@cent7-openssl30x ~]$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

※ Dockerコンテナのcentos:7でも可
その場合、以降の手順でsudoは不要

手順

OpenSSL 1.1.1のときの手順を参考にする

パッケージ追加

[nissy@cent7-openssl30x ~]$ sudo yum install gcc perl perl-IPC-Cmd perl-Test-Simple

make test しない!ということなら perl-Test-Simple は入れなくていい

Dockerコンテナの場合はmakeも必要

[root@f16c64308500 ~]# yum install make gcc perl perl-IPC-Cmd perl-Test-Simple

ビルド

  1. ダウンロード
    公式サイトからOpenSSL 3.0.xのtgzをダウンロードする
    今回使ったのは3.0.11
    [nissy@cent7-openssl30x ~]$ curl -OL https://www.openssl.org/source/openssl-3.0.11.tar.gz
    
  2. 展開
    [nissy@cent7-openssl30x ~]$ tar xzf openssl-3.0.11.tar.gz
    
  3. ディレクトリ移動してビルド
    [nissy@cent7-openssl30x ~]$ cd openssl-3.0.11
    [nissy@cent7-openssl30x openssl-3.0.11]$ ./config
    

    Can't locate IPC/Cmd.pm と言われるならperl-IPC-Cmdが入っていない

    [nissy@cent7-openssl30x openssl-3.0.11]$ make -j$(nproc)
    
  4. ビルド成功したか確認
    [nissy@cent7-openssl30x openssl-3.0.11]$ make test
    略
    99-test_fuzz_server.t .............. ok
    99-test_fuzz_x509.t ................ ok
    All tests successful.
    Files=250, Tests=3349, 370 wallclock secs ( 8.76 usr  0.71 sys + 280.70 cusr 60.60 csys = 350.   77 CPU)
    Result: PASS
    make[1]: Leaving directory `/home/nissy/openssl-3.0.11'
    

    結構時間がかかるけど Result: PASS が表示されたら正常
    Can't locate Test/More.pm と言われるならperl-Test-Simpleが入ってない

  5. インストール
    [nissy@cent7-openssl30x openssl-3.0.11]$ sudo make install
    

    これも結構時間がかかる
    ちなみにアンインストールは sudo make uninstall

  6. インストールしたパスを共有ライブラリとして追加
    OpenSSL 1.1.1のときと同じように libssl.so.3 が見つからないので実行できない
    [nissy@cent7-openssl30x openssl-3.0.11]$ /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
    [nissy@cent7-openssl30x openssl-3.0.11]$ ldd /usr/local/bin/openssl
        linux-vdso.so.1 =>  (0x00007ffdae9e9000)
        libssl.so.3 => not found
        libcrypto.so.3 => not found
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fc31dc65000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc31da49000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fc31d67b000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fc31de69000)
    [nissy@cent7-openssl30x openssl-3.0.11]$ sudo ldconfig -p | grep libssl.so.3
    [nissy@cent7-openssl30x openssl-3.0.11]$
    

    追加

    # amd64の場合
    [nissy@cent7-openssl30x-amd64 openssl-3.0.11]$ sudo sh -c 'echo /usr/local/lib64 > /etc/ld.so.conf.d/local.conf'
    # arm64の場合
    [nissy@cent7-openssl30x-arm64 openssl-3.0.11]$ sudo sh -c 'echo /usr/local/lib > /etc/ld.so.conf.d/local.conf'
    # 以降はディレクトリ名にlib64かlibかの違いはあるけど、コマンドはamd64|arm64共通
    [nissy@cent7-openssl30x openssl-3.0.11]$ sudo ldconfig
    [nissy@cent7-openssl30x openssl-3.0.11]$ ldd /usr/local/bin/openssl
         linux-vdso.so.1 =>  (0x00007ffeda7fe000)
         libssl.so.3 => /usr/local/lib64/libssl.so.3 (0x00007f86bbfd4000)
         libcrypto.so.3 => /usr/local/lib64/libcrypto.so.3 (0x00007f86bb961000)
         libdl.so.2 => /lib64/libdl.so.2 (0x00007f86bb75d000)
         libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f86bb541000)
         libc.so.6 => /lib64/libc.so.6 (0x00007f86bb173000)
         /lib64/ld-linux-x86-64.so.2 (0x00007f86bc279000)
    [nissy@cent7-openssl30x openssl-3.0.11]$ sudo ldconfig -p | grep libssl.so.3
         libssl.so.3 (libc6,x86-64) => /usr/local/lib64/libssl.so.3
    
  7. 確認
    バージョン確認
    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/bin/openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/local/bin/openssl version
    OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
    

    TLSv1.3はOpenSSL 1.1.1からサポートされたので1.0.2kでは表示されないけど、

    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/bin/openssl version
    OpenSSL 1.0.2k-fips  26 Jan 2017
    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/bin/openssl ciphers -v 'ALL:COMPLEMENTOFALL' | grep TLSv1.3
    [nissy@cent7-openssl30x openssl-3.0.11]$ 
    

    3.0.11なら表示される

    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/local/bin/openssl version
    OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)
    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/local/bin/openssl ciphers -v 'ALL:COMPLEMENTOFALL' | grep TLSv1.3
    TLS_AES_256_GCM_SHA384         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(256)               Mac=AEAD
    TLS_CHACHA20_POLY1305_SHA256   TLSv1.3 Kx=any      Au=any   Enc=CHACHA20/POLY1305(256)    Mac=AEAD
    TLS_AES_128_GCM_SHA256         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(128)               Mac=AEAD
    

    s_clientの接続確認も、1.0.2ではTLSv1.2で繋がるけど、

    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/bin/openssl s_client -connect google.co.jp:443 < /dev/null 2> /dev/null | grep TLSv
    New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
        Protocol  : TLSv1.2
    

    3.0.11ならTLSv1.3で繋がる

    [nissy@cent7-openssl30x openssl-3.0.11]$ /usr/local/bin/openssl s_client -connect google.co.jp:443 < /dev/null 2> /dev/null | grep TLSv
    New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
    

© 2020 nissy-lab.com