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
|
|