X.509库
我在找一个库或者模块,可以用来创建和签署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 个回答
我们的 SecureBlackbox 让你可以在C#中创建和管理X.509证书,还可以添加自定义扩展。我相信 BouncyCastle 也能做到这一点。
我会使用OpenSSL,或者直接用像Ruby的openssl库这样的库封装。
OpenSSL是一个非常强大且值得信赖的工具包——而且它还有一个额外的好处,就是你可以用任何脚本语言以相同的方式调用它。使用OpenSSL的命令行工具,你可以在命令行中与它互动,这样可以帮助你调试你的脚本;你还可以在脚本之外,使用同样的证书颁发机构手动生成证书。
其实,我刚刚把这些信息添加到了Ruby 1.9.3的文档中,今天刚由James Britt发布。你可以看看这个关于OpenSSL::X509::Certificate的文档,它应该能解答你所有的问题。
如果你想根据文档中的例子生成你提到的特定扩展,只要OpenSSL本身支持这个扩展,应该会很简单。
对于更复杂的情况,比如你提到的自定义OtherName,虽然有点遗憾的是,OpenSSL::X509::Extension这个部分还没有文档,但你仍然可以使用它。另一方面,OpenSSL::ASN1模块已经在1.9.3的文档中有介绍,那里提供的所有代码和建议也适用于1.9.2。你还可以使用ASN1模块来创建一个多值的subjectAltName版本。