Kerberos HTTP服务GSS认证报错:凭证无效(主机名/域名不匹配)
针对你遇到的curl获取的Kerberos HTTP票据与请求主机名不匹配、受/etc/hosts顺序影响的问题,以下是几个可行的解决方法:
1. 关闭Kerberos客户端的反向DNS解析
Kerberos客户端默认会通过反向DNS解析请求IP对应的主机名,并用这个主机名生成SPN请求,这是导致票据主体与请求FQDN不一致的核心原因之一。关闭反向解析后,客户端会直接使用请求中指定的正向主机名。
操作步骤:
修改/etc/krb5.conf配置文件,在[libdefaults]段添加或修改以下配置:[libdefaults] default_realm = HADOOP.COM rdns = false # 关闭反向DNS解析 ... # 其他原有配置效果:
curl发起请求时,会直接使用你指定的master.hadoop.com作为SPN的主机部分,向KDC请求HTTP/master.hadoop.com@HADOOP.COM的票据,不再受/etc/hosts顺序或反向DNS结果的影响。
2. 为Hadoop服务配置Kerberos SPN别名
通过在KDC中为Hadoop节点添加多个HTTP SPN,并将它们绑定到同一个keytab文件,让Hadoop服务可以识别多个FQDN对应的票据。
操作步骤:
- 在Hadoop的KDC中添加两个HTTP主体(如果还未添加):
kadmin.local -q "addprinc -randkey HTTP/master.hadoop.com@HADOOP.COM" kadmin.local -q "addprinc -randkey HTTP/hadoopmaster.idm.com@HADOOP.COM" - 将两个SPN导出到Hadoop使用的keytab文件中:
kadmin.local -q "ktadd -k /etc/hadoop/conf/hadoop.keytab HTTP/master.hadoop.com@HADOOP.COM" kadmin.local -q "ktadd -k /etc/hadoop/conf/hadoop.keytab HTTP/hadoopmaster.idm.com@HADOOP.COM" - 修改Hadoop的
core-site.xml,允许多个SPN主体:<property> <name>hadoop.http.authentication.kerberos.principal</name> <value>HTTP/master.hadoop.com@HADOOP.COM,HTTP/hadoopmaster.idm.com@HADOOP.COM</value> </property>
- 在Hadoop的KDC中添加两个HTTP主体(如果还未添加):
效果:
无论curl获取的是哪个FQDN的HTTP票据,Hadoop服务都能通过keytab中的密钥验证票据合法性,避免因SPN不匹配导致的403错误。
3. 强制curl使用指定主机名进行认证
使用curl的--resolve参数绕过系统DNS解析,直接将请求的FQDN映射到节点IP,配合Kerberos的rdns=false配置,确保curl严格使用指定的主机名生成SPN请求。
操作命令:
curl -k -v --negotiate -u : --resolve master.hadoop.com:8090:<你的节点IP> https://master.hadoop.com:8090/cluster效果:
curl会直接使用你指定的master.hadoop.com作为SPN的主机部分,不受/etc/hosts顺序影响,生成与Hadoop配置一致的票据请求。
内容的提问来源于stack exchange,提问作者uds0128

