2012-05-09 168 views
0

我做了一个示例代码来了解如何获得CRMF(Mozilla的证书请求)将其转换成一个CSR更类似于PKCS#10从CRMF请求转换成CertificateRequest(PKCS#10)签署

我得到了Base 64 CRMFRequest作为ASN1InputStream类型。

我把它转换成CertReqMsg型(BouncyCastle的)

当我调试,我意识到CertReqMsg具有公共密钥,另一个数据,如主题(CN,O,OU等)等,但更重要它有一个签名和一个AlgoritmIdentifier。

但对象不具有干将

如何提取签名作为DERBitString ...?我需要它作为CertificationRequest对象的参数使用(它会根据需要返回CSR)。顺便说一句,CertificationRequest需要一个CertificationRequestInfo对象作为参数。并在其中(CertificationRequestInfo),它接收Attributes作为参数。我supose这个属性是什么样的:

distributionPoint,unotice,policyOID,subjectAlternativeNameDN

我知道它有

ASN1Set attributes = null; 
    attributes = new DERSet(); 

开始,但我不知道怎么填这个paramethers到

 CertificationRequestInfo info = new CertificationRequestInfo(subject, infoPublicKey, attributes); 

很抱歉,如果有些问题似乎是显而易见的......但我无法找到解决..

在此先感谢

回答

0

您将无法将CRMF格式转换为PKCS#10 CSR。

CSR is structured like this,并通过主体的私钥签名:(实际上,这是非常相似的自签名的X.509证书,不颁发者和有效日期)

CertificationRequest ::= SEQUENCE { 
    certificationRequestInfo CertificationRequestInfo, 
    signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }}, 
    signature BIT STRING 
} 

从什么时候开始你得到了CRMF的请求,你不会有主题的私钥,你将无法做出这个签名。

如果您正在编写某种CA软件,您并不需要这些。处理CRMF请求和CSR请求或多或少是等同的。 CA不应该盲目地做CSR,因此无论如何,它都必须审核与公钥和身份相关的属性。

+0

感谢您的回答...是的,但我已经看到CRMF有一些名为拥有证明,其中带来签名内...我认为私钥签署公钥,这是按顺序添加(好吧,其实我希望如此)。这是因为CA和RA已经被开发出来了,并且团队谁否认做出任何改变。这个发展只是阅读了PKCS10的CSR。我发现的唯一解决方案是拆卸CRMF零件并组装成CSR –

+0

您将无法完成。根据定义,签名确保了确切的内容匹配。您可以签署您使用任何其他私钥重新构建的'certificationRequestInfo',但验证PKCS#10规范说明(必须由主题的私钥签名)的任何内容都将失败。如果企业社会责任没有验证签名(如果有其他验证,这不一定是个大问题),它可能会起作用。 – Bruno

+0

如果你需要修改,你可以检查[这个例子](https://github.com/harbulot/keygenapp/blob/174d6e7e7bea3130f9c780a55fbb2784342925b1/base/src/main/java/org/jsslutils/keygen/bouncy/BouncyKeygenService.java) CA代码:它不完整,但会告诉你如何处理PKCS#10,CRMF和SPKAC。 – Bruno