烧瓶 SSL 证书中的 OIDC SSO 验证失败

Posted

技术标签:

【中文标题】烧瓶 SSL 证书中的 OIDC SSO 验证失败【英文标题】:OIDC SSO in flask SSL certificate verify failed 【发布时间】:2021-02-11 21:23:09 【问题描述】:

我有一个烧瓶驱动的应用程序,我正在尝试为此应用程序启用 OIDC SSO。我选择 wso2 作为身份服务器。我创建了一个回调 URL,并在 Identity Server 和烧瓶应用程序中添加了必要的东西,如下所示。该应用程序能够通过凭据日志记录页面,然后,我收到 SSL 证书验证错误。

我的尝试:

我尝试过使用自签名证书,但app.run(ssl_context='adhoc') 没有用。

代码片段:

from flask import Flask, g
from flask_oidc import OpenIDConnect
# import ssl

logging.basicConfig(level=logging.DEBUG)


app = Flask(__name__)

app.config.update(
    'SECRET_KEY': 'SomethingNotEntirelySecret',
    'TESTING': True,
    'DEBUG': True,
    'OIDC_CLIENT_SECRETS': 'client_secrets.json',
    'OIDC_ID_TOKEN_COOKIE_SECURE': False,
    'OIDC_REQUIRE_VERIFIED_EMAIL': False,

)
 
oidc = OpenIDConnect(app)

@app.route('/private')
@oidc.require_login
def hello_me(): 
    # import pdb;pdb.set_trace()
    info = oidc.user_getinfo(['email', 'openid_id'])
    return ('Hello, %s (%s)! <a href="/">Return</a>' %
            (info.get('email'), info.get('openid_id')))

if __name__ == '__main__':
    # app.run(host='sanudev', debug=True)
    # app.run(debug=True)
    # app.run(ssl_context='adhoc')
    app.run(ssl_context=('cert.pem', 'key.pem'))
    # app.run(ssl_context=('cert.pem', 'key.pem'))

客户信息:


    "web": 
        "auth_uri": "https://localhost:9443/oauth2/authorize",
        "client_id": "hXCcX_N75aIygBIY7IwnWRtRpGwa",
        "client_secret": "8uMLQ92Pm8_dPEjmGSoGF7Y6fn8a",
        "redirect_uris": [
            "https://sanudev:5000/oidc_callback"
        ],
        "userinfo_uri": "https://localhost:9443/oauth2/userinfo",
        "token_uri": "https://localhost:9443/oauth2/token",
        "token_introspection_uri": "https://localhost:9443/oauth2/introspect"
    

应用信息:

python 3.8 Flask 1.1.2

【问题讨论】:

@rakesh-kotian 你遇到这个问题了吗? 【参考方案1】:

您好,回答我自己的问题只是为了有效地接触社区,在这里我可以表达我在哪里卡住以及修复背后的所有故事。

TLDR:

之所以出现 SSL 问题,是因为在 OIDC 流程中 wso2 服务器必须仅通过 SSL 隧道通信或传输安全身份验证令牌。这是出于安全目的需要保留的强制性标准。 是的 carbon server 有 SSL 证书(自签名证书),通过 SSL Tunnel 客户端进行安全令牌传输也必须至少进行自签名证书配置。

由于我使用的是 flask-oidc 库,因此有一个规定允许这样做,请参阅此处的配置。


    "web": 
        "auth_uri": "https://localhost:9443/oauth2/authorize",
        "client_id": "someid",
        "client_secret": "somesecret",
        "redirect_uris": [
            "https://localhost:5000/oidc_callback"
        ],
        "userinfo_uri": "http://localhost:9763/oauth2/userinfo",
        "token_uri": "http://localhost:9763/oauth2/token",
        "token_introspection_uri": "http://localhost:9763/oauth2/introspect",
        "issuer": "https://localhost:9443/oauth2/token" # This can solve your issue
    

为了快速开发,您可以通过在烧瓶应用程序运行设置中添加临时配置来启用 HTTPS 中的安全连接。

if __name__ == '__main__':
    # app.run(ssl_context=('cert.pem', 'key.pem')) # for self signed cert
    app.run(debug=True, ssl_context='adhoc') # Adhoc way of making https

【讨论】:

感谢您提供详细信息。我试过了,但问题还是一样,因此我打开了一个新问题,详细介绍了我的问题***.com/questions/65151766/…,如果有的话,请分享您的宝贵意见。【参考方案2】:

让我用这个警告作为这个答案的序言:

不要在生产环境中这样做

不,说真的,不要在生产中这样做,这应该只用于开发目的。

无论如何,打开oauth2client\transport.py 文件。

您将在吐出的错误中看到此文件位置。对我来说,它在我的 anaconda 环境中

AppData\Local\Continuum\anaconda3\envs\conda_env\lib\site-packages\oauth2client\transport.py

找到这一行(我是第 73 行)

def get_http_object(*args, **kwargs):
    """Return a new HTTP object.

    Args:
        *args: tuple, The positional arguments to be passed when
               contructing a new HTTP object.
        **kwargs: dict, The keyword arguments to be passed when
                  contructing a new HTTP object.

    Returns:
        httplib2.Http, an HTTP object.
    """
    return httplib2.Http(*args, **kwargs)

将返回更改为

return httplib2.Http(*args, **kwargs, disable_ssl_certificate_validation=True)

你可能需要对 flask_oidc/__init__.py 的第 445 行做同样的事情

credentials.refresh(httplib2.Http(disable_ssl_certificate_validation=True))

【讨论】:

以上是关于烧瓶 SSL 证书中的 OIDC SSO 验证失败的主要内容,如果未能解决你的问题,请参考以下文章

证书验证失败怎么回事?

Mandrill webhooks,SSL证书验证失败,验证CA证书没问题

如何修复 SSL 证书验证失败

ncat SSL 问题,证书验证失败(自签名证书)

服务器的SSL证书验证失败问题,怎么解决

CurlException: [curl] 51: SSL: 证书验证失败