# spring-saml **Repository Path**: BeanInJ/spring-saml ## Basic Information - **Project Name**: spring-saml - **Description**: spring boot + saml2.0 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-05-31 - **Last Updated**: 2023-06-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
___ ___ _ _
| \/ | (_)(_)
| . . | _ _ _ _ _ __ __ _
| |\/| || | | || || || '_ \ / _` |
| | | || |_| || || || | | || (_| |
\_| |_/ \__,_|| ||_||_| |_| \__,_|
_/ |
|__/
Configurable Identity and Service Provider built with OpenSAML & Java Spring Boot
Mujina
======
[](https://travis-ci.org/OpenConext/Mujina)
[](https://codecov.io/github/OpenConext/Mujina)
Mujina是SAML2身份(IdP)和服务提供商(SP)。
请注意,版本 5.0.0 中引入了向后不兼容。如果要从 5 之前的版本迁移到 5 后版本 然后以下内容发生了变化:
我们不再使用Tomcat,而是使用独立的Spring启动应用程序
对于需要单个值(例如字符串或布尔值)的所有端点,API 已更改,并且请求正文中只需要该值。请参阅下面的 API 文档。
从版本 8.0.0 开始,我们使用 Java 11 运行。
IdP 或 SP 的特性都可以使用 REST API 在运行时进行更改。
Mujina用于测试surfcontext中间件,该中间件使荷兰教育服务能够使用基于云的saas服务。
功能
--------
符合 SAML2 标准的身份提供程序。IdP 将对已知用户进行身份验证,为 SP 提供已知属性。REST API 允许操作:
- 用户凭据(特定的用户名和密码或允许任何用户名和密码)
- 用户角色
- 任何用户属性
- 签名证书
- 实体标识
- ACS 终结点
- 签名算法
符合 SAML2 标准的服务提供商。SP 显示从 IdP 接收的属性。REST API 允许操作:
- 实体标识
- 签名证书
- 单点登录服务网址
- 签名算法
默认属性
--------
默认身份提供程序配置如下所示:
- 实体 ID 为“http://mock-idp"
- 签名算法是“http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
- 它有一个具有登录“admin”和密码“secret”的用户,其角色ROLE_USER和ROLE_ADMIN
- 它有一个具有登录“用户”和密码“secret”的用户,具有角色ROLE_USER
- 它具有以下属性。属性始终存储为列表。即使它们包含单个值。
* "urn:mace:dir:attribute-def:uid" is "john.doe"
* "urn:mace:dir:attribute-def:cn" is "John Doe"
* "urn:mace:dir:attribute-def:givenName" is "John"
* "urn:mace:dir:attribute-def:sn" is "Doe"
* "urn:mace:dir:attribute-def:displayName" is "John Doe"
* "urn:mace:dir:attribute-def:mail" is "j.doe@example.com"
* "urn:mace:terena.org:attribute-def:schacHomeOrganization" is "example.com"
* "urn:mace:dir:attribute-def:eduPersonPrincipalName" is "j.doe@example.com"
- 有可用的默认证书和私钥
- 默认情况下,ACS 终结点应由 SP 作为 AuthnRequest 中的属性提供。 如果使用 IdP API 设置 ACS 终端节点,则不需要这样做。使用 api 会覆盖 AuthnRequests 中设置的值
默认服务提供商配置如下:
- 实体 ID 为“http://mock-sp"
- 签名算法是“http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
- 有可用的默认证书和私钥
在本文档中,您将找到一些覆盖默认配置的示例。 覆盖配置后,可以使用重置 API 返回到默认值。
构建 Mujina 项目
---------------
环境: maven 3 、 java 1.8
```bash
git clone git@github.com:OpenConext/Mujina.git
cd Mujina
mvn clean install
```
构建依赖项托管在 https://build.openconext.org/repository/public/ 上(将由 Maven 自动获取)。
运行 IDP
-----------------------
```bash
cd mujina-idp
mvn spring-boot:run
```
然后,转到 http://localhost:8080/。 如果您希望应用程序通过https运行,请转到: [spring boots docs](https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-configure-ssl).
运行 SP(在新终端会话中)
----------------------
```bash
cd mujina-sp
mvn spring-boot:run
```
然后,转到 http://localhost:9090/。您可以访问安全页面,并将重定向到 IdP,您可以在其中 使用用户名管理员和密码密码登录。
## [私有签名密钥和公共证书](#signing-keys)
私有签名密钥和公共证书
```bash
openssl req -subj '/O=Organization, CN=Mujina/' -newkey rsa:2048 -new -x509 -days 3652 -nodes -out crt.txt -keyout pem.txt
```
Java 密钥库需要 RSA 私钥的 pkcs8 DER 格式,因此我们必须重新格式化该密钥:
```bash
openssl pkcs8 -nocrypt -in pem.txt -topk8 -out der.txt
```
从 der.txt 和 crt.txt 中删除空格、标题和页脚:
```bash
cat der.txt |head -n -1 |tail -n +2 | tr -d '\n'; echo
cat crt.txt |head -n -1 |tail -n +2 | tr -d '\n'; echo
// windows下
cat der.txt |head -n -1 |tail -n +2 | tr -d '\n\r'; echo
cat crt.txt |head -n -1 |tail -n +2 | tr -d '\n\r'; echo
```
上面的命令适用于 linux 发行版。在 mac 上,您可以在安装后发出相同的命令:ghead coreutils
```bash
brew install coreutils
cat mujina.der |ghead -n -1 |tail -n +2 | tr -d '\n'; echo
cat mujina.crt |ghead -n -1 |tail -n +2 | tr -d '\n'; echo
```
将 mujina 密钥对添加到 application.yml 文件:
```yml
idp:
private_key: ${output from cleaning the der file}
certificate: ${output from cleaning the crt file}
sp:
private_key: ${output from cleaning the der file}
certificate: ${output from cleaning the crt file}
```
重置 IDP
-----------------
此 API 在 IDP 和 SP 上均可用。(windows上把 \ 改成 ^)
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X POST \
http://localhost:8080/api/reset
```
更改实体 ID
---------------------
此 API 在 IDP 和 SP 上均可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d "myEntityId" \
http://localhost:8080/api/entityid
```
设置签名算法
-------------
此 API 在 IDP 和 SP 上均可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d "http://www.w3.org/2000/09/xmldsig#rsa-sha1" \
http://localhost:9090/api/signatureAlgorithm
```
更改签名凭据(IDP 和 SP)
--------------------------------
This API is available on both the IDP and the SP.
The certificate should be in PEM format.
The key should be in base64 encoded pkcs6 DER format.
```bash
export CERT=MIICHzCCAYgCCQD7KMJ17XQa7TANBgkqhkiG9w0BAQUFADBUMQswCQYDVQQGEwJO\
TDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEQMA4GA1UECgwH\
U3VyZm5ldDEPMA0GA1UECwwGQ29uZXh0MB4XDTEyMDMwODA4NTQyNFoXDTEzMDMw\
ODA4NTQyNFowVDELMAkGA1UEBhMCTkwxEDAOBgNVBAgMB1V0cmVjaHQxEDAOBgNV\
BAcMB1V0cmVjaHQxEDAOBgNVBAoMB1N1cmZuZXQxDzANBgNVBAsMBkNvbmV4dDCB\
nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA2slVe459WUDL4RXxJf5h5t5oUbPk\
PlFZ9lQysSoS3fnFTdCgzA6FzQzGRDcfRj0HnWBdA1YH+LxBjNcBIJ/nBc7Ssu4e\
4rMO3MSAV5Ouo3MaGgHqVq6dCD47f52b98df6QTAA3C+7sHqOdiQ0UDCAK0C+qP5\
LtTcmB8QrJhKmV8CAwEAATANBgkqhkiG9w0BAQUFAAOBgQCvPhO0aSbqX7g7IkR7\
9IFVdJ/P7uSlYFtJ9cMxec85cYLmWL1aVgF5ZFFJqC25blyPJu2GRcSxoVwB3ae8\
sPCECWwqRQA4AHKIjiW5NgrAGYR++ssTOQR8mcAucEBfNaNdlJoy8GdZIhHZNkGl\
yHfY8kWS3OWkGzhWSsuRCLl78A==
export KEY=MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANrJVXuOfVlAy+EV8SX+YebeaFGz\
5D5RWfZUMrEqEt35xU3QoMwOhc0MxkQ3H0Y9B51gXQNWB/i8QYzXASCf5wXO0rLuHuKzDtzEgFeT\
rqNzGhoB6launQg+O3+dm/fHX+kEwANwvu7B6jnYkNFAwgCtAvqj+S7U3JgfEKyYSplfAgMBAAEC\
gYBaPvwkyCTKYSD4Co37JxAJJCqRsQtv7SyXoCl8zKcVqwaIz4rUQRVN/Hv3/WjIFzqB3xLe4mjN\
YBIF31YWt/6ZslaLL5YJIXISrMgDuQzPKL8VqvvsH9XEpi/qSUsVAWa9Vaqqwa8JTPELK8QhHKaX\
TxGtatEuW1x6kSNXFCoasQJBAPUaYdj9oCDOGTaOaupF0GB6TIgIItpQESY1Dfpn4cvwB0jH8wBJ\
SBVeBqSa6dg4RI5ydD3J82xlF7NrQnvWpYkCQQDkg26KzQckoJ39HX2gYS4olSeQDAyIDzeCMkj7\
McDhigy0cL6k9nOQrKlq6V3vkBISTRg7JceJ4z3QE00edXWnAkEAoggv2WBJxIYbOurJmVhP2gff\
oiomyEYYIDcAp6KXLdffKOkuJulLIv0GzTiwEMWZ5MWbPOHN78Gg+naU/AM5aQJBALfbsANpt4eW\
28ceBUgXKMZqS+ywZRzL8YOF5gaGH4TYSCSeWiXsTUtoQN/OaFAqAQBMm2Rrn0KoXcGe5fvN0h0C\
QQDgNLxVcByrVgmRmTPTwLhSfIveOqE6jBlQ8o0KyoQl4zCSDDtMEb9NEFxxvI7NNjgdZh1RKrzZ\
5JCAUQcdrEQJ
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X POST -d "{\"certificate\": \"$CERT\",\"key\":\"$KEY\"}" \
http://localhost:8080/api/signing-credential
```
添加用户
-------------
此 API 仅在 IDP 上可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d '{"name": "hacker", "password": "iamgod", "authorities": ["ROLE_USER", "ROLE_ADMIN"]}' \
http://localhost:8080/api/users
```
将属性 foo 设置为栏(例如 urn:mace:dir:attribute-def:foo to bar)
-------------------------------------------------------------------------
此 API 仅在 IDP 上可用。注意:属性始终是一个列表。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d '["bar"]' \
http://localhost:8080/api/attributes/urn:mace:dir:attribute-def:foo
```
或者测试 UTF-8 编码:
```bash
curl -v -H "Accept: application/json" -H "Content-type: application/json" -X PUT -d '["髙橋 大輔"]' https://mujina-idp.test2.surfconext.nl/api/attributes/urn:mace:dir:attribute-def:cn
```
特定用户的设置属性
-----------------------------------
对设置属性的调用对所有用户都是全局的。通过此调用,您可以为特定用户设置属性。 此 API 仅在 IDP 上可用。注意:用户必须存在,并且不会即时预配。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d '["bar"]' \
http://localhost:8080/api/attributes/urn:mace:dir:attribute-def:foo/user
```
删除属性
---------------------
此 API 仅在 IDP 上可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X DELETE \
http://localhost:8080/api/attributes/urn:mace:dir:attribute-def:foo
```
删除用户的属性
--------------------------------
此 API 仅在 IDP 上可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X DELETE \
http://localhost:8080/api/attributes/urn:mace:dir:attribute-def:foo/user
```
设置身份验证方法
---------------------------------
此 API 仅在 IDP 上可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d "ALL" \
http://localhost:8080/api/authmethod
```
设置断言使用者服务 (ACS) 终结点
---------------------------------
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d "https://my_sp.no:443/acsendpoint_path" \
http://localhost:8080/api/acsendpoint
```
身份验证方法 API 有两个可能的值。
* USER
* ALL
该设置可在应用程序.yml 中配置
```
# Authentication method ALL for every username / password combination and USER for the configured users
auth_method: USER
```
USER 设置要求在 Mujina 的 IdP 中知道有效用户,并且 ALL 接受所有内容。
ALL 设置允许任何用户名和密码组合。 作为副作用,urn:mace:dir:attribute-def:uid 属性设置为用户每次登录时的用户名。
设置 SSO 服务网址
-------------
此 API 仅在 SP 上可用。
```bash
curl -v -H "Accept: application/json" \
-H "Content-type: application/json" \
-X PUT -d "http://localhost:8080/SingleSignOnService/vo:test" \
http://localhost:9090/api/ssoServiceURL
```