2017-05-08 4 views
0

J'essaie de révoquer les certificats via cmp (certificat de gestion de protocole) auprès d'une autorité de certification (le serveur cmp) et d'obtenir le code d'erreur "code de clé de signature invalide". Je pense que c'est parce que je signe le message cmp, quelque chose s'est mal passé.comment signer un message de requête cmp correctement? (java, bouncy castle)

-je construire l'en-tête avec org.bouncycastle.asn1.cmp.PKIHeaderBuilder et le corps avec 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(); 

Ensuite, je dois signer le message entier et il semble d'être différentes façons pour cela. Dans extracerts (CMPCertificate) je dois ajouter la clé publique de la signature, la signature doit être vérifiable avec cette clé publique. Comment puis-je signer correctement ce message pour ce type de réquisition? J'ai essayé org.bouncycastle.asn1.cmp.PKIMessages et 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; 

-> Erreur de serveur 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); 

-> Erreur de serveur cmp: "ERROR_READING_CMS_OBJECT_CODE"

Est-ce que la manière dont je signe le message de requête cmp est correcte? Quelle est la différence entre PKIMessage et l'argument 'protection' et org.bouncycastle.cert.cmp.ProtectedPKIMessage?

Répondre

0

c'est la façon dont je l'utilise pour signer les demandes 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

Il travaille pour moi, Merci! – Simi

0

J'ai aussi trouvé une autre solution en utilisant PKIMessage (non 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 });