saml-2.0 – OpenSAML(2.0)签名验证无效

前端之家收集整理的这篇文章主要介绍了saml-2.0 – OpenSAML(2.0)签名验证无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题:

我正在使用OpenSAML构建一种方法来验证发布到我们服务器的SAML 2.0响应.我有大部分工作,能够访问断言的各个方面.唯一的问题是,当我尝试使用下面的公钥验证签名时,它指出“签名没有验证凭据的密钥”.

有任何想法吗?

公钥:

  1. MIICozCCAgygAwIBAgIGATxK1oY4MA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEG
  2. A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
  3. MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEcMBoGCSqGSIb3DQEJ
  4. ARYNaW5mb0Bva3RhLmNvbTAeFw0xMzAxMTcyMzI2MThaFw00MzAxMTcyMzI3MThaMIGUMQswCQYD
  5. VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG
  6. A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEc
  7. MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
  8. njQZkKTyJuS1evlG/ThBqGT9VID9RnN31yr1EQXYODs1pXy8w58QkztCWTvevj8GekbJ8dsVZ2Ij
  9. UXJ50psNL1zyq0cJp8M08E75SCwaH7Q9goaReIFpYQZTbTE9FMfGcsrNIFZyBsCXS2dm+FfuGDQ6
  10. 4/W0mxOHdYxqSTD+fvMCAwEAatanBgkqhkiG9w0BAQUFAAOBgQByeciVKaK5IKFPVzK3ZS37IOQm
  11. 2vDXZYXEzUaq1urk8gunQs75ZzgIsIh6jlUZy+FO3maAoVyW5mUzqT0jBTfI0Ea3vJfQAlgn4gW2
  12. eiqdbu1uI48a5K1+GneO1xzqTYzMXvUoJpXqoifsrikkpHHATF8z5Y4ULKgKFSBB9VypDg==

签名:

  1. <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  2. <ds:SignedInfo>
  3. <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
  4. <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
  5. <ds:Reference URI="#id7437579890833705637451361">
  6. <ds:Transforms>
  7. <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
  8. <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
  9. </ds:Transforms>
  10. <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
  11. <ds:DigestValue>zIoW9N/wJrjwXfQS7I5jNyZqbJQ=</ds:DigestValue>
  12. </ds:Reference>
  13. </ds:SignedInfo>
  14. <ds:SignatureValue>ZybzDLQ2Q8RiIqyShZFNKR8+vbVhjsAT18hIh6IcqDO5ER2ah5Fs1bErmgeITatRNgdqzxgX4jErtkituiI3vdr56g5kmaTKHf2lrU6OLW3JHUokCt9Bv9E7duvnpGEA0uFvzNMVMcqZOGUbJ1m1lkYxUIIaeOjSxPjBTZB+g3A=</ds:SignatureValue>
  15. <ds:KeyInfo>
  16. <ds:X509Data>
  17. <ds:X509Certificate>MIICozCCAgygAwIBAgIGATxK1oY4MA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEG
  18. A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
  19. MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEcMBoGCSqGSIb3DQEJ
  20. ARYNaW5mb0Bva3RhLmNvbTAeFw0xMzAxMTcyMzI2MThaFw00MzAxMTcyMzI3MThaMIGUMQswCQYD
  21. VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG
  22. A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEc
  23. MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
  24. njQZkKTyJuS1evlG/ThBqGT9VID9RnN31yr1EQXYODs1pXy8w58QkztCWTvevj8GekbJ8dsVZ2Ij
  25. UXJ50psNL1zyq0cJp8M08E75SCwaH7Q9goaReIFpYQZTbTE9FMfGcsrNIFZyBsCXS2dm+FfuGDQ6
  26. 4/W0mxOHdYxqSTD+fvMCAwEAatanBgkqhkiG9w0BAQUFAAOBgQByeciVKaK5IKFPVzK3ZS37IOQm
  27. 2vDXZYXEzUaq1urk8gunQs75ZzgIsIh6jlUZy+FO3maAoVyW5mUzqT0jBTfI0Ea3vJfQAlgn4gW2
  28. eiqdbu1uI48a5K1+GneO1xzqTYzMXvUoJpXqoifsrikkpHHATF8z5Y4ULKgKFSBB9VypDg==</ds:X509Certificate>
  29. </ds:X509Data>
  30. </ds:KeyInfo>
  31. </ds:Signature>

执行:

  1. try {
  2. //Retrieve SAML response from post
  3. Document document = ppMgr.parse(request.getInputStream());
  4. UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory();
  5. Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(document.getDocumentElement());
  6. response = (Response)unmarshaller.unmarshall(document.getDocumentElement());
  7.  
  8. //Get Public Key
  9. BasicX509Credential publicCredential = new BasicX509Credential();
  10. File publicKeyFile = new File("C:/saml.cer");
  11.  
  12. if (publicKeyFile.exists()) {
  13. CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
  14. InputStream fileStream = new FileInputStream(publicKeyFile);
  15. X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(fileStream);
  16. fileStream.close();
  17.  
  18. X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(certificate.getPublicKey().getEncoded());
  19. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  20. key = keyFactory.generatePublic(publicKeySpec);
  21.  
  22. //Validate Public Key against Signature
  23. if (key != null) {
  24. publicCredential.setPublicKey(key);
  25. SignatureValidator signatureValidator = new SignatureValidator(publicCredential);
  26. signatureValidator.validate(signature);
  27. }
  28. }
  29.  
  30. returnValue = true;
  31. } catch (ValidationException e) {
  32. throw e; //Throws a 'Signature did not validate against the credential's key' exception
  33. }
好吧,事实证明上面的代码是正确的.这是样本SAML响应不正确.我想从这一切中吸取的教训是相信你的实现:)

猜你在找的XML相关文章