单点登录(Single Sign On, SSO)是当前企业业务整合中一项流行的技术方案。它的核心价值在于,用户只需进行一次身份验证,便可访问所有相互信任的应用系统,极大地提升了用户体验和管理效率。安全断言标记语言(Security Assertion Markup Language, SAML)则是一个基于XML的开放标准框架,用于在不同安全域之间交换身份验证和授权数据,尤其适用于企业用户身份的跨域传递。
设想一个场景:公司(身份提供者,IdP)的用户需要访问SAP S/4HANA XS应用(服务提供者,SP)。为确保身份安全,除了加密签名等措施,通常会采用SAML规范来传输身份凭证。SAML传输的数据采用XML格式,内容遵循其推荐标准。这种方式的好处在于,它不强制要求IdP和SP采用何种底层系统,只要双方都能理解和处理SAML规范即可。
典型的SAML单点登录流程如下:
- 用户在浏览器中输入SP(如SAP S/4HANA XS应用)的URL,尝试访问。
- SP生成一个SAML认证请求。
- SP引导浏览器重定向到IdP进行用户身份验证。
- IdP收到SAML请求,检查用户是否已在本域认证且会话有效。若无效,IdP将要求用户进行登录认证。
- IdP认证用户成功后,生成一个SAML响应。
- IdP将封装好的SAML响应返回给浏览器,浏览器再将其提交给SP。
- SP验证收到的SAML响应的合法性,该响应中包含了用户的身份信息。
- SP根据验证通过的SAML响应,确认用户身份,同意用户登录并提供服务。
本文将介绍如何利用开源身份提供者软件Shibboleth作为IdP,为SAP S/4HANA XS应用启用SAML单点登录。
一、 Shibboleth (IdP端) 配置详解
1.1 准备安装环境
- 域名准备: 确保IdP服务器和SP服务器(SAP S/4HANA)可通过域名相互解析和通信。
- 端口开放: IdP服务器的80端口和443端口需要对外开放,并确保没有其他程序占用。检查防火墙设置,允许这两个端口的访问。
- 时钟同步: IdP服务器与SP服务器的系统时钟必须保持同步,以避免SAML断言因时间戳问题失效。
1.2 IdP安装步骤
-
基础软件安装:
- 下载并安装JDK 1.5或更高版本(示例使用JDK 1.6)。确保
JAVA_HOME
环境变量正确设置。 - 下载并安装Tomcat 6.0.17或更高版本(示例使用Tomcat 6.0.29)。
- 下载并安装Apache HTTP Server 2.2或更高版本(示例使用Apache 2.2)。注意:务必从
http://httpd.apache.org/
网站下载包含SSL支持的Apache安装程序。
- 下载并安装JDK 1.5或更高版本(示例使用JDK 1.6)。确保
-
下载IdP组件:
- 从Shibboleth官方网站(如
http://shibboleth.internet2.edu/downloads/shibboleth/idp/latest/
)下载最新的IdP安装包。 - 解压下载的压缩包,并将解压后的目录移动到您计划安装IdP的目标路径。
- 从Shibboleth官方网站(如
-
执行IdP安装程序:
- 运行IdP的安装脚本或程序。安装过程中会提示输入IdP的宿主名/域名(Hostname,请使用域名而非IP地址)以及IdP的安装主目录(IDP_HOME)。
-
配置Tomcat Endorsed目录:
- 将
IDP_HOME/lib/endorsed/
目录下的所有JAR包复制到TOMCAT_HOME/endorsed/
目录下。IDP_HOME
和TOMCAT_HOME
分别指IdP和Tomcat的安装主目录。如果Tomcat根目录下没有endorsed
文件夹,则手动创建一个。
- 将
-
使Tomcat支持SSL传输:
- 添加SSL支持库: 下载
tomcat6-dta-ssl-1.0.0.jar
(注意:Tomcat 7及更高版本需要不同的JAR包),将其放到TOMCAT_HOME/lib/
目录下。 - 配置SSL连接器: 在
TOMCAT_HOME/conf/server.xml
文件中,添加SSL连接器配置。请将IDP_HOME
替换为实际的IdP安装路径,并将PASSWORD
替换为IdP安装过程中为keystore设置的密码。XML<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLImplementation="edu.internet2.middleware.security.tomcat6.DelegateToApplicationJSSEImplementation" scheme="httpshttps" SSLEnabled="true" clientAuth="true" keystoreFile="IDP_HOME/credentials/idp.jks" keystorePass="PASSWORD" />
- 添加SSL支持库: 下载
-
部署IdP Web应用 (idp.war):
- 创建文件
TOMCAT_HOME/conf/Catalina/localhost/idp.xml
。 - 将以下内容粘贴到
idp.xml
文件中,并替换IDP_HOME
为实际路径:XML<Context docBase="IDP_HOME/war/idp.war" privileged="true" antiResourceLocking="false" antiJARLocking="false" unpackWAR="false" swallowOutput="true" />
- 创建文件
-
配置Apache反向代理:
- 在Apache的配置文件
httpd.conf
中,添加以下行,设置AJP反向代理到Tomcat上的IdP应用:ApacheProxyPass /idp/ ajp://localhost:8009/idp/
- 在Apache的配置文件
-
调整Tomcat AJP连接器:
- 修改Tomcat的
TOMCAT_HOME/conf/server.xml
文件中的AJP/1.3连接器(默认端口8009)。增加request.tomcatAuthentication="false"
和address="127.0.0.1"
属性,允许Apache将认证用户信息传递给IdP。XML<Connector port="8009" enableLookups="false" redirectPort="8443" protocol="AJP/1.3" request.tomcatAuthentication="false" address="127.0.0.1" />
- 修改Tomcat的
-
配置Apache基本认证 (RemoteUser方式):
- 在Apache的
httpd.conf
或ssl.conf
配置文件中,定义以下<Location>
指令块,为IdP的RemoteUser认证路径启用基本认证。Apache<Location /idp/Authn/RemoteUser> AuthType Basic AuthName "My Identity Provider" AuthUserFile D:/opt/shibboleth-idp/credentials/user.db # 替换为实际的user.db路径 require valid-user </Location>
- 在Apache的
-
创建测试用户:
- 使用Apache的
htpasswd
命令创建用于测试的用户。该命令通常位于Apache安装目录的bin
目录下。Bash# 首次创建文件并添加用户myself htpasswd -c D:/opt/shibboleth-idp/credentials/user.db myself # 后续添加用户 (不需要-c参数) # htpasswd D:/opt/shibboleth-idp/credentials/user.dbanotheruser
请将路径替换为上一步中
AuthUserFile
指令指定的实际路径。myself
为示例用户名。
- 使用Apache的
-
测试IdP安装状态:
- 在浏览器中访问IdP的状态页面:
https://<your_idp_domain>/idp/profile/Status
。如果页面显示“ok”,则表示IdP基本安装和配置正确。这仅表明IdP服务已启动,后续还需要配置信任关系和属性释放才能真正用于SSO。
- 在浏览器中访问IdP的状态页面:
二、 SAP S/4HANA (SP端) 配置要点
SAP S/4HANA作为服务提供者(SP)端的配置,可以参考SAP官方文档或社区资源,例如早期SCN上的文档DOC-50418(Use SAML to enable SSO for your SAP S/4HANA XS App)。配置过程中,会需要用到IdP的元数据。IdP的元数据文件通常位于IdP服务器的IDP_HOME/metadata/idp-metadata.xml
。
三、 将SP元数据部署到IdP端
- 获取并放置SP元数据: 从SAP S/4HANA端获取其SAML SP元数据,将其保存为
sp-metadata.xml
文件(文件名可自定义),并放置到IdP服务器的IDP_HOME/metadata/
目录下。 - 配置IdP信任SP元数据: 修改IdP的
IDP_HOME/conf/relying-party.xml
文件,在其中添加一个新的<metadata:MetadataProvider>
元素,使其能够加载并信任上一步放置的SP元数据文件。XML<metadata:MetadataProvider id="HANA_SP_MD" xsi:type="metadata:FilesystemMetadataProvider" metadataFile="IDP_HOME/metadata/sp-metadata.xml" /> ``` 确保重启IdP服务(通常是重启Tomcat)使配置生效。
四、 常见问题排查
在配置和测试过程中,可能会遇到一些常见错误。使用Chrome等浏览器的开发者工具可以帮助查看详细的SAML交互信息和错误提示。
-
错误:“Response is not success” (响应不成功)
- 可能原因与解决: IdP可能默认加密了SAML断言,而SP端未正确配置解密。作为排查步骤或在测试环境中,可以尝试在IdP的
IDP_HOME/conf/relying-party.xml
文件中,找到针对此SP的<ProfileConfiguration xsi:type="saml:SAML2SSOProfile" ... />
元素,并设置属性encryptAssertions="never"
。
- 可能原因与解决: IdP可能默认加密了SAML断言,而SP端未正确配置解密。作为排查步骤或在测试环境中,可以尝试在IdP的
-
错误:“No name id in subject” (Subject中缺少NameID)
- 可能原因与解决: IdP生成的SAML响应中未包含必需的NameID信息,或者格式不被SP接受。需要在IdP端配置属性解析和释放策略。
- 修改
IDP_HOME/conf/attribute-resolver.xml
,添加一个AttributeDefinition
来定义PrincipalName作为NameID,并配置其编码方式。例如:XML<resolver:AttributeDefinition id="principalNameAsNameID" xsi:type="ad:PrincipalName" xmlns="urn:mace:shibboleth:2.0:resolver:ad"> <resolver:Dependency ref="staticAttributes" /> <resolver:AttributeEncoder xsi:type="enc:SAML1StringNameIdentifier" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" nameFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/> <resolver:AttributeEncoder xsi:type="enc:SAML2StringNameID" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" nameFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/> </resolver:AttributeDefinition>
- 修改
IDP_HOME/conf/attribute-filter.xml
,添加一个AttributeFilterPolicy
来允许将上一步定义的属性(如principalNameAsNameID
)释放给目标SP。XML<afp:AttributeFilterPolicy id="releasePrincipalNameIDToHanaSP"> <afp:PolicyRequirementRule xsi:type="basic:AttributeRequesterString" value="<SP_Entity_ID>" /> <afp:AttributeRule attributeID="principalNameAsNameID"> <afp:PermitValueRule xsi:type="basic:ANY"/> </afp:AttributeRule> </afp:AttributeFilterPolicy>
- 修改
- 可能原因与解决: IdP生成的SAML响应中未包含必需的NameID信息,或者格式不被SP接受。需要在IdP端配置属性解析和释放策略。
-
错误:“NameID format is not support” (NameID格式不受支持)
- 可能原因与解决: SP期望的NameID格式与IdP提供的不一致。通常,将NameID的
nameFormat
属性设置为urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
具有较好的兼容性,如上一个示例中所示。具体需参照SP端的要求进行调整。
- 可能原因与解决: SP期望的NameID格式与IdP提供的不一致。通常,将NameID的
五、 集成企业LDAP认证
本文示例中,IdP的用户认证采用的是Apache的RemoteUser
基本认证方式,即通过htpasswd
文件管理用户。在真实的企业环境中,用户身份通常由LDAP(轻量级目录访问协议)或Active Directory集中管理。
要使Shibboleth IdP使用LDAP进行用户认证,需要进行如下调整:
-
修改认证处理器: 编辑IdP的
IDP_HOME/conf/handler.xml
文件。将默认的RemoteUser
登录处理器注释掉或替换为UsernamePassword
类型的登录处理器,并指向JAAS配置文件。XML<ph:LoginHandler xsi:type="ph:UsernamePassword" jaasConfigurationLocation="IDP_HOME/conf/login.config"> <ph:AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</ph:AuthenticationMethod> </ph:LoginHandler>
-
配置JAAS登录模块: 创建或修改
IDP_HOME/conf/login.config
文件(路径与上述jaasConfigurationLocation
一致)。在此文件中配置LDAP登录模块的相关参数,如LDAP服务器地址、端口、搜索基准DN、用户绑定DN和密码、用户搜索过滤器等。
通过上述配置,Shibboleth IdP便可以将用户认证请求代理到企业内部的LDAP服务器,实现与现有身份管理体系的无缝集成。
企业在向SAP S/4HANA Cloud转型时,SAP 许可 (License) 从 On-Premise 时代的经典指定用户模型转向全新的 FUE 许可模式,且 SAP 产品的许可 (License) 包含诸如“组件授权、用户授权、计量模式”等复杂模型,这对企业来说如同一个黑匣子,难以理解其工作原理。此外,企业还面临 SAP 的 License 审计等合规性问题。赛锐信息在 SAP License 审计流程方面拥有丰富咨询经验,拥有自主研发的高效 SAP License 资产优化软件产品,欢迎企业在需要时随时联系我们,以获得我们的支持服务和软件产品试用体验。