Flask对接Keycloak与SAML外部IDP遇SSL证书验证错误
问题
我有一个运行在https://172.16.150.36:5000的Flask应用,通过OpenIDConnect集成Keycloak 26,同时配置了基于SAML的外部身份提供商(IDP)。
应用核心配置
app = Flask(__name__) app.config.from_pyfile("idp.py") oidc = OpenIDConnect(app)
idp.py配置
SECRET_KEY = '12345678' OIDC_CLIENT_SECRETS = "/code/app/client_secret.json" OIDC_RESOURCE_SERVER_ONLY = False OIDC_SCOPES = ["openid", "email", "profile"] OIDC_INTROSPECTION_AUTH_METHOD = "client_secret_post" OIDC_RESOURCE_CHECK_AUD = True
client_secret.json配置
{ "web": { "client_id": "km3-connector", "client_secret": "aO71fP5MBaBJdKowaIhadM5hYztPKMOD", "auth_uri": "https://172.16.65.49:8443/realms/jb/protocol/openid-connect/auth", "token_uri": "https://172.16.65.49:8443/realms/jb/protocol/openid-connect/token", "userinfo_uri": "https://172.16.65.49:8443/realms/jb/protocol/openid-connect/userinfo", "issuer": "https://172.16.65.49:8443/realms/jb", "redirect_uris": [ "https://172.16.150.36:5000/*" ] } }
Keycloak配置
Keycloak中配置了名为km3-connector的OIDC客户端,开启客户端认证,选择标准流与直接访问授权;同时通过外部IDP的元数据创建了SAML身份提供商,配置了重定向URI、服务提供商实体等信息,其余签名/加密选项均关闭。
问题现象
访问Flask的/login路由后重定向至Keycloak,点击外部IDP别名跳转至SSO登录,登录成功后Keycloak已创建新用户,但重定向回Flask的oidc_callback页面时,抛出错误:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1091)
所有SSL证书均为自签名,请问问题原因是什么?
问题原因与解决方案
问题原因
这个错误的核心是:Flask使用的OpenIDConnect库(通常是flask-oidc)在回调阶段会向Keycloak发起请求(比如获取访问令牌、拉取用户信息),此时会自动验证Keycloak的SSL证书。但你的Keycloak使用的是自签名证书,而Python默认的SSL信任链中不包含该证书,导致验证失败,抛出了这个错误。
解决方案
有两种可行的解决方式:
临时禁用SSL验证(仅测试环境用)
在idp.py里添加一行配置,强制关闭SSL证书验证:# 关闭SSL证书验证,仅限测试环境使用 OIDC_VERIFY_SSL = False注意:生产环境绝对不能这么做,会带来严重的安全隐患。
将自签名证书加入信任链(推荐)
- 先导出Keycloak的自签名证书(可以通过浏览器访问Keycloak地址后导出,或者从Keycloak服务器的
conf目录里找到对应证书文件)。 - 把证书文件放到Flask应用能访问的路径,比如
/code/app/keycloak_cert.pem。 - 在
idp.py里添加配置指定信任的证书:# 指定信任的自签名证书路径 OIDC_CA_BUNDLE = "/code/app/keycloak_cert.pem"
这种方式更安全,适合内部环境或必须用自签名证书的场景。
- 先导出Keycloak的自签名证书(可以通过浏览器访问Keycloak地址后导出,或者从Keycloak服务器的
内容的提问来源于stack exchange,提问作者tascio
相关产品推荐
相关产品推荐

