内部クライアント/サーバーアプリケーションの一部として、自分の(自己署名)認証局(CA)と、CAによって署名されたクライアント証明書とサーバー証明書の両方を作成しました。
CA証明書をPEM形式でFireFoxにロードするのは比較的簡単です。サーバー証明書を使用してGoでHTTPSサーバーを作成することも(比較的)簡単です。
ただし、私の最終的な目標は、クライアントとサーバーの両方が相互に認証するダブルエンドTLSを使用することです。
これを行うには、client証明書/キーとCAの公開証明書/キーをブラウザーにロードする必要があります。
残念ながら、FireFoxとChromiumは、PEM形式のclient証明書を読み込みません。 PKCS#12形式のクライアント証明書/キーバンドルのみをロードします。
私が試すたびに、FireFox(XUbuntu 19:10のv73)は、(一般的な)形式の問題があると言って、PKCS#12のロードを拒否しました。
openssl pkcs12 -info
コマンドを使用してPKCS#12ファイルの内容を正しく読み取ることができるので、PKCS#12ファイルが正しくフォーマットされていることがわかります。
FireFoxとChromiumはどちらもlibnss3を使用してx509証明書を管理します。多くの検索を行った後、certutil
およびpk12util
libnss3-toolsを使用してFireFoxのcert9.db
証明書データベースを操作する方法についてのWebでの議論にようやく気づきました。
これら2つのツールを使用してPKCS#12ファイルをロードしようとすると、"SEC_ERROR_REUSED_ISSUER_AND_SERIAL"エラーが発生しました。 pk12util
コマンドは、追加の(役立つ)メッセージを提供しました。
You are attempting to import a cert with the same issuer/serial as an
existing cert, but that is not the same cert.
したがって:PKCS#12ファイルで自己署名x509証明書を使用する場合の「SEC_ERROR_REUSED_ISSUER_AND_SERIAL」エラーの原因は何ですか?
これが[〜#〜] i [〜#〜]に遭遇した答えです...他の答え、または回避策があるかもしれません...もしそうなら、収集するのが良いでしょうそれらここに。
苦労した後、私はようやく2つの証明書がpk12util
はmyclientおよびmy[〜#〜] ca [〜#〜]証明書を参照していました(同じPKCS#12ファイルにバンドルされています)。両方とも同じ発行者(私のCA)によって署名されており、両方の証明書要求で誤って同じシリアル番号が与えられていました。
この問題を理解しようとしているときの私の問題の1つは、常にFireFox証明書データベースで(FireFoxブラウザーまたはcertutil
ツール)。もちろん、後から見て、理由は単純です。2つの(競合する)証明書がまだ証明書データベースにロードされておらず、代わりに私のPKCS#12ファイルにありました。
CA、サーバー、クライアントの証明書を再作成して、それぞれに異なるシリアル番号が付いていることを確認した後、PKCS#12ファイルを読み込むことができましたおよびさらに重要なことに、クライアント(ブラウザー) )と(Go)サーバーがお互いを認証します。
証明書の作成と相互認証を行うクライアント/サーバーアプリケーションを備えたGoベースの認証局の完全な動作例は、GitHub diSimplex/ConTeXtNurseryにあります。
この質問/回答が、同じ種類の問題を抱えている他の人に役立つことを願っています。