我找不到任何描述如何使用BC签署CSR的代码/文档.作为输入,我将CSR作为字节数组,并希望以PEM和/或DER格式获得证书.
我已经走到了这一步
def signCSR(csrData:Array[Byte], ca:CACertificate, caPassword:String) = {
val csr = new PKCS10CertificationRequestHolder(csrData)
val spi = csr.getSubjectPublicKeyInfo
val ks = new java.security.spec.X509EncodedKeySpec(spi.getDEREncoded())
val kf = java.security.KeyFactory.getInstance("RSA")
val pk = kf.generatePublic(ks)
val (caCert, caPriv) = parsePKCS12(ca.pkcs12data, caPassword)
val fromDate : java.util.Date = new java.util.Date // FixMe
val toDate = fromDate // FixMe
val issuer = PrincipalUtil.getIssuerX509Principal(caCert)
val contentSigner = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(caPriv)
val serial = BigInt(CertSerialnumber.nextSerialNumber)
val certgen = new JcaX509v3CertificateBuilder(new X500Name(issuer.getName), serial.bigInteger, fromDate, toDate, csr.getSubject, pk)
Run Code Online (Sandbox Code Playgroud)
我无法确定从证书生成器获取以PEM或DER格式存储它.
还是我一起走错路?
我正在寻找一个示例或教程来使用Java中的BC生成X509证书.
很多例子都有/使用弃用的API.我看了BC,但它没有显示哪个类做了什么或没有适当的文档/示例.
如果您对此有任何想法,请指出我可以使用BC生成X509证书的教程.[生成和写入文件的公钥和私钥]
我有一个网页,其中显示了与服务器一起使用的SSL证书的详细信息.我认为toString()可能没问题,但它看起来像这样:
[0] Version: 3
SerialNumber: 117262955582477610212812061435665386300
IssuerDN: CN=localhost
Start Date: Wed Jun 13 15:15:05 EST 2012
Final Date: Tue Jun 08 15:15:05 EST 2032
SubjectDN: CN=localhost
Public Key: DSA Public Key
y: 6ef96c2ace616280c5453dda2[TRUNCATED BY ME]
Signature Algorithm: SHA1withDSA
Signature: 302c021450b1557d879a25ccf6b89e7ac6de8dc6
0b13df7e0214559cdc810cdb1faa3a645da837cd
5efdeb81d62e
Extensions:
critical(true) 2.5.29.17 value = DER Sequence
Tagged [7] IMPLICIT
DER Octet String[4]
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是扩展的模糊表示.我更愿意看到"subjectAltNames"和替代名称列表,就像我在浏览证书信息时在网络浏览器中看到的那样.
有办法做到这一点吗?我在班级路径上有完整的BouncyCastle,所以我希望我能在那里找到它,但我似乎无法找到它.
最糟糕的是,我知道我可以花时间自己搞清楚所有的点点滴滴,但我不知道是否会错过某人可能期望在那里找到的扩展.