在 python 中验证 SAML 签名

2023-12-09

我需要使用 SAML2 从第三方在 python 中实现身份验证。我调查过pysaml2并发现这很令人困惑,并决定给予M2Crypto我发现之后有机会这个问题 by Ennael.

我收到的 SAML 令牌可以在这里找到。我已经从其中提取了我需要的所有信息Assertion标签(用户的 SSN、IP 和 SAML 令牌过期窗口),但我无法获取verify_signature来自 Ennael 的函数(以及修改后的代码 from 埃兹拉·努格罗霍) 返回 True。我也曾尝试过改变verify_EVP.reset_context(md='sha1') to verify_EVP.reset_context(md='sha256')但这也不起作用。

我想我的错误一定是在signed_info部分。我要传递什么verify_signature对于那部分?我必须以任何方式对其进行预处理吗?我一直在研究 Transform 标签,但不知道下一步该看哪里。

任何帮助将不胜感激。如果有人需要混淆前的 XML 来测试并帮助我,请私信我。

EDIT这是我的代码(与我链接到的代码非常相似。主要功能位于底部):

def verify_signature(signed_info, cert, signature):
    from M2Crypto import EVP, RSA, X509, m2
    x509 = X509.load_cert_string(base64.decodestring(cert), X509.FORMAT_DER)
    pubkey = x509.get_pubkey().get_rsa()
    verify_EVP = EVP.PKey()
    verify_EVP.assign_rsa(pubkey)
    verify_EVP.reset_context(md='sha1')
    verify_EVP.verify_init()
    verify_EVP.verify_update(signed_info)

    return verify_EVP.verify_final(signature.decode('base64'))

def decode_response(resp):
    return base64.b64decode(resp)

def get_xmldoc(xmlstring):
    return XML(xmlstring)


def get_signature(doc):
    return doc.find('{http://www.w3.org/2000/09/xmldsig#}Signature')


def get_signed_info(signature):
    signed_info = signature.find(
        '{http://www.w3.org/2000/09/xmldsig#}SignedInfo')
    signed_info_str = tostring(signed_info)
    # return parse(StringIO(signed_info_str))
    return signed_info_str


def get_cert(signature):
    ns = '{http://www.w3.org/2000/09/xmldsig#}'
    keyinfo = signature.find('{}KeyInfo'.format(ns))
    keydata = keyinfo.find('{}X509Data'.format(ns))
    certelem = keydata.find('{}X509Certificate'.format(ns))
    return certelem.text


def get_signature_value(signature):
    return signature.find(
        '{http://www.w3.org/2000/09/xmldsig#}SignatureValue').text

def parse_saml(saml):
    dec_resp = decode_response(saml)
    xml = get_xmldoc(dec_resp)

    signature = get_signature(xml)
    signed_info = get_signed_info(signature)
    cert = get_cert(signature)
    signature_value = get_signature_value(signature)

    is_valid = verify_signature(signed_info, cert, signature_value)

UPDATE:我是否需要第三方身份验证提供商提供更多信息?我需要私钥才能完成这些操作吗?


我遇到了同样的问题,必须为其开发一个模块:https://github.com/kislyuk/signxml。我选择仅依赖 PyCrypto 和 pyOpenSSL,因为 M2Crypto 不太流行且维护得不好,从兼容性(例如 PyPy)和安全角度来看,这都是一个危险。我还使用 lxml 进行规范化(c14n)。来自signxml文档:

from signxml import xmldsig

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

在 python 中验证 SAML 签名 的相关文章

  • 如何在算术表达式的结果上添加 SQLAlchemy 标签?

    我如何将这样的东西翻译成 SQLAlchemy select x y as difference 我知道该怎么做 x label foo 但我不确定在哪里放置下面的 label 方法调用 select table c x table c y
  • 如何在“python setup.py test”中运行 py.test 和 linter

    我有一个项目setup py文件 我用pytest作为测试框架 我还在我的代码上运行各种 linter pep8 pylint pydocstyle pyflakes ETC 我用tox在多个 Python 版本中运行它们 并使用以下命令构
  • 如何从网站中提取冠状病毒病例?

    我正在尝试从网站中提取冠状病毒 https www trackcorona live https www trackcorona live 但我得到了一个错误 这是我的代码 response requests get https www t
  • pandas 两个数据框交叉连接[重复]

    这个问题在这里已经有答案了 我找不到有关交叉联接的任何内容 包括合并 联接或其他一些内容 我需要使用 my function 作为 myfunc 处理两个数据帧 相当于 for itemA in df1 iterrows for itemB
  • 在python中调用subprocess.Popen时“系统找不到指定的文件”

    我正在尝试使用svnmerge py合并一些文件 它在底层使用 python 当我使用它时 我收到一个错误 系统找不到指定的文件 工作中的同事正在运行相同版本的svnmerge py 以及 python 2 5 2 特别是 r252 609
  • 我有一个 Employee 类,我想返回“姓名”列表

    我有一个 Employee 类 我想返回 姓名 列表 雇员 py class Employee object def init self id name members None self id id self name name self
  • 将具有不同大小的行的数据加载到 Numpy 数组中

    假设我有一个包含如下数据的文本文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 如何将它加载到 numpy 数组中 使其看起来像这样 1 2 3 4 5 0 6 7 8 0 0 0 9 1
  • 与函数复合 UniqueConstraint

    一个快速的 SQLAlchemy 问题 我有一个 文档 类 其属性为 数字 和 日期 我需要确保没有重复的号码同年 是 有没有办法对 数字 年份 日期 进行UniqueConstraint 我应该使用唯一索引吗 我如何声明功能部分 SQLA
  • 如何将 Xml 文件转换为文本文件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有大约 8000 个 xml 文件需要转换为文本文件 文本文件必须包含 xml 文件的标题 描述和关键字 不含标签 并删除其他元素和
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • 尝试使用 SQL 身份验证登录失败

    我正在尝试使用 sa 用户名及其密码连接到 SQL Server 2008 在 SQL Server 日志文件中我看到以下错误 用户 sa 登录失败 原因 尝试使用 SQL 登录 认证失败 服务器配置为 Windows 身份验证 仅有的 当
  • Windows 与 Linux 文本文件读取

    问题是 我最近从 Windows 切换到 Ubuntu 我的一些用于分析数据文件的 python 脚本给了我错误 我不确定如何正确解决 我当前仪器的数据文件输出如下 Header 有关仪器等的各种信息 Data 状态 代码 温度 字段等 0
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 使用Python重命名目录中的多个文件

    我正在尝试使用以下 Python 脚本重命名目录中的多个文件 import os path Users myName Desktop directory files os listdir path i 1 for file in files
  • Django - 缺少 1 个必需的位置参数:'request'

    我收到错误 get indiceComercioVarejista 缺少 1 个必需的位置参数 要求 当尝试访问 get indiceComercioVarejista 方法时 我不知道这是怎么回事 views from django ht

随机推荐

  • 单击 JPanel 绘制形状

    我有一个包含 3 个 JPanel 的 JFrame 选项 菜单 画布 在选项中有许多代表形状的 JButton 目的是单击形状的 JButton 例如矩形 然后单击画布上的任意位置 形状将绘制在那里 由于某种原因 形状并不总是被绘制 只有
  • C# 打开文件并传递参数给关联的应用程序

    我正在尝试启动为指定附加参数的扩展注册的默认应用程序 ProcessStartInfo p new ProcessStartInfo p Arguments myargument p FileName file ext Process St
  • Symfony2 - 覆盖模板包

    我想覆盖默认的 SonataAdmin 模板 我在我的命名空间 bundle resources views中创建了一个standard layout html twig 相同结构 相同文件名 相同内容 我将源模板的所有内容复制到目标模板中
  • MongoDB:有没有办法使用聚合来检测价值趋势?

    我正在尝试检测集合中值的 趋势 假设我有以下内容 created at 2014 12 01 value 1015 created at 2014 12 01 value 1015 created at 2014 12 01 value 1
  • 处理 IE 中的跨帧按键

    我一直在努力处理onkeydown通过 JavaScript 跨多个框架的事件 不 不幸的是我无法摆脱框架 请参阅我之前的问题here 我正在另一个框架中获取文档的句柄 并将其设置为onkeydown处理程序等于我的函数 没有抛出错误 但是
  • 如何在联结表中进行编辑

    在连接表中进行编辑的最佳实践是什么 Items ItemId Name Price Shops ShopId Name Address ItemsInShops ItemId ShopId DeliveryDate 现在我一家店里有30件商
  • Javascript - 如何检查 window.open(url) 是否成功?

    如何检查状态和 或等待连接成功window open 或者建议更好的选择 var url https www google com var newWindow window open url main if newWindow succes
  • Address Sanitizer 可以在检测到错误后立即中止吗?

    我正在结合使用系统调用检查器 fsanitize address当 ASAN 发现错误时 它会调用一些系统调用 ioctl ISATTY 等 打印报告时 系统调用检查器中断了 ASAN 的 ioctl 并且未正确收集错误报告 我希望 ASA
  • PHP暴力破解密码生成器

    我希望能够输入一个数字并获取由字符串或唯一字符构建的密码 因此 如果字符串中有两个字符 string AB 这些是期望的结果 in out 0 A 1 B 2 AA 3 AB 4 BA 5 BB 6 AAA 7 AAB 8 ABA 9 AB
  • 使用键盘向下键在 Jpanel 上移动球

    我有一个从 jpanel 扩展而来的 mypanel 类 我在其中使用图形并制作一个球 第二类是 Main 我在其中制作 JFrame 并将面板添加到框架 Main 中还有另一个类 MKeyListener 它扩展自 KeyAdapter
  • 试图弄清楚如何跟踪 Pygame 事件并组织游戏的功能

    我是 Pygame 的新手 所以我仍在为整个 事件 概念而苦苦挣扎 基本上 我当前的挑战是 让 pygame event get 在主循环之外工作 以便我可以允许玩家从游戏的一个部分继续到下一个部分 例如 通过按空格键 找出一种方法在主线程
  • Xamarin Forms - 每 10 秒获取一次设备位置(当应用程序在前台/后台运行时)

    我创建了一个 Xamarin 表单应用程序 应用程序应定期 每 10 秒 获取设备 iOS 和 Android 的位置 我怎样才能实现这个目标 我知道有一些库 例如 Xamarin Essentials 但我无法决定应该获取该位置多少次 当
  • 在 Python 3 中,当我索引字节数组时会发生什么?

    在 Python 3 中 我可以通过编码字符串来创建字节数组 gt gt gt foo abc gt gt gt bar foo encode utf 8 gt gt gt bar b abc 但是当我索引该字节数组时 我得到了其他东西 g
  • Android 文本视图转换

    我是安卓开发新手 我想创建一个带有两个文本视图的启动屏幕 在这个启动屏幕中我想要两个过渡 1 文本视图1从顶部到中心的过渡 2 文本View 2从底部到中心的过渡 两个转换应该同时执行 如何实现这一目标 Thanks 创建一个xml文件在你
  • 使用动态链接共享的内容在打开后显示的内容与共享的内容不同

    我正在开发一个 Android 应用程序 一些数据正在从FirebaseDatabase并且正在显示在RecyclerView在我的应用程序中 The RecyclerView has cards在里面 每张卡片上都会显示图像和文本 卡上有
  • 厨师食谱 - 重新加载路径

    我刚刚使用 Chef Cookbook 安装了 Java 并为所有用户更新了 PATH 环境变量 将新文件添加到 etc profile d 是否可以告诉厨师重新加载 PATH 变量 当我做这样的事情时 execute java check
  • 如何使用 API 和 PHP 添加对 YouTube 视频评论的回复

    如何使用 PHP API 添加对 YouTube 视频评论的回复 通过搜索一分钟 我发现了这个 https developers google com youtube 2 0 developers guide protocol commen
  • 关闭jquery模态对话框很慢

    我有一个模式对话框 我在其中放置 html 表单的内容 该表单有一个提交和取消按钮 我找到了取消按钮 甚至通过非常缓慢地按下 x 来关闭对话框 虽然只慢了几秒 但足够长 足以让人认为存在疯狂的鼠标点击器可能发疯的问题 有没有比我正在做的更好
  • Hadoop:减速器的数量不等于我在程序中设置的数量

    我已将 mapred tasktracker reduce tasks maximum 设置为 10mapred site xml 我也写jobConf setNumReduceTasks 5 在我的工作中 如果我在 Shell 中运行该作
  • 在 python 中验证 SAML 签名

    我需要使用 SAML2 从第三方在 python 中实现身份验证 我调查过pysaml2并发现这很令人困惑 并决定给予M2Crypto我发现之后有机会这个问题 by Ennael 我收到的 SAML 令牌可以在这里找到 我已经从其中提取了我