可以从命令行运行的SAML2 SPID/CIE服务提供商验证工具
项目描述
spid-sp-test
spid-sp-test是一个可以从命令行执行的SAML2 SPID/CIE服务提供商验证工具。这个工具是通过从spid-saml-check中分离测试库而产生的。
摘要
特性
spid-sp-test可以
- 测试SAML2 SPID/CIE元数据文件或http url
- 测试SAML2 SPID/CIE AuthnRequest文件或http url
- 测试SAML2 eIDAS FICEP SP元数据文件或http url
- 测试多种类型的SPID SP,请参阅配置文件
- 测试ACS行为,即SP如何回应SAML2响应
- 转储发送到ACS的响应和SP响应的HTML
- 处理要发送到响应中的属性或通过json配置文件测试响应的配置
- 使用Jinja2配置响应模板
- 通过多个json文件获取新的测试套件
- 完全集成到CI中
- 以json格式、在stdout或文件中导出详细报告
通常它
- 在执行时间上比spid-saml-check快得多
- 非常容易设置
检查元数据
身份验证请求,JSON输出
包含元数据、身份验证请求和响应的完整测试集
配置文件
每个配置文件加载一组测试。使用以下其中一个配置文件名称的--profile $profile-name
- saml2-sp:纯SAML2 SP,具有一些最佳实践
- spid-sp-public:公共Spid SP
- spid-sp-private:私人Spid SP
- spid-sp-ag-public-full:公共Spid SP Aggregatore Full
- spid-sp-ag-public-lite: 公共 Spid SP Aggregatore Lite
- spid-sp-ag-private-full: 私有 Spid SP Aggregatore Full
- spid-sp-ag-private-lite: 私有 Spid SP Aggregatore Lite
- spid-sp-op-public-full: 公共 Spid SP Gestore Full
- spid-sp-op-public-lite: 公共 Spid SP Gestore Lite
- cie-sp-public: 公共 CIE SP
- cie-sp-private: 私有 CIE SP
- ficep-eidas-sp: eIDAS FICEP SP
警告:Aggregatore 和 Gestore 的支持不涵盖 x.509 证书。Spid-sp-test 使用 spid-compliant-certificates-python 进行证书的验证。
设置
先决条件
- LibXML2
- xmlsec with openssl engine support
- python3
- pip 用于通过 Python 包管理器自动安装
在 Debian 类的发行版中设置虚拟环境
# install prerequisite
apt install libxml2-dev libxmlsec1-dev libxmlsec1-openssl xmlsec1 python3-pip python3-virtualenv
# initialize virtual env
virtualenv -p python3 env
source env/bin/activate
# install spid-sp-test
pip install spid-sp-test --upgrade --no-cache
概述
spid-sp-test 可以测试 SP 元数据文件,您只需提供元数据 URL,如果是 http/http 或文件,例如:file://path/to/metadata.xml
。同样,它可以测试身份验证请求。
spid-sp-test 以不同的方式可以发送大量虚假 SAML 响应,对于每一个,它都需要对目标 SP 触发真实的身份验证请求。
如果您想测试响应,您必须将 spid-sp-test 的虚假 IDP 元数据 XML 文件提供给目标 SP。获取虚假 IDP 元数据(--idp-metadata
)并将其复制到您的 SP 元数据存储文件夹。
spid_sp_test --idp-metadata > /path/to/spid-django/example/spid_config/metadata/spid-sp-test.xml
要在 CI 中获取 spid-sp-test,您必须
- 在您的应用程序中配置一个示例项目
- 在您的 SP 中注册 spid-sp-test 虚假 IDP 元数据并执行示例项目,其开发服务器在后台运行
- 启动 spid-sp-test 命令
CI 的一个示例 在这里
示例
运行 spid_sp_test -h
以查看内联文档。
usage: spid_sp_test [-h] [--metadata-url METADATA_URL] [--idp-metadata] [-l [LIST [LIST ...]]] [--extra] [--authn-url AUTHN_URL] [-tr] [-nsr] [-tp TEMPLATE_PATH] [-tn [TEST_NAMES [TEST_NAMES ...]]]
[-tj [TEST_JSONS [TEST_JSONS ...]]] [-aj ATTR_JSON] [-o REPORT_OUTPUT_FILE] [-rf {json,html}] [-d {CRITICAL,ERROR,WARNING,INFO,DEBUG}] [-xp XMLSEC_PATH] [--production]
[--response-html-dumps RESPONSE_HTML_DUMPS] [--exit-zero]
[-pr {saml2-sp,spid-sp-public,spid-sp-private,spid-sp-ag-public-full,spid-sp-ag-public-lite,spid-sp-op-public-full,spid-sp-op-public-lite,cie-sp-public,cie-sp-private,ficep-eidas-sp}]
[-ap AUTHN_PLUGIN] [-rm REQUEST_METHOD] [-rb REQUEST_BODY] [-rct REQUEST_CONTENT_TYPE] [-prs] [-pas] [--xsds-files-path XSDS_FILES_PATH] [-v]
src/spid_sp_test/spid_sp_test -h for help
通过传递文件测试元数据
spid_sp_test --metadata-url file://metadata.xml
从 URL 测试元数据
spid_sp_test --metadata-url https://127.0.0.1:8000/spid/metadata
一个非常标准的测试
spid_sp_test --metadata-url https://127.0.0.1:8000/spid/metadata --authn-url https://127.0.0.1:8000/spid/login/?idp=https://127.0.0.1:8088 --extra
仅打印 ERRORs
spid_sp_test --metadata-url https://127.0.0.1:8000/spid/metadata --authn-url https://127.0.0.1:8000/spid/login/?idp=https://127.0.0.1:8080 --extra --debug ERROR
JSON 报告,使用 -o filename.json
将其写入文件,使用 -rf html -o html_report/
将其导出到 HTML 页面
spid_sp_test --metadata-url https://127.0.0.1:8000/spid/metadata --authn-url https://127.0.0.1:8000/spid/login/?idp=https://127.0.0.1:8080 --extra -rf json
给定一个元数据文件和一个 authn 文件(例如 tests/metadata
和 tests/authn
)导出所有测试响应,而无需将它们发送到 SP
spid_sp_test --metadata-url file://tests/metadata/spid-django-other.xml --authn-url file://tests/authn/spid_django_post.html --extra --debug ERROR -tr -nsr
获取要发送到 SP 的自定义属性集的响应(测试 1),而无需实际发送。它只会将其打印到 stdout
spid_sp_test --metadata-url file://tests/metadata/spid-django-other.xml --authn-url file://tests/authn/spid_django_post.html --extra --debug ERROR -tr -nsr -tn 1 -aj tests/example.attributes.json
常见用法
测试一个带有 SAMLDS (DiscoveryService) 的 Shibboleth SP。在这个例子中,target
指向目标服务,而 entityID 是选定的 IdP。这个例子也适用于 Shibboleth IdP-SP 代理/网关。
spid_sp_test --metadata-url https://sp.testunical.it/pymetadata_signed.xml --authn-url "https://sp.testunical.it/Shibboleth.sso/Login?target=https://sp.testunical.it/secure/index.php&entityID=https://127.0.0.1:8080" --debug ERROR --extra -tr
使用其 authn 插件和支持 idp 暗示的 SP 测试 Satosa-Saml2Spid
spid_sp_test --metadata-url https://127.0.0.1:10000/spidSaml2/metadata --authn-url "https://127.0.0.1:8000/saml2/login/?idp=https://127.0.0.1:10000/Saml2IDP/metadata&next=/saml2/echo_attributes&idphint=https%253A%252F%252Flocalhost%253A8080" -ap spid_sp_test.plugins.authn_request.SatosaSaml2Spid --extra -tr
测试响应和 html 转储
通过启用 --response-html-dumps HTML_PATH
选项启用响应转储,您将获得 N 个 html 文件(您的 SP 的页面),如下所示
- 测试描述,带注释
- SAML 响应已发送,带注释
- SP html 页面,带有绝对 src 和 href(感谢 lxml)
这里 是一个示例,1_True.html,其中 1
是测试名称,而 True
是状态。
扩展测试
spid-sp-test 提供了扩展和配置新响应测试以执行的可能性。用户可以
-
通过配置一个类似于
tests/example.test-suite.json
的 json 文件来自定义要运行的测试套件,并通过--test-jsons
选项传递它。可以输入多个 json 文件,通过空格分隔 -
通过配置类似于
example/example.attributes.json
的 json 文件来自定义要返回的属性,并通过--attr-json
选项传递它 -
将XML模板自定义以供测试使用,在配置文件中通过
--test-jsons
指定它们,并通过--template-path
选项指定模板目录。这些模板由Jinja2驱动,因此可以使用我们偏好的值扩展src/spid_sp_test/responses/templates/base.xml
。 -
自定义获取SAML2 Authn请求的方式,使用您自己编写的插件。如果您在使用自定义API的某些OAuth2/OIDC前端与IAM代理,您可以编写自己的插件并在cli参数中使用它,例如:
spid_sp_test --metadata-url https://127.0.0.1:8000/spid/metadata --extra --authn-url https://127.0.0.1:8000/spid/login/?idp=https://127.0.0.1:8080 --debug INFO -tr --authn-plugin spid_sp_test.plugins.authn_request.Dummy
-
使用ENV变量自定义entityid和证书路径的运行时。文件必须命名为
private.key
和public.cert
。IDP_ENTITYID=https://your.idp.eid/ IDP_CERT_PATH=../spid-django/example/certificates spid_sp_test --idp-metadata
查看src/spid_sp_test/responses/settings.py
或tests/example.test-suite.json
,我们发现每个测试都有一个response
属性。在配置中配置的每个元素都会覆盖模板中将渲染的值。每个模板都可以从其模板上下文加载这些变量,或者使用在其中静态定义的变量。
最后,您可以根据自己的喜好选择一些内置功能和选项。
Docker
在开始之前,您必须获取italia/spid-sp-test
镜像。您可以从Docker Hub拉取它
$ docker pull ghcr.io/italia/spid-sp-test:latest
或本地构建
$ docker build --tag italia/spid-sp-test:latest .
容器的工作目录设置为/spid
,因此,本地文件应相对于/spid
路径进行挂载。
$ docker run -ti --rm \
-v "$(pwd)/tests/metadata:/spid/mymetadata:ro" \
-v "$(pwd)/tests/metadata:/spid/dumps:rw" \
italia/spid-sp-test:v1.1.5 --metadata-url file://mymetadata/spid-django-other.xml
单元测试
这是为开发者准备的。
pip install requirements-dev.txt
pytest -v --cov=spid_sp_test --cov-report term tests/
如果您需要Docker,可以进行以下操作
- 创建开发者镜像
docker build -f Dockerfile-devenv --no-cache . --tag italia/spid-sp-test-devenv
- 在开发镜像上运行覆盖率测试
docker run italia/spid-sp-test-devenv
- 如果您需要将镜像用作开发机器或检查环境,您可以使用以下方式访问它
docker run -it --entrypoint /bin/bash italia/spid-sp-test-devenv
- 最后一步是在您的宿主机器和开发Docker实例之间进行实时编码,使用卷
docker run -it -v $(pwd):/tmp/src --entrypoint /bin/bash italia/spid-sp-test-devenv
作者
参考
TLS/SSL测试
- https://github.com/nabla-c0d3/sslyze
pip install --upgrade sslyze sslyze www.that-sp.org --json_out ssl.log
- https://testssl.sh/