为什么生成自签名 X509 证书不需要我的公钥?

信息安全 证书 公钥基础设施 openssl x.509
2021-08-28 04:47:50

假设我有一个我生成的 RSA (2048) 密钥对

private.key
public.key

出于测试目的,我想生成一个自签名的 X509 证书。

我对证书的理解是——

  1. 显示公钥的所有权证明,由其他方验证(在这种情况下由我验证,因为自签名)
  2. 自身包含公钥

看起来openssl让我很容易创建一个证书:

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

但这就是我感到困惑的地方-为什么它需要我的私钥?

我可以想象它可能需要一些东西对其进行签名,因此需要使用私钥。但是,它如何让我的公钥嵌入到证书中?从我的私钥对我的公钥进行逆向工程在数学上是不可能的,对吧?

谢谢!

3个回答

私钥是识别您的秘密,任何对您特定身份的签名或验证都需要私钥。因此,任何将生成某些源自您的身份的操作的操作都将需要它。

此外,您不是在此处创建证书,而是在创建证书签名请求,您将提交给另一方,然后由对方生成证书以授予您访问权限。

如果要创建自签名 x509 证书,则应添加 -x509 参数,如下所示:

openssl req -x509 -nodes -days 5000 -newkey rsa:2048 -keyout mypem.key -out mycert.crt
  • 哪里天是证书的有效期(5000 实际上是无限期的)
  • 节点跳过密码业务(跳过测试,省略任何真实的东西)
  • 并输出密钥和证书以供以后使用

@bartonjs 是正确的,私钥到公钥是可能的,公钥到私钥不是。这就是为什么您可以分发公钥而没有人可以使用它来冒充您。私钥必须始终保密。

如果您打算充当希望访问服务器的客户端以及授予请求的服务器,您首先需要在服务器上设置您的证书颁发机构和服务器的证书。

Someone on stack overflow 对此已经有了很好的回答:

但是基本的 juiste 是,你设置了服务器的 CA 和 crt,然后你在服务器上做这样的事情:

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

您将“signedrequest.crt”交还给请求它的人。

我忘了提,在我上面的命令中去掉 -nodes,它会跳过密码过程。对测试有利,对安全不利。仅供参考。

从我的私钥对我的公钥进行逆向工程在数学上是不可能的,对吧?

不,你的方向是向后的。

从公钥中(假设是)不可能获得私钥。从私钥很容易得到公钥。

对于 RSA,私钥是 (n, d),但更实际的是 (p, q, e)。p*q = n, (n, e) 是公钥。

对于 ECDSA,私钥是d,乘以G得到的数字Q,公钥。由于您无论如何都需要记住您所在的曲线,这给了您G,并且d*G仍然是Q,公钥。

私钥文件包含所有密钥对组件(即使我不是公共部分也可以从私有参数中计算出来)它确实包含它放入自签名证书或证书签名请求中的公共部分,并且它需要私有实际进行(自我)签名的一部分。

您可以使用以下命令从私钥文件中导出公共部分:

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