X.509库

5 投票
3 回答
1283 浏览
提问于 2025-04-17 03:36

我在找一个库或者模块,可以用来创建和签署X.509证书,并且能够根据需要添加自定义的v3扩展。这些扩展可能会比较复杂;比如,Kerberos PKINIT使用的这个OpenSSL.cnf片段,仅仅是为了表示foo@EXAMPLE.ORG

[v3_extensions]
    subjectAltName = email:foo@example.org,
                otherName:pkinitSan;SEQUENCE:krb_princ_name_1

[krb_princ_name_1]
    realm = EXP:0, GeneralString:EXAMPLE.ORG
    principal_name = EXP:1, SEQUENCE:krb_princ_seq_1

[krb_princ_seq_1]
    name_type = EXP:0, INTEGER:1
    name_string = EXP:0, SEQUENCE:krb_principal_1

[krb_principal_1]
    princ0 = GeneralString:foo

在我找到的所有适合我会的语言(包括Perl、Python、Ruby、PHP、Bash,还有一些C#)中,使用命令行的openssl和自动生成的.cnf文件... 这个过程真是太麻烦了。 有没有更好的方法呢?(一开始Ruby的'openssl'看起来很不错,但当我遇到PKINIT时...)

3 个回答

1

我们的 SecureBlackbox 让你可以在C#中创建和管理X.509证书,还可以添加自定义扩展。我相信 BouncyCastle 也能做到这一点。

2

我会使用OpenSSL,或者直接用像Ruby的openssl库这样的库封装。

OpenSSL是一个非常强大且值得信赖的工具包——而且它还有一个额外的好处,就是你可以用任何脚本语言以相同的方式调用它。使用OpenSSL的命令行工具,你可以在命令行中与它互动,这样可以帮助你调试你的脚本;你还可以在脚本之外,使用同样的证书颁发机构手动生成证书。

5

其实,我刚刚把这些信息添加到了Ruby 1.9.3的文档中,今天刚由James Britt发布。你可以看看这个关于OpenSSL::X509::Certificate的文档,它应该能解答你所有的问题。

如果你想根据文档中的例子生成你提到的特定扩展,只要OpenSSL本身支持这个扩展,应该会很简单。

对于更复杂的情况,比如你提到的自定义OtherName,虽然有点遗憾的是,OpenSSL::X509::Extension这个部分还没有文档,但你仍然可以使用它。另一方面,OpenSSL::ASN1模块已经在1.9.3的文档中有介绍,那里提供的所有代码和建议也适用于1.9.2。你还可以使用ASN1模块来创建一个多值的subjectAltName版本。

撰写回答