情况是我必须检查数字签名:
String1 "A1005056807CE11EE2B4CE0025305725CFrCN=KED,OU=I0020266601,OU=SAPWebAS,O=SAPTrustCommunity,C=DE20130611102236" 通过 PKCSURL#7 签名并通过 HTTP 发送给我。
我在 BASE64 中获得签名内容(查看代码 String sc)。
现在我必须检查,我稍后将在我的代码中重现的 String1 的哈希值是否与签名内容相同。因此,我必须使用我从证书中获得的公钥。
我有一个带有 X.509 证书的文件。我将此文件加载到 X509Certificate 实例中。我通过从 SAP 复制和粘贴字节来获得这个文件 - 所以我不确定证书是否正确。但是我可以将它加载到实例中 - 我已经把这个证书的输出放在下面。
现在,当我运行我的代码时,我得到“消息摘要属性值与计算值不匹配”。我不知道这些步骤是否正确,这条消息是否正确,还是我做错了什么!?
这是我的代码:
String sc = "MIIBUQYJKoZIhvcNAQcCoIIBQjCCAT4CAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGCAR0wggEZAgEBMG8wZDELMAkGA1UEBhMCREUxHDAaBgNVBAoTE1NBUCBUcnVzdCBDb21tdW5pdHkxEzARBgNVBAsTClNBUCBXZWIgQVMxFDASBgNVBAsTC0kwMDIwMjY2NjAxMQwwCgYDVQQDEwNLRUQCByASEgITMlYwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTEzMDYxMTA4MjM1MVowIwYJKoZIhvcNAQkEMRYEFGy7jXb/pUqMYdk2dss2Qe6hNroaMAkGByqGSM44BAMELjAsAhRMJ+t5/3RxQAsHKnIoPY4BnO0qCAIUAbKRwWNjOYsewB56zoZqnZwRyWw=";
byte[] secKey = Base64.decode(sc);
CMSSignedData s = new CMSSignedData(secKey);
SignerInformationStore signers = s.getSignerInfos();
Iterator<SignerInformation> it = signers.getSigners().iterator();
FileInputStream fis = new FileInputStream("c:\\sap.cer");
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection<X509Certificate> c = (Collection<X509Certificate>)cf.generateCertificates(fis);
Iterator<X509Certificate> i = c.iterator();
while(it.hasNext()){
SignerInformation signer = it.next();
while (i.hasNext()) {
X509Certificate cert = i.next();
cert.checkValidity(); …Run Code Online (Sandbox Code Playgroud)