# 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 ====== [![Build Status](https://travis-ci.org/OpenConext/Mujina.svg)](https://travis-ci.org/OpenConext/Mujina) [![codecov.io](https://codecov.io/github/OpenConext/Mujina/coverage.svg)](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 ```