我正在开发一个程序的开源版本,以便解密和验证电子邮件。
到目前为止,我遇到了客户的一些s / mime消息,这些消息无法验证(约1%)。代码没什么特别的。 (" SignInfos"是包含一些信息的自定义类型)
private SignInfos verify(SMIMESigned s, String pubcertfile)
{
try {
Security.addProvider(new BouncyCastleProvider());
Store certs = s.getCertificates();
SignerInformationStore signers = s.getSignerInfos();
Collection<SignerInformation> c = signers.getSigners();
Iterator<SignerInformation> it = c.iterator();
while (it.hasNext()) {
SignerInformation signer = (SignerInformation) it.next();
Collection certCollection = certs.getMatches(signer.getSID());
Iterator certIt = certCollection.iterator();
X509CertificateHolder ch = (X509CertificateHolder) certIt.next();
X509Certificate cert = new JcaX509CertificateConverter().setProvider("BC").getCertificate(ch);
JcaSimpleSignerInfoVerifierBuilder verifier = new JcaSimpleSignerInfoVerifierBuilder();
verifier.setProvider("BC");
SignerInformationVerifier siv = verifier.build(cert);
if (signer.verify(siv)) {
si.ok = true;
} else {
si.ok = false;
si.errortext = "Verification failed";
}
}
return si;
} catch (Exception e) {
logIt("Exception in verify: " + e.getMessage());
return si
}
}
我搜索了互联网,我对线端格式和编码感到困惑。什么都没有帮助。我还将给定的证书信息与签名中提供的证书进行了比较。它是一样的。一切都很好。
然后我尝试操纵一个字符。发生了什么? verify()方法将引发异常&#34;消息摘要属性值与计算值&#34;不匹配!所以我问自己差异在哪里。在第一种情况下,摘要应该是正确的,否则该方法会提升我上面提到的例外。
有什么想法吗?
提前致谢!
PS 对不起,我无法在这里向客户提供原始信息。