首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么生成自签名的X509证书不需要我的公钥?

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

Security用户
提问于 2017-06-08 21:01:39
回答 3查看 7.8K关注 0票数 7

假设我有我生成的RSA (2048)键盘

代码语言:javascript
复制
private.key
public.key

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

我对证书的理解是-

  1. 显示公用钥匙的所有权证明,由另一方核实(在本例中由我自签)。
  2. 本身包含公钥。

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

代码语言:javascript
复制
openssl req -new -key private.key -out certificate.csr

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

我可以想象它可能需要用某种东西来签名,因此使用了私钥。但是,它如何使我的公钥嵌入到证书中呢?用我的私钥倒置我的公钥是不可能的,对吧?

谢谢!

EN

回答 3

Security用户

回答已采纳

发布于 2017-06-08 21:15:32

私钥是标识您的秘密,任何签名或验证您的特定身份都需要私钥。因此,任何将产生从你的身份中衍生出来的东西的操作都需要它。

此外,您不是在这里创建证书,而是创建证书签名请求,您将将该请求交给将生成证书以授予您访问权限的其他方。

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

代码语言:javascript
复制
openssl req -x509 -nodes -days 5000 -newkey rsa:2048 -keyout mypem.key -out mycert.crt
  • 该证书有效期为天数(实际上是无限期的)
  • 节点跳过密码业务(跳过测试,忽略任何真实内容)
  • 并输出密钥和证书,以供以后使用。

@bartonjs是正确的,私钥到公钥是可能的,公钥到私钥是不可能的。这就是为什么你可以分发公钥,没有人可以用它来模仿你。私钥必须在任何时候都是秘密的。

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

堆栈溢出已经有了一个很好的答案:

但最基本的方法是,设置服务器的CA和crt,然后在服务器上执行如下操作:

代码语言:javascript
复制
openssl x509 -req -days 30 -in request.csr -CA ca.crt -CAcreateserial -CAkey ca.key -out signedrequest.crt 

你把"signedrequest.crt“还给请求它的人。

我忘了提到,去掉上面命令中的-nodes,它跳过了密码过程。好的测试,坏的安全。只是一场比赛。

票数 9
EN

Security用户

发布于 2017-06-08 21:07:21

用我的私钥倒置我的公钥是不可能的,对吧?

不,你的方向是反向的。

从公钥中获取私钥是不可能的。从私钥看,公钥很容易。

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

对于ECDSA,私钥是d,它是将G乘以得到Q (公钥)的数字。因为您需要记住您所处的曲线,这就给了您G,而d*G仍然是Q,公钥。

票数 3
EN

Security用户

发布于 2017-06-08 22:07:07

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

您可以通过以下方式从私钥文件导出公共部分:

代码语言:javascript
复制
openssl rsa -pubout -in private_key.pem -out public_key.pem
票数 2
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/161526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档