鍵をローテーションしたい自己署名CAがあります。私は cross-signing を使用してこれを容易にし、クライアントの証明書を徐々に交換してクライアントが引き続き通信できるようにしたいと考えています。
私は cfssl を使用していますが、これを機能させる方法を実際に理解できません。テストの目的で、同一のCNを持つ2つの新しいCAを生成し、それらに相互署名しました。
cfssl gencert -initca ca-csr-A.json | cfssljson -bare ca-A
cfssl gencert -initca ca-csr-B.json | cfssljson -bare ca-B
cfssl sign -ca ca-A.pem -ca-key ca-A-key.pem -config ca-config.json ca-B.csr | cfssljson -bare ca-B-by-A
cfssl sign -ca ca-B.pem -ca-key ca-B-key.pem -config ca-config.json ca-A.csr | cfssljson -bare ca-A-by-B
次に、Aの秘密鍵で署名された新しいクライアント証明書と、Bによって相互署名されたA証明書を作成しました。
cfssl gencert -ca=ca-A-by-B.pem -ca-key=ca-A-key.pem -config=ca-config.json child-csr.json | cfssljson -bare child
次に、(openssl verify
を使用して)元のA、元のB、または相互署名されたCAのいずれかを使用して新しいクライアント証明書を検証しようとしましたが、呪文を解決できません。私はca-A-by-B.pem
とca-B.pem
をバンドルしてみましたが、仲介者としてca-A-by-B.pem
を使用してクライアントをバンドルしてみましたが、どちらも機能しません。
私は明白な何かを逃したり、クロスサインを完全に誤解していると思います。これは可能ですか?
これらの回答は役に立ちます:
では、クロス証明書をクライアントのトラストストアに配置して、証明書の検証中に、信頼しないCAから信頼できるCAへのパス構築を可能にするという考えです。
テストシナリオは、_ca-A
_によって発行されたend-entity証明書と _ca-B
_のみを信頼するclientベリファイア。また、2つのCA間でパスを構築できるようにクライアントに提供できる_ca-A-by-B
_クロス証明書もあります。私はそれをシミュレートする正しいopensslコマンドラインの呪文は次のようになると信じています:
-CAfile ca-B.pem
_ ca-Bが「トラストストア内」になるようにします。-untrusted ca-A-by-B.pem
_検証者は、パス構築にその証明書を使用できることを認識しますが、信頼されたルートとは見なしません。< (cat ca-A.pem child.pem)
エンドエンティティ証明書とその発行者(ca-A)を含む証明書バンドルの受信をシミュレートします。すべて一緒に:
_openssl verify -verbose -CAfile ca-B.pem -untrusted ca-A-by-B.pem < (cat ca-A.pem child.pem)
_
私は実際にこれを試していませんが、テスト証明書を生成するのが面倒なので、それが役立つかどうか(または修正が必要かどうか)をお知らせください。