2017-05-08 4 views
0

Ich versuche, Zertifikate über Cmp (Zertifikat-Management-Protokoll) bei einer Zertifizierungsstelle (der CMP-Server) zu widerrufen und den Fehlercode "ungültigen Signaturschlüsselcode". Ich denke, aufgrund der Art, wie ich die CMP-Nachricht signiere, ist da etwas schief gelaufen.Wie signiere ich eine CMP-Anfrage richtig? (Java, Hüpfburg)

baue ich den Header mit org.bouncycastle.asn1.cmp.PKIHeaderBuilder und den Körper mit org.bouncycastle.asn1.crmf.CertTemplateBuilder:

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(); 

Dann muss ich die ganze Nachricht unterzeichnen und es scheint um verschiedene Wege dafür zu sein. In extracerts (CMPCertificate) muss ich den öffentlichen Schlüssel der Signatur hinzufügen, die Signatur muss mit diesem öffentlichen Schlüssel verifizierbar sein. Wie signiere ich diese Nachricht für diese Art von Suchauftrag richtig? Ich habe org.bouncycastle.asn1.cmp.PKIMessages und org.bouncycastle.cert.cmp.ProtectedPKIMessage ausprobiert.

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; 

-> Fehler von cmp-Server: "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); 

-> Fehler von cmp-Server: "ERROR_READING_CMS_OBJECT_CODE"

Ist die Art und Weise, wie ich die cmp Anfrage Nachricht richtig signieren? Was ist der Unterschied zwischen PKIMessage und dem Argument 'protection' und org.bouncycastle.cert.cmp.ProtectedPKIMessage?

Antwort

0

dies ist die Art, wie ich

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) 

cmp fordert die Anmeldung verwenden;

+1

Es ist für mich arbeiten, Dank! – Simi

0

Ich fand auch eine andere Lösung von PKIMessage (nicht 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 }); 
Verwandte Themen