如何使用 Yubikey NEO(或任何 OpenPGP 卡或一般的 GnuPG)签署 X.509 CSR?

信息安全 证书颁发机构 x.509 智能卡 优比键 gnupg
2021-08-29 16:59:29

由于 Yubikey NEO 可以用作具有三个 2048 位 RSA 密钥的 OpenPGP 卡(请参见此处),因此我考虑使用其中一个公钥创建 CA。由于无法提取私钥(至少根据那篇文章,无论如何这是首先使用它的重点),我不能简单地使用它openssl ca -inkey ...来签署证书请求。

现在,在我开始尝试手动生成要为有效证书签名并使用gpg(可以使用 Yubikey NEO)执行此操作的字符串之前,是否有更简单的方法来执行此操作,例如通过gpgsm或其他openssl参数?

2个回答

GnuPG 2.1.0beta2 支持以批处理模式签署证书:

支持 X.509 证书创建。

使用“gpgsm --genkey”允许通过新提示创建自签名证书。

使用“gpgsm --genkey --batch”应该允许创建由参数文件控制的任意证书。一个示例参数文件是

Key-Type: RSA
Key-Length: 1024
Key-Grip: 2C50DC6101C10C9C643E315FE3EADCCBC24F4BEA
Key-Usage: sign, encrypt
Serial: random
Name-DN: CN=some test key
Name-Email: foo@example.org
Name-Email: bar@exmaple.org
Hash-Algo: SHA384
not-after: 2038-01-16 12:44

这将使用 keygrip 给出的密钥并使用 SHA-384 作为散列算法创建一个自签名 X.509 证书。关键字signing-key 可用于使用不同的密钥对证书进行签名。有关详细信息,请参阅 sm/certreggen.c。

(来源:提交消息,也是新闻


我得到它的工作,这里是涉及的步骤(不要在你的生产系统上这样做!

  • 您需要 libksba >= 1.3(在此处获取)
  • 从ftp://ftp.gnupg.org/gcrypt/gnupg/unstable/获取 2.1 beta 3
  • 创建一个将用于签名的密钥(这是在实际应用程序中永远不会离开您的 Open PGP 卡/Yubikeo NEO 的 CA 密钥) - 如果您想使用密码(如果您仍想在生产中使用此密码,建议您使用) ,请记住,您必须设置pinentry在没有控制台的情况下工作,即使用图形控制台或使用并在使用时screen设置GPG_TTY为另一个(自我注意:当提示显示时,按回车键一次以实际激活它而不使用您的密码作为明文命令...)ttypinentry-curses
  • 创建一个将用于证书的密钥(我不知道您是否也可以使用 gpgsm 签署其他 CSR,在这种情况下您可能必须提取公钥)
  • (我为 CA 使用了一个主密钥,为证书使用了它的子密钥)
  • 获取 Key-Grips:检查文件名~/.gnupg/private-keys-v1.d并从创建日期推断出来,或者运行gpg2 -K --with-key-data,搜索包含密钥 ID 的行(不是整个指纹,以某种方式拆分和打乱)并检查下一行开始和grp:::
  • 使用以下批处理输入创建自签名 CA 证书:
Key-Type: RSA
Key-Grip: E9CE7D421500AD119A4E308BC34317710AA2D57F #(replace with CA keygrip)
Key-Usage: cert
Serial: random
Name-DN: CN=Test Root CA
Hash-Algo: SHA512
not-after: 2038-01-16 12:44

并运行 gpgsm --gen-key --batch --output CA.crt < batchinputfile

  • 使用以下批处理输入创建签名证书:
Key-Type: RSA
Key-Grip: E308BC34317710AA2D57FE9CE7D421500AD119A4 #(replace with keygrip)
Key-Usage: sign, encrypt
Serial: random
Name-DN: CN=Tester
Issuer-DN: CN=Test Root CA
Hash-Algo: SHA512
not-after: 2038-01-16 12:44
Signing-Key: E9CE7D421500AD119A4E308BC34317710AA2D57F #(replace with CA keygrip)
Authority-Key-Id: E9CE7D421500AD119A4E308BC34317710AA2D57F #(replace with CA keygrip)

并运行 gpgsm --gen-key --batch --output cert.crt < batchinputfile

可以在此处(不完整的文档)certreqgen.c中找到有关可能的批处理参数的更多信息;您还应该手动包含basicConstraintsvia Extension,如果您指定 Issuer-DN,默认情况下会省略它,如源代码所示。

OpenSSL 理论上可以通过特定的引擎插件使用 PKCS#11 模块。但是YubiKey 还没有 PKCS#11 模块该评论暗示了一种名为“ scute ”的东西,它似乎是一个包裹 GnuPG 的 PKCS#11 模块——因此,它可能与 YubiKey 的 OpenPGP 实现兼容。