macOS Keychain のエラー -25294(errSecNoSuchKeychain)— 証明書のインポート先を login にしたら直った
macOS で証明書を Keychain Access に取り込もうとしたら、エラー -25294 が出てインポートできない。証明書ファイルをダブルクリックしても、取り込む先が見つからないと言われて止まってしまう。結論から書くと、私の場合はインポート先のキーチェーンを「ローカル項目(Local Items)」から「login」に選び直したら、あっさり直りました。同じ症状の人向けに、何が起きているのかと最短の直し方を整理しておきます。
エラー -25294 は errSecNoSuchKeychain
まず -25294 が何者かというと、これは macOS の Keychain のエラーコードで、errSecNoSuchKeychain に対応します。意味はそのまま「指定されたキーチェーンが見つからない」です。古くからある Keychain Manager のエラーコード errKCNoSuchKeychain = -25294 に該当するもので、Security フレームワークのエラーコードの一つとして定義されています。
ここで押さえておきたいのは、このエラーは証明書そのものが壊れていることを示しているわけではない、という点です。エラーメッセージが指しているのは証明書ではなく、その読み込み先(インポート先)のキーチェーンです。証明書のバイト列は正常でも、それを書き込もうとした先のキーチェーンが正しく指定・認識されていなければ、macOS は「そんなキーチェーンは無い」と言って -25294 を返します。だから最初に疑うべきは、証明書の再ダウンロードではなく、インポート先の指定です。
よくある原因はインポート先のキーチェーン
このエラーが起きるとき、原因としていちばん多いのは、Keychain Access が証明書を保存できない、あるいは存在しないキーチェーンをデフォルトの保存先に選んでしまっているパターンです。具体的には次のようなケースです。
- 保存先が「ローカル項目(Local Items)」になっている。これは iCloud と同期するデータ保護キーチェーンを指し、証明書を保持できてもインポートのコード経路が異なるため、このエラーになりやすいことが知られています。Apple 側も不具合として認識しているようです
- 保存先が「iCloud」キーチェーンになっている。Local Items と同様に、証明書のインポートで失敗しやすい保存先です
- login キーチェーンや default keychain の設定そのものが壊れている
私が最初にはまったのも、まさに一つ目でした。証明書ファイルをダブルクリックしたら Keychain Access が勝手に「ローカル項目」を保存先に選び、そのまま -25294 で止まっていたのです。
直し方
インポート先を明示的に login に指定する
いちばん確実なのは、証明書ファイルをダブルクリックせず、保存先キーチェーンを自分で明示的に選ぶことです。Keychain Access を開き、メニューの「ファイル」から「項目を読み込む(File > Import Items)」を選びます。ファイル選択のダイアログで「オプション」を開くと、保存先のキーチェーンを選ぶプルダウンが出るので、ここで「login」または「System」を選びます。Local Items と iCloud は避けてください。
私の場合はこれで解決しました。ダブルクリック任せだと Keychain Access がローカル項目を選んでしまっていたのを、インポート時に login へ選び直しただけで、-25294 は出なくなり、証明書がふつうに取り込まれました。同じように「login を選び直したら直った」という報告は他にも見かけるので、まずはこの手順を試すのがおすすめです。
コマンドラインで直接入れる
GUI がどうしても誤ったキーチェーンを選んでしまう場合や、そもそも GUI を経由したくない場合は、security コマンドで直接入れるのが手っ取り早いです。保存先を引数で明示できるので、キーチェーンの取り違えが起きません。
# ダウンロードした .cer を login キーチェーンへ取り込む
security import ~/Downloads/DeveloperIDCA.cer -k ~/Library/Keychains/login.keychain-db
# 現在のキーチェーン構成を確認する
security list-keychains
security default-keychainsecurity default-keychain の出力が login キーチェーンを指していない場合は、次のように既定を設定し直せます。
security default-keychain -s ~/Library/Keychains/login.keychain-dbキーチェーン破損の切り分け
ここまで試してもダメなら、login キーチェーンそのものが壊れている可能性を疑います。Apple の Developer Technical Support も、新規のユーザーアカウントを作り、そのアカウントでインポートを試す診断を勧めています。新規アカウントで成功すれば、元アカウントの login キーチェーンが壊れていると分かりますし、新規アカウントでも失敗するなら、証明書側やシステム側の問題だと切り分けられます。原因を login キーチェーンに絞り込めれば、あとはキーチェーンの作り直しなど、対処の方向がはっきりします。
そもそも手動インポートが必要かを確認する
最後に一つ補足しておきます。この手のエラーで取り込もうとしている証明書が「Developer ID Certification Authority」のような Apple 配布の中間証明書である場合、そもそも手動インポートが必須でないことがあります。Xcode や xcode-select --install で入る Command Line Tools が入っていれば、署名や公証(notarization)の際に中間証明書が自動で参照されることが多いからです。
つまり、何のためにその証明書を入れようとしているのかによって、最短ルートは変わります。アプリの署名や公証まわりでつまずいているのなら、まず Xcode と Command Line Tools が入った状態でエラーが再現するかを確かめると、そもそも手動インポート自体が不要だったと分かることもあります。
まとめ
エラー -25294(errSecNoSuchKeychain)は「証明書が壊れている」ではなく「保存先のキーチェーンが見つからない」というエラーです。原因の大半は、Keychain Access がデフォルトで Local Items や iCloud を保存先に選んでしまっていることにあります。対処としては、まずインポート時に保存先を login へ明示的に選び直すこと。それでダメならコマンドラインで保存先を指定して入れ、なお直らなければ新規アカウントで login キーチェーンの破損を切り分ける、という順序になります。私自身は最初の「Local から login へ選び直す」で直りました。証明書を再取得する前に、まずは保存先を疑ってみてください。
以上、証明書のインポート先を login にして -25294 エラーを解決した、現場からお送りしました。