2016-08-25 9 views
2

Я генерирую файлы сигнатур CMS с внешним PKCS # 1 на основе этого thread.

Первый шаг - получить подписанные атрибуты из исходного файла, который будет подписан во внешнем приложении, который возвращает массив байтов PKCS # 1.Сгенерировать действительный файл подписи CMS, добавляющий внешний PKCS # 1 с Java

Затем построить стандартный org.bouncycastle.cms.SignerInfoGenerator с оригинальным файла хэша, подписанная данные (PKCS # 1) и сертификат для добавления в CMS, и, наконец, создать присоединенную подпись.

Но когда я бы попытался проверить его с помощью этого кода:

 String originalFile = "aG9sYQ0KYXNkYXMNCg0KYWZzDQo="; 
     String cmsSignedFile = "MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBg...j2Dwytp6kzQNwtXGO8QbWty1lOo8oYm+6LR8EWba3ikO/m9ol/G808vit9gAAAAAAAA=="; 
     byte[] signedByte = DatatypeConverter.parseBase64Binary(cmsSignedFile); 

     Security.addProvider(new BouncyCastleProvider()); 

     CMSSignedData s = new CMSSignedData(new CMSProcessableByteArray(DatatypeConverter.parseBase64Binary(originalFile)), signedByte); 
     SignerInformationStore signers = s.getSignerInfos(); 
     SignerInformation signerInfo = (SignerInformation)signers.getSigners().iterator().next(); 

     FileInputStream fis = new FileInputStream("C:/myCertificate.cer"); 
     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
     X509Certificate cert = (X509Certificate)cf.generateCertificates(fis).iterator().next(); 

     boolean result = signerInfo.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert.getPublicKey())); 
     System.out.println("Verified: "+result); 


я получаю проверенный: ложный

Я добавляю Тип содержимого, время подписи, Message Digest и OCSP как знаковый атрибуты и TSP Token как атрибут unsigned (я не уверен, что это правильно).

Я также пытаюсь восстановить данные с CMS подписи, используя код ниже:

 //load cms signed file with attached data 
     CMSSignedData cms = new CMSSignedData(FileUtils.readFileToByteArray(new File("C:/tmp/tempFile1864328163858309463.cms"))); 

     System.out.println(cms.getSignerInfos().getSigners().iterator().next().getDigestAlgorithmID().getAlgorithm().getId()); 
     System.out.println(Hex.encodeHexString(cms.getSignerInfos().getSigners().iterator().next().getSignature())); 

     //recover signer certificate info 
     Store certs = cms.getCertificates(); 
     Collection<X509CertificateHolder> col = certs.getMatches(null); 
     X509CertificateHolder []h1 = col.toArray(new X509CertificateHolder[col.size()]); 
     X509CertificateHolder firmante = h1[0]; 
     System.out.println(firmante.getSubject()); 
     System.out.println(h1[1].getSubject()); 
     SignerInformation sinfo = cms.getSignerInfos().getSigners().iterator().next(); 

     //recover OCSP information 
     //THIS FAILS :(
//   Store infocspbasic = cms.getOtherRevocationInfo(OCSPObjectIdentifiers.id_pkix_ocsp_basic); 
//   Object basic = infocspbasic.getMatches(null).iterator().next(); 


     //recover signing time 
     if (sinfo.getSignedAttributes() != null) { 

      Attribute timeStampAttr = sinfo.getSignedAttributes().get(PKCSObjectIdentifiers.pkcs_9_at_signingTime); 
      ASN1Encodable attrValue = timeStampAttr.getAttrValues().getObjectAt(0); 

      final Date signingDate; 
      if (attrValue instanceof ASN1UTCTime) { 
       ASN1UTCTime time = ASN1UTCTime.getInstance(attrValue); 
       Date d = time.getDate(); 
       System.out.println("ASN1UTCTime:" + d); 
      } else if (attrValue instanceof Time) { 
       signingDate = ((Time) attrValue).getDate(); 
      } else if (attrValue instanceof ASN1GeneralizedTime) { 
       System.out.println("ASN1GeneralizedTimeASN1GeneralizedTime"); 
      } else { 
       signingDate = null; 
      } 
     } 


     //recover timestamp TOken 
     //unsigned attributes are null :(
     if (sinfo.getUnsignedAttributes() != null) { 

      Attribute timeStampAttr = sinfo.getUnsignedAttributes().get(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken); 

      for (ASN1Encodable value : timeStampAttr.getAttrValues().toArray()) { 
       TimeStampToken token = new TimeStampToken(new CMSSignedData(value.toASN1Primitive().getEncoded())); 
       System.out.println(token.getTimeStampInfo().getGenTime()); 
      } 

     } 

Но я не могу получить ответ OCSP, ни информацию TSP токена. Кроме того, я скачал этот viewer software, чтобы помочь проверить это:

P7S Viewer

Любая помощь будет очень высокую оценку.

ответ

0

Я нашел проект под названием j4sign, который реализует подпись CMS с внешним PKCS # 1. Ссылка идет на форум проекта, где я разместил образец кода, используя их классы, и окончательную коррекцию, чтобы сделать валидацию.

 Смежные вопросы

  • Нет связанных вопросов^_^