2017-05-08 11 views
0

認証局(cmpサーバ)でcmp(証明書管理プロトコル)を超えて証明書を取り消し、エラーコード「無効な署名キーコード」を取得しようとしました。私はそれが私がcmpメッセージに署名する方法のためにその何かが間違っていたと思う。私は全体のメッセージに署名する必要があり、そこに思わその後cmp要求メッセージに正しく署名する方法は?

CertTemplateBuilder builderCer = new CertTemplateBuilder(); 

// cert to revoke 
builderCer.setIssuer(issuer);    
builderCer.setSerialNumber(serial); 

//body 
ArrayList revDetailsList = new ArrayList(); 
revDetailsList.add(new RevDetails(builderCer.build())); 
RevReqContent revReqContent = new RevReqContent((RevDetails[]) revDetailsList.toArray(new RevDetails[revDetailsList.size()])); 
PKIBody body = new PKIBody(PKIBody.TYPE_REVOCATION_REQ, revReqContent); 

// header 
X509Name recipient = new X509Name("CN=recipient"); 
X509Name sender = new X509Name("CN=sender"); 
int pvno = 1; 
PKIHeaderBuilder builderHeader = new PKIHeaderBuilder(pvno, new GeneralName(sender), new GeneralName(recipient)); 
AlgorithmIdentifier algId = new AlgorithmIdentifier(new ASN1ObjectIdentifier("1.2.840.10045.4.1")); 
builderHeader.setProtectionAlg(algId); 
PKIHeader header = builderHeader.build(); 

私はorg.bouncycastle.asn1.crmf.CertTemplateBuilderとorg.bouncycastle.asn1.cmp.PKIHeaderBuilderとヘッダとボディを構築しますそのためには別の方法が必要です。 extracerts(CMPCertificate)では、私は署名の公開鍵を追加しなければなりません、署名はこの公開鍵で検証可能でなければなりません。このような要求に対して正しくこのメッセージに署名するにはどうすればよいですか?私はorg.bouncycastle.asn1.cmp.PKIMessagesとorg.bouncycastle.cert.cmp.ProtectedPKIMessageを試しました。

PKIMessages:

DERBitString signature = new DERBitString(createSignature("signature".getBytes())); 
X509Certificate signercert = convertToX509Cert(certPEM); 
CMPCertificate cmpCert = new CMPCertificate(org.bouncycastle.asn1.x509.Certificate.getInstance(signercert.getEncoded())); 

PKIMessage message = new PKIMessage(header, body, signature, new CMPCertificate[] { cmpCert }); 

// createsignature() 
private static byte[] createSignature(byte[] str){ 
Signature dsa = Signature.getInstance("SHA256WithRSA"); 
dsa.initSign(privateKey); 
dsa.update(str, 0, str.length); 
signature = dsa.sign(); 
return signature; 

- CMPサーバから>エラー: "SIGNATURE_INVALID_KEY_CODE"

ProtectedPKIMessage:

ContentSigner signer = new JcaContentSignerBuilder("SHA1WithRSAEncryption").setProvider(BouncyCastleProvider.PROVIDER_NAME).build((PrivateKey) ks.getKey(KEYSTORE_ALIAS, KEYSTORE_PWD.toCharArray())); 

ProtectedPKIMessage message = new ProtectedPKIMessageBuilder(pvno, new GeneralName(sender), new GeneralName(recipient)) 
.addCMPCertificate(new X509CertificateHolder(ks.getCertificate(KEYSTORE_ALIAS).getEncoded())) 
.setBody(body).build(signer); 

- CMPサーバから>エラー: "ERROR_READING_CMS_OBJECT_CODE"

cmp要求メッセージにどのように署名するのですか? PKIMessageと 'protection'引数とorg.bouncycastle.cert.cmp.ProtectedPKIMessageの違いは何ですか?

答えて

0

これは私がCMPは

GeneralName generalName = new GeneralName(subjectDN); 
ProtectedPKIMessageBuilder pbuilder = new 
ProtectedPKIMessageBuilder(generalName, 
        protectedPKIMessage.getHeader().getSender()); 
      pbuilder.setBody(pkibody); 
      ContentSigner msgsigner = new 
      JcaContentSignerBuilder(contentSignerBuilder)// 
        .setProvider("BC")// 
        .build(getKey().getPrivate()); 

      ProtectedPKIMessage message = pbuilder.build(msgsigner) 

を要求サインインに使用する方法です。

+1

それは私のために働いて、感謝を! – Simi

0

は私もPKIMessage(ないProtectedPKIMessage)を使用して、別の解決策を見つけた:

// ProtectedPart from bouncy castle 
ProtectedPart protectedPart = new ProtectedPart(header, body); 

Signature signature = Signature.getInstance("1.2.840.113549.1.1.11", "BC"); 
signature.initSign((PrivateKey) key); 
signature.update(protectedPart.getEncoded()); 
byte[] sigBytes = signature.sign(); 
DERBitString signatureDER = new DERBitString(sigBytes); 

PKIMessage message = new PKIMessage(header, body, signatureDER, new CMPCertificate[] { cmpCert }); 
関連する問題