如何通过GSS API实现Spring Boot与PostgreSQL的Kerberos认证连接?
如何通过GSS API实现Spring Boot与PostgreSQL的Kerberos身份认证?
问题背景
在加入域的Ubuntu虚拟机部署PostgreSQL,Windows系统可通过Windows账户用psql连接数据库,但Spring Boot应用无法通过GSS API完成Kerberos身份认证,Windows和Ubuntu环境分别出现不同报错。
Windows环境问题修复
错误表现
运行Spring Boot应用时抛出:
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user
PostgreSQL日志显示GSSAPI认证失败,匹配pg_hba.conf的gss规则。
问题根源
- jaas.conf中keyTab路径存在转义错误(
C:\\dev\experiments少了一个反斜杠); - 同时启用
useTicketCache=true和useKeyTab=true,导致Kerberos模块优先尝试票据缓存,缓存无效时因doNotPrompt=true无法交互获取密码,触发报错。
修复步骤
- 修正jaas.conf配置:
pgjdbc { com.sun.security.auth.module.Krb5LoginModule required refreshKrb5Config=true keyTab="C:\\dev\\experiments\\jdbc-kerberos\\krb5.keytab" doNotPrompt=true useTicketCache=false renewTGT=true useKeyTab=true debug=true client=true principal="ivan.fomkin@MYDOMAIN.LOCAL"; };
- 验证keytab有效性:执行
kinit -kt krb5.keytab ivan.fomkin@MYDOMAIN.LOCAL,确认能成功获取Kerberos票据; - 更新JDBC URL:明确指定GSSAPI认证方式:
spring.datasource.url=jdbc:postgresql://ubuntupostgre.mydomain.local:5432/postgres?authentication=gssapi
- 权限检查:确保运行Spring Boot的Windows用户对krb5.keytab文件有读取权限。
Ubuntu环境问题修复
错误表现
以域用户运行应用时抛出:
Caused by: org.postgresql.util.PSQLException: The server requested SCRAM-based authentication, but no password was provided.
PostgreSQL日志显示连接匹配pg_hba.conf的scram-sha-256规则,而非gss规则。
问题根源
pg_hba.conf中127.0.0.1/32的scram认证规则优先级高于gss规则,本地连接优先走scram认证,未触发Kerberos流程。
修复步骤
- 调整pg_hba.conf规则顺序:将gss规则放在scram规则之前,确保本地连接优先使用Kerberos:
host all all 0.0.0.0/0 gss include_realm=1 krb_realm=MYDOMAIN.LOCAL map=gssmap host all all 127.0.0.1/32 scram-sha-256
修改后重启PostgreSQL服务。
2. 更新JDBC URL:明确指定GSSAPI认证:
spring.datasource.url=jdbc:postgresql://ubuntupostgre.mydomain.local:5432/postgres?authentication=gssapi
- 修正jaas.conf配置:禁用票据缓存,避免冲突:
pgjdbc { com.sun.security.auth.module.Krb5LoginModule required refreshKrb5Config=true keyTab="/home/i_fomkin/krb5.keytab" doNotPrompt=true useTicketCache=false renewTGT=true useKeyTab=true debug=true client=true principal="ivan.fomkin@MYDOMAIN.LOCAL"; };
- 验证映射配置:确保
pg_ident.conf中gssmap映射正确:
gssmap ivan.fomkin@MYDOMAIN.LOCAL ivan.fomkin
- 权限检查:确保运行应用的用户对krb5.keytab文件有读取权限。
通用注意事项
- 系统属性设置时机:Kerberos相关系统属性需在Spring Boot驱动初始化前设置,建议在
main方法中提前配置,而非CommandLineRunner; - 驱动版本:使用PostgreSQL JDBC驱动42.2.0及以上版本,确保GSSAPI功能支持正常;
- Kerberos配置验证:通过
kinit、klist命令确认票据获取正常,排除Kerberos基础环境问题。
内容的提问来源于stack exchange,提问作者Ivan Fomkin
相关产品推荐
相关产品推荐

