猿问

如何从签名文件 p7m/Enveloped 和 p7s/Enveloping 提取用

我需要从带有包络模式 (p7m) 或包络模式 (p7s) 的签名文件中提取其已签名的原始文件。


我很难弄清楚如何使用 bouncycastle 库来做到这一点。


我同时使用了 BouncyCastle 1.5 和 BouncyCastle 1.4


private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(GetOriginalContentFromFileSigned.class);


protected static CMSSignedData extractContent(InputStream buffer) throws IOException, CMSException {        

    CMSSignedData cms = null;

    CMSSignedData signature = new CMSSignedData(buffer);        

    Store cs = signature.getCertificates();

    SignerInformationStore signers = signature.getSignerInfos();

    Collection c = signers.getSigners();

    Iterator it = c.iterator();


    //the following array will contain the content of xml document

    byte[] data = null;


    while (it.hasNext()) {

        SignerInformation signer = (SignerInformation) it.next();

        Collection certCollection = cs.getMatches(signer.getSID());

        Iterator certIt = certCollection.iterator();

        X509CertificateHolder cert = (X509CertificateHolder) certIt.next();


        CMSProcessable sc = signature.getSignedContent();

        data = (byte[]) sc.getContent();

        cms = signature;

    }

    return cms;

}   


protected static byte[] getOriginalDocumentBinaries(InputStream signedDocument) {

    try (InputStream is = getOriginalDocumentStream(signedDocument)) {

        return IOUtils.toByteArray(is);

    } catch (Exception e) {

        logger.warn("Unable to retrieve original document binaries", e);

        return null;

    }

}



分代码摘自https://github.com/esig/dss项目


我缺少什么使方法“getOriginalDocumentBinaries”起作用?对我来说似乎没问题,但我不是充气城堡的专家。


问候。


慕容708150
浏览 278回答 2
2回答

月关宝盒

这个解决方案似乎有效:/*** Extract content from p7m file*/    private byte[] getOriginalDocumentBinaries(final byte[] signedDoc) throws SignerException {                ASN1InputStream asn1InputStream = null;        try {            asn1InputStream = new ASN1InputStream(new ByteArrayInputStream(signedDoc));            DERObject signedContent;            try {                signedContent = asn1InputStream.readObject();            }            catch (IOException cause) {                logger.error(cause.getMessage(), (Throwable)cause);                throw new SignerException(cause.getMessage(), cause);            }            CMSSignedData cmsSignedData;            try {                cmsSignedData = new CMSSignedData(ContentInfo.getInstance(signedContent));            }            catch (IllegalArgumentException cause2) {                logger.error(cause2.getMessage(), (Throwable)cause2);                throw new SignerException(cause2.getMessage(), cause2);            }catch (Throwable cause2) {                throw new SignerException(cause2.getMessage(), cause2);            }            return (byte[])((CMSProcessableByteArray)cmsSignedData.getSignedContent()).getContent();        }catch(Exception ex){            logger.error(ex.getMessage(),ex);            throw new SignerException(ex);        }        finally {            try {                asn1InputStream.close();            }            catch (IOException ex) {}        }    }

慕田峪7331174

我刚刚遇到了同样的问题,我实施了这个。我相信这可能对其他人有帮助。/***Extract from .p7m file and write into new file  */public void extractTxtFileFromP7M() throws Exception {    File file = new File(".p7m FilePath");    String fileName = FilenameUtils.removeExtension(file.getName());    byte[] p7mFileByteArray = fromFileToByteArray(file);    byte[] extractedFileByteArray = getData(p7mFileByteArray);    File extractedFile = new File("..../fileName");    FileUtils.writeByteArrayToFile(extractedFile, extractedFileByteArray);}private byte[] fromFileToByteArray(File file) {    try {        return FileUtils.readFileToByteArray(file);    } catch (IOException e) {        log.error("Error while reading .p7m file!", e);    }    return new byte[0];}private byte[] getData(final byte[] p7bytes) {    CMSSignedData cms = null;    try {        cms = new CMSSignedData(p7bytes);    } catch (CMSException e) {        log.error("Error while converting bytes to CMSSignedData : " + e.getMessage(), e);    }    if( cms == null || cms.getSignedContent() == null) {        return new byte[0];    }    return (byte[]) cms.getSignedContent().getContent();} 
随时随地看视频慕课网APP

相关分类

Java
我要回答