web-dev-qa-db-ja.com

自己署名のX509証明書を生成するのに公開鍵が不要なのはなぜですか?

私が生成したRSA(2048)キーペアがあるとしましょう

private.key
public.key

テスト目的で、自己署名X509証明書を生成したいと思います。

証明書についての私の理解は、

  1. 公開鍵の所有権の証明を示します。これは、他の第三者によって検証されたものです(この場合、自己署名以来、私が検証しました)
  2. 公開鍵が含まれています

opensslを使用すると、証明書を簡単に作成できます。

openssl req -new -key private.key -out certificate.csr

しかし、ここで私は混乱しています-なぜそれは私の秘密鍵を必要とするのですか?

おそらくそれに署名する必要があると想像できますwith何か、したがって秘密鍵の使用。しかし、どのようにして公開鍵を取得して証明書に埋め込むのでしょうか。私の秘密キーから私の公開キーをリバースエンジニアリングすることは、数学的に不可能ですよね?

ありがとう!

5
user2490003

秘密鍵はあなたを識別する秘密であり、あなたの特定のアイデンティティの署名や検証には秘密鍵が必要です。したがって、あなたのアイデンティティから派生することを意図した何かを生成するすべての操作は、それを必要とします。

また、ここでは証明書を作成していません。証明書署名リクエストを作成しています。これは、アクセスを許可する証明書を生成する相手に渡すものです。

自己署名x509証明書を作成する場合は、次のような-x509パラメータを追加する必要があります。

openssl req -x509 -nodes -days 5000 -newkey rsa:2048 -keyout mypem.key -out mycert.crt
  • ここで、日数は証明書の有効期間です(5000は事実上無期限です)
  • ノードはパスワードビジネスをスキップします(テストの場合はスキップ、実際の場合は省略)
  • また、後で使用するためにキーと証明書を出力します

そして、@ bartonjsは正しく、秘密鍵から公開鍵への変換は可能ですが、公開鍵から秘密鍵への変換は不可能です。そのため、公開鍵を渡すことができ、誰もそれを使用してあなたになりすますことはできません。秘密鍵は常に秘密である必要があります。

サーバーへのアクセスを取得するクライアントとして機能し、サーバーがリクエストを許可することを計画している場合は、最初にサーバー上に認証局とサーバーの証明書を設定する必要があります。

スタックオーバーフローのSomoneは、これについてすでにすばらしい答えを持っています。

しかし、基本的には、CAとサーバーのcrtをセットアップしてから、サーバーで次のようなことを行います。

openssl x509 -req -days 30 -in request.csr -CA ca.crt -CAcreateserial -CAkey ca.key -out signedrequest.crt 

「signedrequest.crt」をリクエストした人に返します。

言及するのを忘れて、上記のコマンドで-nodesを削除すると、パスワードプロセスがスキップされます。テストには良いが、セキュリティには悪い。参考までに。

6
Nalaurien

私の秘密キーから私の公開キーをリバースエンジニアリングすることは、数学的に不可能ですよね?

いいえ、あなたの方向は逆です。

公開鍵から秘密鍵を取得することは不可能であると考えられています。秘密鍵から公開鍵は簡単です。

RSAの場合、秘密鍵は(n、d)ですが、実際には(p、q、e)です。 p * q = n、および(n、e)は公開鍵です。

ECDSAの場合、秘密鍵はdです。これは、公開鍵Gを取得するためにQを掛けた数です。とにかくカーブを覚えておく必要があるので、Gd*GはまだQ、公開鍵です。

3
bartonjs

秘密鍵ファイルには、すべての鍵ペアが含まれています。これには、自己署名証明書または証明書署名要求に入れるパブリック部分が含まれており、実際に(自己)署名を行うにはプライベート部分が必要です。

次のコマンドを使用して、秘密鍵ファイルから公開部分をエクスポートできます。

openssl rsa -pubout -in private_key.pem -out public_key.pem
1
eckes