web-dev-qa-db-ja.com

ECDSAを使用したOpenSSLで秘密鍵と証明書が一致するかどうかを確認するにはどうすればよいですか?

[〜#〜] rsa [〜#〜] キーを使用してこれを行う方法を知っています(この記事を参照してください 秘密キーが証明書に属しているかどうかを判断しますか? )ただし、 [〜#〜] ecdsa [〜#〜] 証明書/キーペアに対してこれを行う方法がわかりません。

RSAキーを使用すると、これに係数を使用できます。ただし、ECDSAの「同等」が何であるかはわかりません。

ありがとう!

11
Jeff

ECDSA、またはECDHを含む任意のECCの同等のデータは、公開ポイント値と使用される曲線の仕様です。相互運用性の実際には、標準化されたOID(NIST、SECGなど))で識別される曲線の1つを使用し、ほとんどの場合NSA Suite B、つまりnistp256とnistp384ですが、ASN.1形式(およびopensslライブラリ)は、任意の(?)Weierstrass形式の曲線をサポートできます。

しかし、簡単なメソッドは、実質的に と同じです。秘密キーが証明書に属しているかどうかを判断しますか? 、私はいくつかの可能な改善を追加します:

  1. openssl x509 -in cert -pubkeyを使用して証明書からフィールドを取得し、openssl ec -in key -puboutを使用して秘密鍵から取得した(同じSPKIエンコーディングの)公開鍵(のすべて)と比較します。

    1A。 RSAとECCの秘密鍵に異なるコマンドを使用する代わりに、2010年のopenssl 1.0.0以降、両方にアルゴリズム汎用のopenssl pkey -in key -puboutを使用できます。

  2. Opensslベースのプログラムを構成して、鍵と「独自の」証明書を使用(試行)します。それらが一致しない場合、opensslライブラリは、プログラムが表示する必要があるエラーを返します。

    2A。サーバー環境全体をセットアップするか、既存の環境を一時的に引き継ぐ代わりに、openssl s_server -accept X -cert cfile -key kfileを実行することができます。ここで、Xはマシンで使用可能な任意のポートで、制限なしで、現在バインドまたは接続されていません。正常に開始した場合(証明書とキーの一致)、control-C(または同等のもの)だけを使用します。

12

@ dave_thompson_085が言ったことを具体的に実装するために、これはトリックを実行します。証明書と秘密鍵のそれぞれから公開鍵を抽出し、それらのmd5ハッシュを計算して、簡単に比較できるようにします。

# openssl x509 -pubkey -in mydomain-ecc.crt -noout | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879
# openssl pkey -pubout -in mydomain-ecc.key | openssl md5
(stdin)= 77e16c92c1a4907c7da34e72a1c5b879

この質問が投稿されてから、OPによってリンクされた質問に 回答 が追加され、ECC証明書でも機能するワンライナーが提供されています(pkeyの代わりにrsaを使用)。 t目に見える確認を提供します。

5
Synchro