« アプリ一覧に戻る

RetroCert

PowerPC Mac (Tiger以降) 向け ソース公開中

Keychainが陳腐化してHTTPS接続に失敗するようになった古いMac向けの、ルート証明書レスキューツールです。署名付きの最新CA一覧をサーバーから取得して適用します。この機種はそもそもHTTPSが使えない場合もあるので、通信自体はHTTPでも構わない作りですが、その場合でも署名検証で改竄は検知します。

古いMac → RetroCertを起動 → サーバーから最新のCA一覧を取得 → Keychainへ反映 → HTTPS接続を再試行、という流れです。

RetroCert.zip をダウンロード
これまでのダウンロード数: 3
最終更新日: 2026-09-12(v1.0)
気になる方向けの署名ファイル:RetroCert.zip.sig(zip内に同梱された公開鍵で検証できます。手順はGitHubのREADMEを参照)。
※ Tiger標準のSafari/curlは現代のHTTPS証明書を検証できないため、ここから直接ダウンロードできない場合があります。当サイトでは Aquafox(当サイトが日本語化パックを配布しているPowerPC向けブラウザ)をおすすめします。現代のHTTPSも普通に扱えます。難しい場合は、現代のMacで取得してからコピーするか、Tigerbrew/MacPorts経由の新しいcurlをご利用ください。
⚠️ 過度な期待をする前に、これだけ読んでください RetroCertが直せるのは「証明書の失効・不足だけが原因で失敗しているサイト」だけです。実機のPowerMac G4のSafariで検証した結果、当サイト自身のVPS(TLS 1.0を許容する設定)は直った後に接続できましたが、apple.comのような一般的な現代のサイト(TLS 1.2/1.3・ECDHE専用構成)は接続できませんでした。これはTLSプロトコル・暗号スイート自体の不一致で、Tiger自身のSecureTransportの限界であり、証明書ツールでは解決できません。さらに、今実際にTiger世代のMacを使い続けている人の多くは、ブラウザ・メールをすでにAquafoxやThunderbirdに乗り換えていて、どちらもOSのKeychainとは別に自前の証明書ストアを持ち、最新のルート証明書を最初から内蔵しています。すでにAquafoxをお使いなら、おそらくこれは要りません。RetroCertの実際の対象は、あえて標準のSafari/Mail.appを使い続けている少数派です。

動作要件

  • Mac OS X 10.4 (Tiger) 以降、PowerPC。
  • 直したい機種にPython 3.12が必要です。まだ入っていない場合は、当サイトのTiger PowerPC向けPython 3.12ビルドで用意できます。

使い方

  1. 古いMac上で RetroCert.zip をダウンロードして解凍します(別の機種で解凍してフォルダごと転送してもOKです)。
  2. ターミナルを開き、解凍したフォルダに cd して実行します。
    python3.12 retrocert.py …… ドライラン。何が変わるか表示するだけで、実際には何も変更しません。
    python3.12 retrocert.py --apply …… 実際にログインKeychainへ証明書を反映します。
    python3.12 retrocert.py --apply --system …… システム全体へ反映します(sudoが必要)。
  3. 失敗していたサイトに再度アクセスしてください。上の注意書きの通り、本当に証明書だけが原因だった場合は繋がるはずです。

対応環境

動作確認PowerMac G4 / Mac OS X 10.4.11 (Tiger) / Python 3.12.11、当サイト自身の本番サーバーに対して確認済み
要件PowerPC Mac / Mac OS X 10.4 (Tiger) 以降 / Python 3.12

個人の趣味プロジェクトにつき無保証です。MITライセンス。ソースコード・発行者側のツール・設計の解説は上記のGitHubリポジトリにあります。

このプロジェクトの本題は「証明書を直す」こと自体(そこはよくある作業です)ではなく、プレーンなHTTP経由で取得した更新(証明書を直すまでHTTPS自体が使えない機種もあるので、鶏卵問題としてHTTPにも対応しています)を、それでも信用できる形にすることでした。

サーバーとは別のマシンで署名する

署名鍵は開発者の手元のマシンにしか存在せず、どこにもアップロードしません。そのマシンで manifest.json とクライアント配布アーカイブに署名し、署名済みの結果だけをVPSに上げます。VPS自体は秘密鍵を一切持たない、ただの静的ファイル配信サーバーです。RetroCertは、取得した内容を信用する前に、同梱の公開鍵で署名を検証します。ポイントは、VPSが完全に乗っ取られたとしても、攻撃者は正しい署名を作れないということです。改竄されたマニフェストや証明書ファイルは、通信経路がHTTPかHTTPSかに関わらず、クライアント側で拒否されます。個々の証明書ファイルも、検証済みマニフェスト内のSHA-256と照合するので、マニフェスト1つの署名検証で証明書一式全体をカバーできます。

依存ゼロの署名検証

client/verify.py は、hashlibpow()、そして自前の小さなASN.1 DERパーサーだけで、RSA-PKCS#1 v1.5 + SHA-256の署名検証を約90行で実装しています。cryptographypyOpenSSL は使っていません。古い・制約のあるPython環境で動かすのが目的なので、そもそもそれらを入れるのが現実的でない、という事情によるものです。

実機で分かったこと

証明書は直っても、現代のTLSはやはり通らない。 実機のPowerMac G4で、RetroCertの証明書一式を反映すると、信頼済み証明書は158件から238件に増えました(RSAルート80件追加。ECCルート41件は、Tigerの証明書ライブラリがECC自体に対応していないためスキップ)。TLS 1.0を許容する設定にした当サイト自身のVPSは、その後接続できました。一方、apple.comのような一般的なサイト(TLS 1.2/1.3・ECDHE専用)は「セキュリティで保護された接続を確立できませんでした」のまま変わりませんでした。これはTiger自身のSecureTransportのプロトコル・暗号スイートの不一致であり、証明書ツールでは直せない領域です。
これを欲しがる人は、たいてい別の方法ですでに解決していた。 配布されているAquafox・Thunderbirdの実行ファイルを調べたところ、どちらもOSのKeychainとは独立した自前のNSS証明書ストアを持ち、ISRG Root X1のような最新のルート証明書を最初から内蔵していました。今もTiger世代のMacを実際に使い続けている人の多くは、まさにこの理由でどちらか(または両方)に乗り換え済みです。結果、RetroCertの実際の対象は、あえて標準のSafari/Mail.appを使い続けている人に絞られます。「古いMacで現代のWebが見られるようになる」汎用ツールとして過大に売り込まないよう、先に明記しておくべき点だと考えました。
TigerにはTrust Settings APIが存在しない。 Leopard(10.5)で入った証明書ごとの信頼設定は、Tigerにはありません。ルート証明書への信頼は、専用のアンカーストア(/System/Library/Keychains/X509Anchors)に証明書が存在するかどうかだけで決まります。macOS側の実装(store_macos.py)は、新しいAPIが常にあるものとは仮定せず、この違いで分岐しています。

他プロジェクトへの転用アイデア

上の通り、実際の効果はかなり限定的でしたが、仕組み自体は証明書以外にも転用できると思っています。

  • 汎用の改竄検知つき配布フレームワークとして。 証明書専用の作りではないので、「信頼できるマシンで署名し、信頼しないサーバーから配信する」というパターンは、ゲームパッチ・フォント・設定ファイル・辞書データなど、Sparkle/TUFのような大掛かりな仕組みを入れたくない個人プロジェクトの自動更新機能に流用できます。
  • verify.py を単体のユーティリティとして。 cryptography/pyOpenSSLが入れられない環境(古いPython、pipの使えないサンドボックス、依存を増やしたくないインストーラーの起動処理など)で使えます。
  • Mac以外の、証明書ストアが凍結された古い機器全般に。 store.pyのOS別ディスパッチ層はまさにこの汎用化のために用意しています。古いルーター・NAS・複合機・産業機器・古いLinux/Windowsサーバーなど、HTTPS通信はするが証明書ストアが更新されない機器は多く、「古いMacでWebを見る」ではなく「証明書が原因で通信できなくなったレガシー機器を延命するツールキット」と捉え直せば、もっと広い需要がありそうです。store_windows.pyのようなバックエンドを足すだけで拡張できます。
  • (未着手)Aquafox/ThunderbirdのNSSストアそのものへの対応。 対象機にcertutilが無いため今回は見送りましたが、libnss3.dylibをctypes経由で直接呼ぶ独自バインディングを書けば、cert9.dbへの証明書追加も原理的には可能です。皮肉にも、本当に欲しい機能はここにあるのですが、NSSの内部API・ABIに正確に合わせる必要があり、相応の開発コストがかかります。

ソースコード・発行者側のツール・ライセンスはGitHubにあります。

このアプリへのひとこと

評価(任意)