我找到了解决办法。简而言之:我有不好的
cas.authn.spnego.jcifsServicePrincipal
在里面
cas.properties
.
细节:
-
-
JDK 1.8+JCE
-
Apereo CAS 5.1
-
Windows Server 2012 R2上的Tomcat 8.5.15
CAS
documentation
cas.authn.spnego.jcifsServicePrincipal=HTTP/cas.example.com@EXAMPLE.COM
但请注意
jcifsServicePrincipal
name-Active Directory的名称
使用者
cn=service_xxx
其中
servicePrincipalName
HTTP/machine1.domain.com
HTTP/machine1
(但我认为,这只需要第一步)。
Kerberos / SPNEGO based SSO (Single Sign-On) in Weblogic
.
我的CAS如何工作:
使用上述教程,我为现有用户创建了SPN
(可以登录的用户
机器1
setspn -s HTTP/machine1.domain.com service_xxx
使用者
这两个操作都是由Active Directory管理员完成的(他有足够的权限)。
所以
service_xxx
HTTP/machine1.domain.com
是唯一分配给主体的SPN属性。据我所知,现在CAS服务器正在机器上运行
machine1.domain.com
(这是机器URL)可以由用户从AD(LDAP)获取任何信息
因此,CAS服务器还可以使用Kerberos协议对任何用户进行身份验证。在我看来,这就是为什么CAS属性
jcifsServicePrincipal公司
应指向委托人
service_xxx@domain.com
(主体全名和@domain.com),而不是其SPN属性名(除非它们是相等的字符串)。
-
具有AES属性和SPN属性集的主体
-
Java with
安装
-
使用创建键选项卡
ktab.exe
来自JDK的工具
-
login.conf
CAS documentation
-
cas.properties
和
krb5.conf
键选项卡
键选项卡创建过程(不需要任何特权):
"C:\Program Files\Java\jre1.8.0_131\bin\ktab.exe" -a service_xxx -n 0 -k cas.keytab
-k
-n 0
msDS-KeyVersionNumber
(KNVO),所以我使用了0。但我认为Windows忽略了KNVO数字-请参阅
this comment
关于的更多信息
键选项卡
:
documentation
建议使用
ktpass.exe
不幸的是,这需要广告管理员权限,所以这不是一个好主意。更好地使用
ktab.exe
来自JDK(如上)。您只需要记住始终在之后生成新的键表
服务_xxx
密码更改。
要测试键选项卡,有几个选项:
cas.authn.spnego.kerberosConf=/etc/cas/config/krb5.conf
cas.authn.spnego.jcifsServicePrincipal=service_xxx@domain.com
cas.authn.spnego.loginConf=file:/etc/cas/config/login.conf
cas.authn.spnego.kerberosRealm=DOMAIN.COM
cas.authn.spnego.principal.principalAttribute=sAMAccountName
cas.authn.spnego.ldap.ldapUrl=ldap://path.to.ldap.domain.com
cas.authn.spnego.ldap.baseDn=DC=domain,DC=com #this is base dn where LDAP starts searching for users
cas.authn.spnego.ldap.bindDn=cn=SERVICE_XXX,DC=domain,DC=com #it's a kind of login to LDAP
cas.authn.spnego.ldap.failFast=false
cas.authn.spnego.ldap.subtreeSearch=true
cas.authn.spnego.ldap.useSsl=false
cas.authn.spnego.ldap.searchFilter=cn={host}
有趣的是
/etc/cas/config
也适用于Windows并指向
C:
C:\etc\cas\config
。请注意,此处的所有配置(以及所有Java文件)路径都使用正斜杠。
我还提供了krb5.conf。这个文件是特定于您的组织的。通常你可以在里面的某个地方找到它
C:\Windows
[libdefaults]
default_keytab_name = C:/Users/SERVICE_XXX/my_keytab/cas.keytab
正如你所见-
default_keytab_name
[libdefaults]
login.conf
文件(请参阅Apereo CAS文档)。
cas.authn.spnego.kerberosDebug=true
并更改内部调试级别
log4j2.xml
). 然后,您应该看到CAS何时使用您的键表,例如:
2017-07-04 19:56:29,613 DEBUG [org.apereo.cas.support.spnego.authentication.handler.support.JcifsSpnegoAuthenticationHandler] - <Processing SPNEGO authentication>
Java config name: /etc/cas/config/krb5.conf
Loaded from Java config
Found KeyTab Default keytab
Entered Krb5Context.acceptSecContext with state=STATE_NEW
>>> KeyTabInputStream, readName(): DOMAIN.COM
>>> KeyTabInputStream, readName(): SERVICE_XXX
>>> KeyTab: load() entry length: 79; type: 18
// ... edited
Added key: 23version: 0
Added key: 16version: 0
Added key: 17version: 0
Added key: 18version: 0
Looking for keys for: service_xxx@domain.com
然后抛出类似下面的异常。
如果您看到与此类似的异常:
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - AES256 CTS mode with HMAC SHA1-96)
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
at sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
... 280 more
Caused by: KrbException: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - AES256 CTS mode with HMAC SHA1-96
at sun.security.krb5.KrbApReq.authenticate(Unknown Source)
at sun.security.krb5.KrbApReq.<init>(Unknown Source)
at sun.security.jgss.krb5.InitSecContextToken.<init>(Unknown Source)
... 283 more
很可能你走错了路
.keytab
文件(如前所述
here
故障排除2:
如果CAS抱怨不支持加密:
Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled
很可能没有安装Java JCE或Java已更新,结果JCE支持被更新覆盖(再次安装JCE)。