如何使用Java从Word文件中检索数字签名数据?

时间:2015-03-26 06:38:25

标签: java apache-poi digital-signature sign digital-certificate

我有一个已经过数字签名的word / docx文件。

我需要打开文件并阅读签名主题,有效期,有效期和其他详细信息(包括RSA公钥)

我怎样才能从Java做到这一点?

以下链接对我没有帮助,因为我已经签署了一份文件。

Load RSA public key from file

我尝试使用apache poi,但不成功,只返回nulls

public static void main(String[] args) throws IOException, XmlException {
        String fileName = "test.docx";
        OPCPackage pkg = null;
        try {
            pkg = OPCPackage.open(fileName, PackageAccess.READ_WRITE);
        } catch (InvalidFormatException ex) {
            ex.printStackTrace();
        }
        SignatureConfig sic = new SignatureConfig();
        sic.getProxyUrl();
        sic.setOpcPackage(pkg);
        SignatureInfo si = new SignatureInfo();
        si.setSignatureConfig(sic);
        boolean isValid = si.verifySignature();

        System.out.println("isValid " + isValid);


        Iterator<SignaturePart> iter = si.getSignatureParts().iterator();
        while (iter.hasNext()) {
            SignaturePart element = iter.next();

            System.out.println("getSigner " + element.getSigner());

            List<X509Certificate> list = element.getCertChain();
            for (X509Certificate cc : list) {
                System.out.println("getSigAlgName " + cc.getSigAlgName());
                System.out.println("getSigAlgOID " + cc.getSigAlgOID());
                System.out.println("getNotAfter " + cc.getNotAfter());
                System.out.println("getNotBefore " + cc.getNotBefore());
            }


        }

但是检查isValid,返回true ..

1 个答案:

答案 0 :(得分:-1)

......然后

boolean isValid = si.verifySignature();
List<X509Certificate> result = new ArrayList<X509Certificate>();
for (SignaturePart sp : si.getSignatureParts()) {
    if (sp.validate()) {
        result.add(sp.getSigner());
    }
}
pkg.revert();
pkg.close();