OpenSAML (2.0) 签名验证不起作用

2023-11-23

Problem:

我正在使用 OpenSAML 构建一种对发布到我们服务器的 SAML 2.0 响应进行身份验证的方法。我已经完成了大部分工作,能够访问断言的各个方面。唯一的问题是,当我尝试使用下面的公钥验证签名时,它指出“签名未根据凭证的密钥进行验证".

有任何想法吗?

公钥:

MIICozCCAgygAwIBAgIGATxK1oY4MA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEG
A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEcMBoGCSqGSIb3DQEJ
ARYNaW5mb0Bva3RhLmNvbTAeFw0xMzAxMTcyMzI2MThaFw00MzAxMTcyMzI3MThaMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG
A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEc
MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
njQZkKTyJuS1evlG/ThBqGT9VID9RnN31yr1EQXYODs1pXy8w58QkztCWTvevj8GekbJ8dsVZ2Ij
UXJ50psNL1zyq0cJp8M08E75SCwaH7Q9goaReIFpYQZTbTE9FMfGcsrNIFZyBsCXS2dm+FfuGDQ6
4/W0mxOHdYxqSTD+fvMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQByeciVKaK5IKFPVzK3ZS37IOQm
2vDXZYXEzUaq1urk8gunQs75ZzgIsIh6jlUZy+FO3maAoVyW5mUzqT0jBTfI0Ea3vJfQAlgn4gW2
eiqdbu1uI48a5K1+GneO1xzqTYzMXvUoJpXqoifsrikkpHHATF8z5Y4ULKgKFSBB9VypDg==

签名:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
        <ds:Reference URI="#id7437579890833705637451361">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue>zIoW9N/wJrjwXfQS7I5jNyZqbJQ=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>ZybzDLQ2Q8RiIqyShZFNKR8+vbVhjsAT18hIh6IcqDO5ER2ah5Fs1bErmgeITatRNgdqzxgX4jErtkituiI3vdr56g5kmaTKHf2lrU6OLW3JHUokCt9Bv9E7duvnpGEA0uFvzNMVMcqZOGUbJ1m1lkYxUIIaeOjSxPjBTZB+g3A=</ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
            <ds:X509Certificate>MIICozCCAgygAwIBAgIGATxK1oY4MA0GCSqGSIb3DQEBBQUAMIGUMQswCQYDVQQGEwJVUzETMBEG
A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU
MBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEcMBoGCSqGSIb3DQEJ
ARYNaW5mb0Bva3RhLmNvbTAeFw0xMzAxMTcyMzI2MThaFw00MzAxMTcyMzI3MThaMIGUMQswCQYD
VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG
A1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDHdlc3Rlcm51bmlvbjEc
MBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
njQZkKTyJuS1evlG/ThBqGT9VID9RnN31yr1EQXYODs1pXy8w58QkztCWTvevj8GekbJ8dsVZ2Ij
UXJ50psNL1zyq0cJp8M08E75SCwaH7Q9goaReIFpYQZTbTE9FMfGcsrNIFZyBsCXS2dm+FfuGDQ6
4/W0mxOHdYxqSTD+fvMCAwEAATANBgkqhkiG9w0BAQUFAAOBgQByeciVKaK5IKFPVzK3ZS37IOQm
2vDXZYXEzUaq1urk8gunQs75ZzgIsIh6jlUZy+FO3maAoVyW5mUzqT0jBTfI0Ea3vJfQAlgn4gW2
eiqdbu1uI48a5K1+GneO1xzqTYzMXvUoJpXqoifsrikkpHHATF8z5Y4ULKgKFSBB9VypDg==</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</ds:Signature>

执行:

try {
    //Retrieve SAML response from post
    Document document = ppMgr.parse(request.getInputStream());
    UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory();
    Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller(document.getDocumentElement());
    response = (Response)unmarshaller.unmarshall(document.getDocumentElement());

    //Get Public Key
    BasicX509Credential publicCredential = new BasicX509Credential();
    File publicKeyFile = new File("C:/saml.cer");

    if (publicKeyFile.exists()) {
        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        InputStream fileStream = new FileInputStream(publicKeyFile);
        X509Certificate certificate = (X509Certificate)certificateFactory.generateCertificate(fileStream);
        fileStream.close();

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

        //Validate Public Key against Signature
        if (key != null) {
            publicCredential.setPublicKey(key);
            SignatureValidator signatureValidator = new SignatureValidator(publicCredential);
            signatureValidator.validate(signature);
        }
    }

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

嗯,事实证明上面的代码is正确的。错误的是示例 SAML 响应。我想从这一切中吸取的教训是相信你的实施:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenSAML (2.0) 签名验证不起作用 的相关文章

随机推荐

  • 如何使用 JSF 和导航规则创建带参数的 GET 请求?

    有没有办法使用 h outputLink 其他 JSF 标记或代码创建 html 链接 以创建带有请求参数的非 faces 请求 HTTP GET 例如我有以下导航规则
  • 从 F# 中具有 N 个不同索引的序列中取出 N 个元素

    我是 F 新手 正在寻找一个采用 N 索引和序列并给我 N 个元素的函数 如果我有 N 个索引 它应该等于 concat Seq nth index0 Seq nth index1 Seq nth indexN 但它应该只扫描序列中的 in
  • 当基础镜像为 centos 与 ubuntu:trusty 时,以 shell 形式运行 CMD/ENTRYPOINT 时,不同进程以 PID 1 运行

    使用以下 dockerfile 构建并运行图像 Dockerfile1 FROM ubuntu trusty ENTRYPOINT ping localhost 现在运行以下命令来查看容器中运行的进程 docker exec it
  • “String[]::new”是什么意思?

    我正在学习如何使用流 但我遇到了这个方法的问题 public static String inArray String array1 String array2 return Arrays stream array1 filter str
  • 何时使用 AtomicReference (Java)?真的有必要吗?

    我已经多次使用 AtomicLong 但我从未需要使用 AtomicReference 看来 AtomicReference 可以做到其中之一 我从另一个 stackoverflow 复制了这段代码 问题 public synchroniz
  • 从私钥生成 ssh 公钥

    我有私人 ssh id rsa 密钥 我如何从中生成公钥 选项 y输出公钥 来自linux手册ssh keygen命令 y 此选项将读取私有 OpenSSH 格式文件并打印 一个 到标准输出的 OpenSSH 公钥 ssh keygen y
  • Google Drive API v3:没有任何方法可以获取 google 文档的下载网址吗?

    Google Drive API v2 到 v3迁移指南 says ExportLinks 字段已从文件中删除 要导出 Google 文档 请改用 files export 方法 我不想立即导出 下载 文件 files export 实际上
  • 自动调整 JButton 图标大小

    所以我有一个 JButtons 我在其中添加了图标 图标最初太大 所以我事先调整了它们的大小 效果很好 除了当我调整窗口大小时 JButton 会更改大小 但图标不会更改 这是有问题的 有没有办法让图标只填充它所附加的 JButton 一些
  • 在 Node.js 中等待多个回调

    我有一个 Node js 应用程序 其中可能会调用多个函数 具体取决于多个因素 但在最后一个回调后仅调用最后一个函数 这是我得到的简化版本 if foo bar function1 arg1 function val1 doWhatever
  • WPF ListView 非活动选择颜色

    I m creating a WPF application where several ListView selections are made in a row similar to the iTunes browser The pro
  • 将函数应用于 pandas 数据框中的组

    我正在尝试将简单的函数应用于 pandas 中的组 我有这个数据框 我可以根据它进行分组type df pandas DataFrame id a b c d v 1 2 3 4 type X Y Y Y set index id df g
  • 有没有办法阻止在 R Shiny 中打开下载页面?

    在闪亮的应用程序中单击下载按钮后 将打开一个新页面来初始化下载 但是 我的下载处理程序需要一些时间来生成可下载文件 该文件显示在闪亮主页面的进度栏中 有没有办法让用户留在主页上或阻止下载页面打开或推迟下载页面直到文件生成为止 非常感谢 Ma
  • 笑话如何在 package.json 脚本中设置文件模式

    我在 package json 中有 scripts test cross env NODE ENV test jest 我想测试所有文件匹配模式 front test js but if scripts test cross env NO
  • firebase Android 应用程序无法使用移动数据

    每当我连接移动数据时 我的 Firebase Android 应用程序都无法运行 身份验证 数据库和存储等所有功能均无法访问 我目前在印度 使用 Aircel sim 卡 是 Firebase 服务器还是我的网络提供商的问题 logcat
  • 将纬度/经度转换为 R 中的海拔高度

    有谁知道 R 中是否有一个工具可以在给定纬度和经度的情况下查找某个位置的海拔高度 或者您可以使用从 geonames 查找的包 并从 srtm3 数字高程模型中获取值 首先通过注册获得 geonames 用户名geonames org 然后
  • 如何从自定义属性中确定附加类型?

    我有一个可以分配给一个类的自定义属性 FooAttribute 我想做的是 从属性内部确定哪种类型实际使用了我 例如如果我有 FooAttribute public class Bar 在 FooAttribute 的代码中 如何确定是 B
  • 我可以将 用于高度和宽度受限的图像吗?

    我有一个幻灯片之类的东西 其中图像将尽可能大地扩展 但不会超过视口的宽度或高度 基本上object fit contain 我想让这些图像具有响应能力 因为对于手机和大型桌面来说 尽可能大 是有很大区别的 我不能使用 img 因为现在 它只
  • ddslick 选择选项不会发布所选选项的值 - jquery 插件

    我正在使用 ddslick 制作带有图标的下拉菜单 唯一的问题是当我发布表单时所选选项的值始终为空 如果我关闭 ddslick 则工作正常
  • 处理大位图

    我有一堆图像网址 我必须下载这些图像并将它们一一显示在我的应用程序中 我正在使用将图像保存在集合中SoftReferences以及 Sdcard 上以避免重新获取并改善用户体验 问题是我对位图的大小一无所知 事实证明 当我使用时 我偶尔会遇
  • OpenSAML (2.0) 签名验证不起作用

    Problem 我正在使用 OpenSAML 构建一种对发布到我们服务器的 SAML 2 0 响应进行身份验证的方法 我已经完成了大部分工作 能够访问断言的各个方面 唯一的问题是 当我尝试使用下面的公钥验证签名时 它指出 签名未根据凭证的密