我正在寻找一个库/模块/包,我可以用它来创建和签署X.509证书,并能够有条件地添加自定义v3扩展 - 这可能相当复杂;例如,Kerberos PKINIT使用的这个bletchful 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 ......)
答案 0 :(得分:5)
事实证明,我将这些信息准确地添加到了Ruby 1.9.3的文档中,该文档刚刚由James Britt发布 - 看看documentation for OpenSSL::X509::Certificate,它应该回答你所有的问题。
如果OpenSSL本身支持该特定扩展,那么修改示例中的示例以生成示例中列出的特定扩展应该是直截了当的。
对于更复杂的情况,例如您的示例中的自定义OtherName,您可能仍然使用OpenSSL::X509::Extension,但遗憾的是,还没有记录。另一方面,此类自定义扩展所需的OpenSSL :: ASN1模块已documented for 1.9.3,其中提供的所有代码/建议也应适用于1.9.2。您还可以使用ASN1模块创建subjectAltName的多值版本。
答案 1 :(得分:2)
我会使用OpenSSL或像Ruby的openssl库一样直接包装库。
OpenSSL是一个非常强大且可信赖的工具包 - 它还有一个额外的优势,您可以从任何脚本语言中以相同的方式调用它。使用OpenSSL命令行工具,您可以与命令行交互以帮助调试脚本;您也可以使用相同的CA手动生成脚本之外的证书。
答案 2 :(得分:1)
我们的SecureBlackbox允许您在C#中创建和管理X.509证书,并允许您添加自定义扩展。我相信BouncyCastle也可以做到这一点。