Safari でクライアント証明書による認証が失敗する時の対策
macOS の Safari でクライアント証明書が要求されるウェブサイトにアクセスすると、正常にインストールされているにも関わらず、認証に失敗することがあります。その場合のチェックポイントについて解説します。スクリーンショットなどは macOS Ventura 13.x ベースですが、現行のサポートOS(macOS Mojave 10.14.x 以降)では、事情は同じだと思います。
クライアント証明書側に問題はないか
最初に切り分けるべきことは、クライアント証明書が正しくインストールされているか、その証明書が有効なもの(有効期間内、および管理者により無効化されていない)か、です。
一番簡単な方法は、別のブラウザ(Google Chrome など)でアクセスします。Safari でエラーが出る状態でも、クライアント証明書が正しくインストールされていれば、別のブラウザからは正常にアクセスできます。

このようなシートが出て、クライアント証明書を選択して認証できれば、クライアント証明書は正しくインストールされており、有効期間内で、管理者によって無効化されていることはない、と考えてよいでしょう。
識別プリファレンスに問題はないか
Safari でも事情は全く同じで、本来は同じようなシートが出て、クライアント証明書を選択して認証できれば、以後は問題なくアクセスできることが多いです。

こちらは、Safari のクライアント証明書の選択画面です。これが表示された場合はラッキーですが、ここでは、そうならなかった場合(400 No required SSL certificate was sent
か 421 Misdirected Request
が表示されることが多いようです)や、一度は認証できたのに、いつの間にかログインできなくなった場合(期限切れや証明書が無効化された場合を除く)の対処法を紹介します。
Safari(というより macOS)には、識別プリファレンスという仕組みがあり、特定のウェブサイトにアクセスした時に使用するクライアント証明書を覚えておくことができます。初回アクセス時は、上記のシートが表示されてクライアント証明書を選択し、2回目のアクセス以後は、シートが表示されずに、前回使用したクライアント証明書を自動的に選択し、認証することができます。
原因は特定できていないのですが※、初回アクセス時に、Safari がクライアント証明書を要求されていると認識できないことがあります。その場合は、手動で識別プリファレンスを作成することで、この問題を回避できます。識別プリファレンスを作成するには、キーチェーンアクセスを開き、以下のように、使用したいクライアント証明書を選択して、ctrl + クリックすると作成することができます。
現時点の推定ですが、サーバ側のソフトが nginx の場合に発生するように感じています。nginx はパフォーマンスの低下を嫌って、クライアント証明書に関するネゴシエーションの一部を省略しているため、その辺りが悪さをしているのではないかと思います。

以下のダイアログが表示されるので、URL と対象とするアプリの識別子を入力して追加をクリックします。

URL を入力したら良さそうに読めるのですが、実際は、以下のような文字列を入力します。
https://www.example.com (com.apple.Safari)
URL と丸カッコの間には、半角スペースが必要です。このような識別プリファレンスを作成しておくと、この URL にアクセスするときは、このクライアント証明書で認証してね、ということを Safari が理解し、無事、クライアント証明書で認証されます。実際、Safari がうまいこと識別プリファレンスを作ってくれた時も、このような文字列が入っています。
また、https://app.example.com/login
にアクセスし、その後、リダイレクトされて https://auth.example.com/
でクライアント証明書による認証を行うサイトの場合、識別プリファレンスとして登録すべき URL は https://auth.example.com/
側のようです(私のところでは、これで動いています)。
識別プリファレンスを作成後も認証できない場合は、Safari の再起動やキャッシュ削除を試してみてください。
まとめ
Safari でクライアント証明書による認証が失敗する場合のチェックポイントと、対策について紹介しました。識別プリファレンスを作成すると認証できます。回避法がはっきり分かるまでは、偶然認証できるまで Safari を再起動するなど、非生産的なことを繰り返していました。この問題は、iOS 版の Safari では発生しません。こんな面倒なことはやってられない、という方は、Google Chrome を使いましょう。