You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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信任链中不包含该证书,导致验证失败,抛出了这个错误。

解决方案

有两种可行的解决方式:

  1. 临时禁用SSL验证(仅测试环境用)
    在idp.py里添加一行配置,强制关闭SSL证书验证:

    # 关闭SSL证书验证,仅限测试环境使用
    OIDC_VERIFY_SSL = False
    

    注意:生产环境绝对不能这么做,会带来严重的安全隐患。

  2. 将自签名证书加入信任链(推荐)

    • 先导出Keycloak的自签名证书(可以通过浏览器访问Keycloak地址后导出,或者从Keycloak服务器的conf目录里找到对应证书文件)。
    • 把证书文件放到Flask应用能访问的路径,比如/code/app/keycloak_cert.pem。
    • 在idp.py里添加配置指定信任的证书:
      # 指定信任的自签名证书路径
      OIDC_CA_BUNDLE = "/code/app/keycloak_cert.pem"
      

    这种方式更安全,适合内部环境或必须用自签名证书的场景。


内容的提问来源于stack exchange,提问作者tascio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:44:56