2016-09-07 2 views
2

PKCS7 컨테이너를 사용하여 PDF 파일에 분리 서명을 만들고 싶습니다. 데이터 (해시)는 개인 키로 다른 장치에서 미리 서명됩니다. 공개 키가있는 인증서와 함께 서명 된 데이터가 포함 된 PKCS7을 만들고 싶습니다. 개인 키를 제공하지 않고 라이브러리에 데이터 서명을하지 않고 탄력이있는 PKCS7을 만들 수 없습니다.탄력성을 사용하여 미리 지정된 데이터로 PKCS7을 만듭니다.

 InputStream inStream = new FileInputStream("1_public.pem"); 
     BufferedInputStream bis = new BufferedInputStream(inStream); 

     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 

     List<Certificate> certList = new ArrayList<Certificate>(); 
     Certificate certificate = cf.generateCertificate(bis); 
     certList.add(certificate); 
     Store certs = new JcaCertStore(certList); 

     CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
     gen.addCertificates(certs); 
     CMSProcessableInputStream msg = new CMSProcessableInputStream(new ByteArrayInputStream("signedhash".getBytes())); 

     CMSSignedData signedData = gen.generate(msg, false); 
     byte[] pkcs7 = signedData.getEncoded())); 
+0

작동하지 않는 방법을 지정하십시오. – bmargulies

+0

서명 된 데이터가 pkcs7에 누락되었습니다 – rob2000

답변

3

내가이 일을 관리 실제로 매우 간단 서명하지 않는 ContentSigner를 제공함으로써 :

 InputStream inStream = new FileInputStream("1_public.pem"); 
     BufferedInputStream bis = new BufferedInputStream(inStream); 

     CertificateFactory cf = CertificateFactory.getInstance("X.509"); 

     List<Certificate> certList = new ArrayList<Certificate>(); 
     Certificate certificate = cf.generateCertificate(bis); 
     certList.add(certificate); 
     Store certs = new JcaCertStore(certList); 
     CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
     gen.addCertificates(certs); 

     final byte[] signedHash = "signedhash".getBytes(); 

     ContentSigner nonSigner = new ContentSigner() { 

      @Override 
      public byte[] getSignature() { 
       return signedHash; 
      } 

      @Override 
      public OutputStream getOutputStream() { 
       return new ByteArrayOutputStream(); 
      } 

      @Override 
      public AlgorithmIdentifier getAlgorithmIdentifier() { 
       return new DefaultSignatureAlgorithmIdentifierFinder().find("SHA256WithRSA"); 
      } 
     }; 

     org.bouncycastle.asn1.x509.Certificate cert = org.bouncycastle.asn1.x509.Certificate.getInstance(ASN1Primitive.fromByteArray(certificate.getEncoded())); 
     JcaSignerInfoGeneratorBuilder sigb = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build()); 
     sigb.setDirectSignature(true); 
     gen.addSignerInfoGenerator(sigb.build(nonSigner, new X509CertificateHolder(cert))); 
     CMSProcessableInputStream msg = new CMSProcessableInputStream(new ByteArrayInputStream("not used".getBytes())); 

     CMSSignedData signedData = gen.generate(msg, false); 
     byte[] pkcs7 = signedData.getEncoded(); 
0

은 "외부 서명이"수행 경우이 작동하지 않는 것 하드웨어 장치에 의해 "서명 된 속성"도 포함될 수 있습니다. 이 경우 코드도 포함해야합니다

AttributeTable signedAttributes = signer.getSignedAttributes(); 
signerInfoBuilder.setSignedAttributeGenerator(new SimpleAttributeTableGenerator(signedAttributes));  
signatureGenerator.addSignerInfoGenerator(signerInfoBuilder.build(nonSigner, signCertificate)); 

당신은 또한 완전한 예제가 여기 https://www.len.ro/work/attach-payload-into-detached-pkcs7-signature/ 찾을 수있는

signatureGenerator.setDirectSignature(true) 

을 제거해야합니다. 나는 해결책을 찾기 위해 많은 시간을 보냈고이 글은 필자가 여전히 기사에서 빠뜨린 정보를 완성해야한다는 중요한 단서를 제공했다. 감사.

+3

귀하의 사이트 인 경우 링크에 제휴를 추가하십시오 –

관련 문제