此处将为大家介绍关于如何通过GSS-API获取kerberos服务票证?的详细内容,此外,我们还将为您介绍关于active-directory–将新服务器添加到服务器管理器,获取Kerberos错误0
此处将为大家介绍关于如何通过GSS-API获取kerberos服务票证?的详细内容,此外,我们还将为您介绍关于active-directory – 将新服务器添加到服务器管理器,获取Kerberos错误0x80090322、ambari集群Kerberos服务异常、Android:如何通过Google登录API获取刷新令牌?、Apache Kerby —— Kerberos 协议和 KDC 实现的有用信息。
本文目录一览:- 如何通过GSS-API获取kerberos服务票证?
- active-directory – 将新服务器添加到服务器管理器,获取Kerberos错误0x80090322
- ambari集群Kerberos服务异常
- Android:如何通过Google登录API获取刷新令牌?
- Apache Kerby —— Kerberos 协议和 KDC 实现
如何通过GSS-API获取kerberos服务票证?
有谁知道如何使用Java GSS-API从密钥分发中心(KDC)获取服务票证?
我有一个胖客户端应用程序,该应用程序首先使用Krb5LoginModule通过JAAS进行身份验证以从票证缓存中获取TGT(背景:Windows例如使用kerberos实现,并将票证授予票证存储在安全的存储区域中)。从LoginManager中,我获得包含TGT的Subject对象。现在,我希望当我为我的服务创建一个特定的GSSCredential对象时,该服务票证也将被放入主题的专用凭据中(我在网络上的某个地方已经读过)。因此,我尝试了以下方法:
// Exception handling ommittedLoginContext lc = new LoginContext("HelloEjbClient", new DialogCallbackHandler());lc.login()Subject.doAs(lc.getSubject(), new PrivilegedAction() { public Object run() { GSSManager manager = GSSManager.getInstance(); GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME); GSSCredential clientCreds = manager.createCredential(clientName, 8 * 3600, createKerberosOid(), GSSCredential.INITIATE_ONLY); GSSName serverName = manager.createName("myService@localhost", GSSName.NT_HOSTBASED_SERVICE); manager.createCredential(serverName, GSSCredential.INDEFINITE_LIFETIME, createKerberosOid(), GSSCredential.INITIATE_ONLY); return null; } private Oid createKerberosOid() { return new Oid("1.2.840.113554.1.2.2"); }});
不幸的是,我得到了GSSException:没有提供有效的凭据(机制级别:找不到任何Kerberos tgt)。
答案1
小编典典我对获得服务票的理解是错误的。我不需要从服务获取凭据-
在客户端上这是不可能的,因为客户端实际上没有服务器的TGT,因此没有权利获取服务凭据。这里只缺少创建一个新的GSSContext并将其初始化。如果我正确理解,则此方法的返回值包含服务票证。这是一个工作代码示例。它必须在PrivilegedAction中代表已登录的主题运行:
GSSManager manager = GSSManager.getInstance(); GSSName clientName = manager.createName("clientUser", GSSName.NT_USER_NAME); GSSCredential clientCred = manager.createCredential(clientName, 8 * 3600, createKerberosOid(), GSSCredential.INITIATE_ONLY); GSSName serverName = manager.createName("http@server", GSSName.NT_HOSTBASED_SERVICE); GSSContext context = manager.createContext(serverName, createKerberosOid(), clientCred, GSSContext.DEFAULT_LIFETIME); context.requestMutualAuth(true); context.requestConf(false); context.requestInteg(true); byte[] outToken = context.initSecContext(new byte[0], 0, 0); System.out.println(new BASE64Encoder().encode(outToken)); context.dispose();
然后,outToken包含服务票证。但是,这不是使用GSS-API的方式。它的目标是将那些细节隐藏到代码中,因此最好在两侧都使用GSS-
API建立一个GSSContext。否则,由于存在潜在的安全漏洞,您真的应该知道您在做什么。有关更多信息,请比我更仔细地阅读有关使用kerberos的Sun
SSO教程。
编辑:只是忘记了我正在使用Windows XP SP2。此版本的Windows中有一个新的“功能”,不允许在Windows
RAM中使用TGT。您必须编辑注册表以允许这样做。有关更多信息,请像我一样,在遇到“
KrbException:KDC不支持加密类型(14)”的情况下,请查看“
JGSS故障排除”页面主题。
active-directory – 将新服务器添加到服务器管理器,获取Kerberos错误0x80090322
但是,当我将新服务器添加到服务器管理器时,我收到Kerberos错误:0x80090322.我有一个很长的错误消息,我将在下面发布.我做了一些测试,发现我实际上能够使用Kerberos身份验证设置到服务器的远程Powershell会话:
$s = New-PSSession -ComputerName srv003 -Authentication Kerberos $s | Enter-PSSession
这里没问题.我在远程服务器上运行Enable-PSRemoting,也没有问题.
为什么服务器管理器不像我的新服务器?特别是因为可以使用服务器管理器抱怨的相同协议来设置远程Powershell.
属于错误代码0x80090322的错误消息:
配置刷新失败,并显示以下错误:由于以下错误,无法从服务器检索元数据:WinRM无法处理请求.使用Kerberos身份验证时出现以下错误,错误代码为0x80090322:发生未知的安全错误.可能的原因是:
>指定的用户名或密码无效.
>如果未指定身份验证方法和用户名,则使用Kerberos.
> Kerberos接受域用户名,但不接受本地用户名.
>远程计算机名称和端口的服务主体名称(SPN)不存在.
>客户端和远程计算机位于不同的域中,两个域之间没有信任.
检查上述问题后,请尝试以下操作:
>检查事件查看器以查找与身份验证相关的事件.
>更改身份验证方法;将目标计算机添加到WinRM TrustedHosts配置设置或使用HTTPS传输.请注意,TrustedHosts列表中的计算机可能未经过身份验证.
>有关WinRM配置的更多信息,请运行以下命令:winrm help config.
要返回错误消息中的编号项目:
>我使用域管理员帐户执行此操作.
>不确定如何在服务器管理器中更改此设置,因此我认为默认情况下应该这样做.
>我在域内运行,启动服务器管理器作为域管理员.
>服务器实际上有以下SPN,我还没有触及:
> Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04 / srv003.rwwilden01.local
> TERMSRV / SRV003
> TERMSRV / srv003.rwwilden01.local
> WSMAN / srv003
> WSMAN / srv003.rwwilden01.local
> RestrictedKrbHost / SRV003
> HOST / SRV003
> RestrictedKrbHost / srv003.rwwilden01.local
> HOST / srv003.rwwilden01.local
>两台计算机都在同一个域中.
>客户端计算机上没有事件.
>没有必要这样做.
Kerberos客户端从服务器srv003收到KRB_AP_ERR_MODIFIED错误.使用的目标名称是HTTP / srv003.rwwilden01.local.这表示目标服务器无法解密客户端提供的票证.当目标服务器主体名称(SPN)在目标服务正在使用的帐户以外的帐户上注册时,可能会发生这种情况.确保目标SPN仅在服务器使用的帐户上注册.如果目标服务帐户密码与Kerberos密钥分发中心上为该目标服务配置的密码不同,也会发生此错误.确保服务器和KDC上的服务都配置为使用相同的密码.如果服务器名称不是完全限定的,并且目标域(RWWILDEN01.LOCAL)与客户端域(RWWILDEN01.LOCAL)不同,请检查这两个域中是否存在具有相同名称的服务器帐户,或使用完全限定名称识别服务器.
我似乎在一周前使用SPN HTTP / srv003.rwwilden.local添加了一个托管服务帐户.我不确定为什么服务器管理器首先尝试此目标名称,但显然这不起作用.这是有道理的,因为这个SPN与实际的服务器没什么关系.
删除服务帐户后,一切都按照我的意图开始工作.
ambari集群Kerberos服务异常
异常现象
组件列表里面没有kerberos组件,安全认证页面显示已经开启了Kerberos服务。主机组件列表里面也没有Kerberos-client组件。kdc服务正常。怀疑有人禁用Kerberos服务失败了,但是没有查到日志记录。
问题排查
ambari.cluster表:
ambari根据clusters表中security_type的状态(KERBEROS/NONE)显示是否开启Kerberos服务了
如果为NONE:则下面的页面会显示:启用Kerberos安全
如果为KERBERO:则显示如下:
ambari.clusterservices表:
集群如果开启Kerberos认证,则clusterservices表中会有上图所示的一条记录,否则没有关于Kerberos的记录。
修复:
查看出问题的集群,发现此表中没有关于Kerberos的记录,因此插入一条记录:
insert into clusterservices (service_name,cluster_id,service_enabled) values (''KERBEROS'',2,0);
其中cluster_id和service_enabled的值和正常服务的值保持一致即可。
ambari.servicedesiredstate表:
集群如果开启Kerberos认证,则servicedesiredstate表中会有上图所示的一条记录,否则没有关于Kerberos的记录;
同样,出问题的集群也没有关于Kerberos的记录,因此插入一条数据:
insert into servicedesiredstate
(cluster_id
,desired_host_role_mapping
,desired_repo_version_id
,desired_state
,service_name
,maintenance_state
,credential_store_enabled)
values
(2,0,1,''STARTED'',''KERBEROS'',''OFF'',0);
表中cluster_id,desired_host_role_mapping,desired_repo_version_id,maintenance_state
和credential_store_enabled的值和其他服务对应字段的值保持一致即可。
ambari.servicecomponentdesiredstate表:
集群如果开启Kerberos认证,则servicecomponentdesiredstate表中会有上图所示的一条记录,否则没有关于Kerberos的记录
同样,出问题的集群也没有关于Kerberos的记录,因此插入一条数据:
insert into servicecomponentdesiredstate
(id
,component_name
,cluster_id
,desired_repo_version_id
,desired_state
,service_name
,recovery_enabled
,repo_state)
values (260,''KERBEROS_CLIENT'',2,1,''INSTALLED'',''KERBEROS'',0,''NOT_REQUIRED'');
表中id值保持原表中递增的关系,cluster_id,desired_repo_version_id,recovery_enabled和repo_state的值
和其他服务对应字段的值保持一致即可。
ambari.hostcomponentdesiredstate表:
集群如果开启Kerberos认证,则hostcomponentdesiredstate表中会有上图所示的记录,否则没有关于Kerberos的记录。
同样,出问题的集群也没有关于Kerberos的记录,因此需要插入数据:
insert into hostcomponentdesiredstate
(id
,cluster_id
,component_name
,desired_state
,host_id
,service_name
,maintenance_state
,restart_required)
values
(305,2,''KERBEROS_CLIENT'',''INSTALLED'',2,''KERBEROS'',''OFF'',0);
其中id值保持原表中递增的关系,cluster_id,restart_required和其他服务对应字段的值保持一致即可。
注意:host_id是集群中需要安装kerberos_client组件host的id号,host_id和主机的对应关系保存再hosts表中,
集群有多少节点安装KERBEROS_CLIENT就需要插入多少条数据。
ambari.hostcomponentstate表:
集群如果开启Kerberos认证,则hostcomponentstate表中会有上图所示的记录,否则没有关于Kerberos的记录。
同样,出问题的集群也没有关于Kerberos的记录,因此需要插入数据:
insert into hostcomponentstate
(id
,cluster_id
,component_name
,current_state
,last_live_state
,host_id
,service_name)
values
(305,2,''KERBEROS_CLIENT'',''INSTALLED'',''INSTALLED'',2,''KERBEROS'');
其中id值保持原表中递增的关系,cluster_id和其他服务对应字段的值保持一致即可。
注意:集群有多少节点安装KERBEROS_CLIENT就需要插入多少条数据。此表中id和host_id号需要和hostcomponentstate表中保持一致。
host_id和主机的对应关系保存再hosts表中,如下图所示:
注意
1.clusters
2.clusterservices
3.servicedesiredstate
4.servicecomponentdesiredstate
5.hostcomponentdesiredstate
6.hostcomponentstate
表之间有外键,操作的时候根据提示先操作外键依赖的表
Android:如何通过Google登录API获取刷新令牌?
目前,我正在开发用户可以使用Google登录的应用程序.作为登录过程的一部分,我们需要将Google ACCESS TOKEN和REFRESH TOKEN发送到服务器端.
我通过以下方法检索访问令牌,
mAccountName = googleSignInAccount.getEmail();
String scopes = "oauth2:profile email";
String token = null;
try {
token = GoogleAuthUtil.getToken(activity.getApplicationContext(), mAccountName, scopes);
} catch (IOException e) {
Logger.eLog(TAG, e.getMessage());
}
我正在访问访问令牌的GoogleAuthUtil类没有刷新令牌的功能.那么如何访问Refresh Token呢?提前致谢!
解决方法:
您应该使用server auth code flow via Auth.GOOGLE_SIGN_IN_API:在Android客户端上获取服务器授权代码,发送到您的服务器,服务器交换代码以进行刷新和访问令牌(带有秘密).此blog post还有更多细节.
此外,如果您现在使用GoogleAuthUtil.getToken作为访问令牌,您需要查看此Google Sign-In best practice blog post以了解如何迁移到建议的流程以确保安全性和最佳用户体验.
Apache Kerby —— Kerberos 协议和 KDC 实现
Apache Kerby™ 是 Java Kerberos 绑定,提供了一个丰富,直观和可互操作的实现,库,KDC,各种集成了 PKI,OTP 和令盘(OAuth2)的基础设施。Apache Kerby 提供了现代化环境(云,Hadoop 和移动端)需要的功能。
关于如何通过GSS-API获取kerberos服务票证?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于active-directory – 将新服务器添加到服务器管理器,获取Kerberos错误0x80090322、ambari集群Kerberos服务异常、Android:如何通过Google登录API获取刷新令牌?、Apache Kerby —— Kerberos 协议和 KDC 实现的相关信息,请在本站寻找。
本文标签: