首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成确定性X.509证书?

生成确定性X.509证书?
EN

Security用户
提问于 2014-06-25 04:53:10
回答 4查看 899关注 0票数 4

是否有确定地为X.509证书创建RSA私钥的方法,最好是通过已经经过审核的库?

例如,用户输入诸如“这是我的私有组”这样的短语,该种子值用于生成一个私用RSA密钥,然后我可以使用它作为证书颁发机构。但是这样的话,我就可以在不同的机器上从种子值中得到相同的密钥。

我的用例是,我希望在我的应用程序中支持预共享密钥,但是使用它用于键控的现有X.509支持。如果我可以从某个初始值创建一个可预测的X.509证书,那么这将非常简单,因为用户可以根据生成的密钥相互验证对方的证书。

出于显而易见的原因,我想避免用手滚动库来做这件事,但这似乎并不是一件常见的事情--尽管支持PSK的各种系统在内部必须做一些类似的事情。

EN

回答 4

Security用户

发布于 2014-06-26 14:40:31

目前,我认为这里没有大的问题,至少,从算法本身的PoV。

  1. 用关键短语的散列作为PRNG的种子。
  2. 使用PRNG生成RSA密钥对。
  3. 使用库生成证书,并将关键材料放入其中。

决定论是通过使用带有相同关键字短语(可能是盐渍的,并通过SHA-256)的PRNG实现的,因此对于相同的输入,输出是相同的。所有所需的算法都可以很容易地用Python实现,或者可以重用现有的代码,比如Python-RSA。唯一需要的调整将是使用您的PRNG,而不是它现在使用的。

第3点是最难的部分,因为我不是库方面的专家,但这似乎是另一个问题的一部分(从现有的关键材料生成证书)。这属于“什么是最好的图书馆.”类别。

和往常一样:除非你是布鲁斯·施耐尔,否则鞭打你自己的密码通常是不被鼓励和皱眉的。;-)

票数 3
EN

Security用户

发布于 2014-10-24 16:32:57

正如@Dmitry所指出的,你所设想的是可行的。PRNG本身是一种确定性算法,它将初始随机种子“扩展”到任意长的伪随机字节序列中。您可以使用一个强密码散列函数,并将得到的哈希值用作PRNG的种子。

不过,有些附带问题可能会令人感到烦恼。例如:

  • 密码哈希最有效的时候,有一个盐,这不是秘密,但必须存储在某处。
  • 更改密码意味着更改私钥,这通常很不方便。
  • 公钥(是公共密钥)可以用作离线字典攻击的测试:攻击者可以“在家里”尝试密码,直到找到与已知公钥匹配的密码为止。

我在这个答案中更详细地讨论了这个问题。

请记住,证书(包含公钥)必须存储在某个地方,因为您不能通过密码重新创建证书(证书由CA签名,并且不能重新计算该签名,因为您不是自己的CA)。您可以“正常”生成私钥,用一些基于密码的加密系统对其进行加密,并将其与证书一起存储;从安全的角度来看,这相当于密码到RSA密钥派生;但至少它可以与现有格式和工具一起工作(您可以使用PKCS#12,也称为"pfx",作为证书和私钥的密码保护存档格式)。

票数 2
EN

Security用户

发布于 2022-06-21 17:17:32

我做了一些调查,发现一些有趣的笔记,我认为值得分享,但不是一个明确的答案。我生成了几个证书并对它们进行了比较。我在用这句话:

Windows:

代码语言:javascript
复制
openssl req -new -x509 -key priv.pem -out pub.pem -h -subj '//CN=test'

Linux (未测试):

代码语言:javascript
复制
openssl req -new -x509 -key priv.pem -out pub.pem -h -subj '/CN=test'

然后,我比较了内容,但它们不匹配。

我使用Python获取有关证书的更多信息:

代码语言:javascript
复制
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
pub_str = open(pub_fname).read().encode()
cert_obj = load_pem_x509_certificate(pub_str, default_backend())
public_key = cert_obj.public_key()

我发现cert_obj.serial_numbercert_obj.not_valid_aftercert_obj.not_valid_before不同( cert_obj.signature也不同,但我认为这是其他字段不匹配的结果)。

我能够通过命令行(Windows)指定序列号:

代码语言:javascript
复制
openssl req -new -x509 -key priv.pem -out pubX.pem -set_serial 219363692778776146107430278182615926685007820639  -subj '//CN=test'

但不是日期。此时,我想我应该只存储证书文件。还有一些其他可能的途径有待探索。也许使用Python来生成证书而不是openssl可能会使指定这些值成为可能。还有其他命令允许指定日期(我在网上看到了gossl,但无法确认)。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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