验证由CAPICOM生成的java(可能是Bouncy Castle)中的独立PKSC#7签名

时间:2011-10-14 12:27:49

标签: digital-signature

所有!

我正在解决两个问题:

  1. 停止使用CAPICOM签署/验证文档 - 因为Microsoft不再支持它(请参阅更多信息:Alternatives to Using CAPICOM
  2. 首先流出我们想要通过我们的系统(自定义Documentum webtop)支持浏览器的广泛列表。现在它完全支持IE 6+,因为CAPICOM用作ActiveX。
  3. 对于签名,我们使用Windows模块CryptoPro,因为它只在俄罗斯正式具有法律效力。我们的系统部署在俄罗斯一个地区的政府中。

    我们的系统已经运行了5年,并且有许多生成的标志(全部由CAPICOM提供)。标志分离并持久存储在数据库中。

    我们希望找到解决方案来验证java代码中的这些标志(包装在Applet中)。

    我已尝试过下面的代码,但我找不到任何合适的方法来验证任何签名。此方法始终返回false。

    public boolean verifyFile(String fileInput, String metadata, String base64Signature) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        byte[] signedContent = Base64.decode(base64Signature.getBytes("UTF-8"));
        CMSSignedData cms7 = new CMSSignedData(signedContent);
        CertStore certs = cms7.getCertificatesAndCRLs("Collection", "BC");
        SignerInformationStore signers = cms7.getSignerInfos();
        Collection c = signers.getSigners();
    
        SignerInformation signer = (SignerInformation)c.iterator().next();
        Collection certCollection = certs.getCertificates(signer.getSID());
        Iterator certIt = certCollection.iterator();
        X509Certificate cert = (X509Certificate)certIt.next();
    
        Signature signature = Signature.getInstance("SHA1withRSA", "BC");
        signature.initVerify(cert.getPublicKey());
        String signedContentString = getSignedDataString(fileInput, metadata);
        signature.update(signedContentString.getBytes("UTF-8"));
        return signature.verify(signer.getSignature());
    }
    

    有人解决方案或已经遇到过这个问题

0 个答案:

没有答案