絖綛 N@i.jp  昨日:00031073
 今日:00001678
 総計:00032751
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:04/16 19:55


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

OpenSSL 3.1 に移行してみよう

参照:OpenSSL


OpenSSL 1.1.1系は今年9月でサポート終了


 ウチのWebサーバー(Mac mini G4)では、これまで OpenSSL は 1.1.1系を使用してきた(現時点では1.1.1t が1.1.1系統の最新版)。ただ 1.1.1系は今年の9月11日でサポートが終了する。そのため、今のうちから OpenSSL 3.1系に移行しておこうと思う。現時点での最新版は3月14日にリリースとなった OpenSSL 3.1.0だ。

1. ダウンロードして解凍

 OpenSSLのDownloadsから "openssl-3.1.0.tar.gz" をダウンロードして解凍する。

$ tar xvzf openssl-3.1.0.tar.gz
$ cd openssl-3.1.0

2. Configurationsファイルの修正

 ウチで使用している gcc は自力でビルドしたものなのだが、クロスコンパイル機能が無効化されているのだったか、-archオプションが使用できない(↓)。

$ gcc -arch ppc a.c
gcc: エラー: unrecognized command line option '-arch'

 しかし OpenSSL 3.1 はビルドで -archオプションを指定してくるので、このままではコンパイルエラーになってしまう。これを防ぐため Configurationsファイルを修正する。修正するのは "Configurations/10-main.conf"。修正個所は、1716行からの以下の部分。

    "darwin-ppc" => {
        inherit_from     => [ "darwin-common" ],
        cflags           => add("-arch ppc -std=gnu9x -Wa,-force_cpusubtype_ALL"),
        lib_cppflags     => add("-DB_ENDIAN"),
        shared_cflag     => add("-fno-common"),
        asm_arch         => 'ppc32',
        perlasm_scheme   => "osx32",
    },

上記 "cflags" に指定されている "-arch ppc" オプションを削除する。

    "darwin-ppc" => {
        inherit_from     => [ "darwin-common" ],
        cflags           => add("-std=gnu9x -Wa,-force_cpusubtype_ALL"),
        lib_cppflags     => add("-DB_ENDIAN"),
        shared_cflag     => add("-fno-common"),
        asm_arch         => 'ppc32',
        perlasm_scheme   => "osx32",
    },

gcc が -archオプションを受け入れるようなら上記修正は不要。

3. crash ログ抑止

 OpenSSLと言えば昔からcrashログが大量に吐かれる という問題があり、こんな対策を講じて いたりするのだが、これと同じソースが OpenSSL 3.1 でも使われている。そのため、OpenSSL 3.1 でも同じ対策を施すことにした。
 修正対象のソースは "crypto/ppccap.c"。修正個所は以下で、SIGILLを起こさず PPC G4 決め打ちにしている。

    memset(&ill_act, 0, sizeof(ill_act));
    ill_act.sa_handler = ill_handler;
    ill_act.sa_mask = all_masked;

    sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
    sigaction(SIGILL, &ill_act, &ill_oact);

#ifndef OSSL_IMPLEMENT_GETAUXVAL
    if (sigsetjmp(ill_jmp,1) == 0) {
        //OPENSSL_fpu_probe();
        OPENSSL_ppccap_P |= PPC_FPU;

        if (sizeof(size_t) == 4) {
# ifdef __linux
            struct utsname uts;
            if (uname(&uts) == 0 && strcmp(uts.machine, "ppc64") == 0)
# endif
                /*
                if (sigsetjmp(ill_jmp, 1) == 0) {
                    OPENSSL_ppc64_probe();
                    OPENSSL_ppccap_P |= PPC_FPU64;
                }
                */
        } else {
            /*
             * Wanted code detecting POWER6 CPU and setting PPC_FPU64
             */
        }
    }

    if (sigsetjmp(ill_jmp, 1) == 0) {
        //OPENSSL_altivec_probe();
        OPENSSL_ppccap_P |= PPC_ALTIVEC;
        /*
        if (sigsetjmp(ill_jmp, 1) == 0) {
            OPENSSL_crypto207_probe();
            OPENSSL_ppccap_P |= PPC_CRYPTO207;
        }
        */
    }
    /*
    if (sigsetjmp(ill_jmp, 1) == 0) {
        OPENSSL_madd300_probe();
        OPENSSL_ppccap_P |= PPC_MADD300;
    }
    */
#endif
    /*
    if (sigsetjmp(ill_jmp, 1) == 0) {
        OPENSSL_rdtsc_mftb();
        OPENSSL_ppccap_P |= PPC_MFTB;
    } else if (sigsetjmp(ill_jmp, 1) == 0) {
        OPENSSL_rdtsc_mfspr268();
        OPENSSL_ppccap_P |= PPC_MFSPR268;
    }
    */
    sigaction(SIGILL, &ill_oact, NULL);
    sigprocmask(SIG_SETMASK, &oset, NULL);

4. ビルドスクリプト

 ビルド用のスクリプト "build.sh" を作成する。内容はこんな感じ。
#!/usr/local/bin/bash -x

export MACOSX_DEPLOYMENT_TARGET=10.4
export GCC="/usr/local"
export SSL="/usr/local/ssl3"
export PATH="${GCC}/bin:${PATH}"
export DYLD_LIBRARY_PATH="${GCC}/lib:${DYLD_LIBRARY_PATH}"
export OPTFLAGS="-O2 -mpowerpc -mcpu=7450 -maltivec"

./Configure \
    --prefix="${SSL}" \
    --openssldir="${SSL}" \
    darwin-ppc-cc \
    shared \
    no-asm \
    no-async \
    no-threads \
    no-ssl3 \
    CC="${GCC}/bin/gcc" \
    CPP="${GCC}/bin/cpp" \
    CPPFLAGS="-I/usr/local/include -I/usr/include -DOPENSSL_NO_APPLE_CRYPTO_RANDOM" \
    CFLAGS="${OPTFLAGS} -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET}" \
    LDFLAGS="-L/usr/local/lib -L/usr/lib"
make
make test >check.log

注)「¥」は実際には半角の「\」(バックスラッシュ)

 ウチの環境には OpenSSL 1.1.1系と LibreSSL もインストールされているので、それらと干渉しないよう "/usr/local/ssl3" 配下にインストールするようにしている。
 また(ビルドが失敗するので)アセンブリソースは使用しないよう no-asm も指定した。
 CPPFLAGSに指定している -DOPENSSL_NO_APPLE_CRYPTO_RANDOM は MacOS の疑似乱数発生機能を使わないようにするものなのだが、ウチのような古〜い MacOS X にはそのような機能がないので止むを得ず指定している。普通は指定する必要はない(指定しない方が良い)ので注意。

5. ビルドしてインストール

$ chmod +x build.sh
$ ./build.sh
$ sudo make install


< 過去の記事 [ 3月の 全てのカテゴリ リスト ] 新しい記事 >

2023 calendar
3月
1234
567891011
12131415161718
19202122232425
262728293031


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.