我正在尝试对SAML2响应进行签名验证,该响应是使用OpenSAML从身份提供者获得的。 我正在尝试从localfile系统读取响应。

这是我的代码:

  DefaultBootstrap.bootstrap();
  BasicParserPool ppMgr = new BasicParserPool();
  ppMgr.setNamespaceAware(true);

 //Read file from the filesystem

 File file1=new File("F:/Softwares/Assertion.xml");
 InputStream inCommonSaml=new FileInputStream(file1);

 // Parse file
Document inCommonSamlDoc = ppMgr.parse(inCommonSaml);
Element metadataRoot = inCommonSamlDoc.getDocumentElement();
UnmarshallerFactory    unmarshallerFactory=configuration.getUnmarshallerFactory();
 Unmarshaller unmarshaller =    unmarshallerFactory.getUnmarshaller(metadataRoot);
 Response  inCommonSamlRes = (Response)  unmarshaller.unmarshall(metadataRoot);

  //Get certificate
   SignatureValidator signatureValidator = new SignatureValidator(cert);
   Signature  signature=inCommonSamlRes.getSignature();
   signatureValidator.validate(signature);


   try {
        BasicX509Credential credential = new BasicX509Credential();

        File file2=new File("F:/Softwares/publicKey.crt");
        InputStream samlCertificate=new FileInputStream(file2);         
          CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        //    
            @SuppressWarnings("deprecation")
            java.security.cert.X509Certificate certificate = (java.security.cert.X509Certificate) certificateFactory.generateCertificate(samlCertificate);
           // 

            X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec((certificate).getPublicKey().getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey key = keyFactory.generatePublic(publicKeySpec);


            credential.setPublicKey(key);
            Object obj = (credential).getPublicKey();
            if (obj instanceof RSAPublicKey) {
                BigInteger modulus = ((RSAPublicKey) obj).getModulus();
                BigInteger exponent = ((RSAPublicKey) obj).getPublicExponent();
                System.out.println("modulus");
                System.out.println (org.apache.commons.codec.binary.Base64.encodeBase64String(modulus.toByteArray()));
                System.out.println("public exponent:");
                System.out.println (org.apache.commons.codec.binary.Base64.encodeBase64String(exponent.toByteArray()));

    }
     //     System.out.println ("public key is: //n//r"+ credential.getPublicKey());
            return credential;  



    } catch (Exception e) {
        throw e; //Throws a 'Signature did not validate against the credential's key' exception
    }

注意:我也使用相同的证书(publicKey.crt)对声明进行签名。
我收到以下错误:签名密码验证不成功。

请让我知道我在哪里错了? 错误是什么意思? 它是否表示公钥和私钥相同?

谢谢,aswini J

#1楼 票数:0

我认为您需要从IdP(身份提供商)服务器获取.jks文件。 同样,当您从IDP的POST获取SAMLResponse时,此SAMLResponse应该包含签名(FYI-将是一个编码的字符串,您可以使用Maven Central信息库中的Open SAML库进行解码和读取)。 从获得签名后,您可以使用OpenSAML进行验证

sigValidator.validate(response.getSignature());

如果一切正常,此方法将为您提供消息。 参考消息“使用提供的credentia的密钥验证了签名”

您可以点击以下链接: http : //sureshatt.blogspot.in/2012/11/how-to-read-saml-20-response-with.html获取签名并

(IMP) :应该发送您的IDP(身份提供者)(可以通过HTTP POST),以便您可以从中获取具有NameID(即ClinetId)的信息

#2楼 票数:0

此答案适用于收到此错误并在Google上进行搜索的入网人员。

在我的情况下,我遇到了相同的错误:“ 错误:签名密码验证未成功 ”,情况略有不同。 我正在使用SimpleSamlPHP作为SP以及CAS作为IDP进行验证。

问题是我的SP使用一个(自签名)证书对IDP进行SP验证,而在Apache中使用另一个SP证书来允许SSL(这样我就可以拥有https)

对于登录和元数据验证之类的许多过程,使用两个单独的证书可能会很好,但是对于诸如注销之类的过程,则会发生上述错误。

解决方案是在两个过程中仅使用一个证书,而我的错误消失了。

  ask by Ashwini translate from so

未解决问题?本站智能推荐:

1回复

OpenSaml读取元数据

我正在尝试使用Open Saml 2从Idp读取元数据。当我尝试解组元数据openSaml时,仅显示该属性的getter以获得Unknown Atrributes()。 似乎我遗漏了一点,因为在读取Idp响应SAML时,代码可以很好地工作。 (它显示了返回断言列表的getAssertions
1回复

OpenSAML有什么意义? 还有其他选择

我目前正在设置SAML IDP。 起初,我认为spring-security-saml会对我有所帮助,但我发现它只能帮助设置SAML协议的SP端。 所以我想:让我们走吧,让我们使用OpenSAML来实现它。 这里有一个问题:那个图书馆实际上做了什么? 我知道这是一个低级库,但我不
2回复

服务提供商的元数据。 使用OpenSAML

我正在将opensaml用作充当服务提供者的应用程序。 到目前为止,我一直在手动创建SP元数据。 是否有Java中的示例来说明如何以编程方式生成服务提供程序元数据?
1回复

OpenSaml AuthnRequest 签名

我正在构建一个 SAML 2.0 AuthNRequest。 我设法使用 OpenSaml 添加签名信息,但找不到使用库添加<ds:SignatureValue/>和<ds:DigestValue/> VALUES 的方法。 这是代码: 我可以同时使用 HTTP-POST
1回复

SAML 2.0-如何验证发件人证书?

我用Java实现了SAML SP。 我将AuthnRequest发送到SAML 2.0 IDP并获得了加密的响应。 我的问题是: 如何确保响应确实来自IDP,而不是来自黑客? 验证签名是不够的,因为这只能告诉我发件人具有一对匹配的私钥/公钥,但是可以是任何人。 因此,我需要I
1回复

根据Credential验证SAML断言 - opensaml 3

我已经使用SAMLSignatureProfileValidator验证了签名,但根据我的理解,当我使用此验证签名时,它只确保响应未被篡改。 即它检查签名的结构以确保其格式良好。 如何使用IdP或凭证中的证书的publicKey验证SAML断言? 我是否必须手动找到证书节点并比较值..
1回复

opensaml断言签名验证

我有一个带有已声明的断言的SAML 2响应,并且响应本身已再次签名。 我使用下面的代码来验证响应的签名配置文件。 并在下面的代码块中验证签名。 但是我相信这些东西只能验证响应签名和响应签名概要文件。 我还需要验证断言签名吗? 我尝试使用下面的代码块来验证断言签名。 但这给
1回复

断言中的 SAML 签名验证

我有一个从第三方获得的 SAML。 我必须使用他们的公共证书来验证它。 我以前这样做过,但这次签名在断言中,所以我的Response.getSignature()返回 null。 我正在使用 Java OpenSAML 库,所以现在即使我得到断言并从下面的断言中得到签名,我的SignatureVa