GVKun编程网logo

如何通过GSS-API获取kerberos服务票证?

14

此处将为大家介绍关于如何通过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服务票证?

如何通过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

active-directory – 将新服务器添加到服务器管理器,获取Kerberos错误0x80090322

我正在设置 Windows实验室环境.它有一个Win2012R2域控制器(srv001),我想将另一个Win2012R2服务器添加到域(srv003).实际上,一切顺利.我给新服务器一个与DC在同一子网中的静态IP地址,指向正确的DNS服务器并将服务器添加到域中.

但是,当我将新服务器添加到服务器管理器时,我收到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服务异常

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获取刷新令牌?

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 —— 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 实现的相关信息,请在本站寻找。

本文标签: