微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决烧瓶SSL证书中的OIDC SSO验证失败

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

我的尝试:

  • 我尝试使用自签名证书,但是 root.child('admins').child(auth.token.phone_number) 无效。

代码段:

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'))

应用信息:

  • python 3.8
  • 烧瓶1.1.2

enter image description here

解决方法

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

TLDR:

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

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

match = re.search('name="csrfmiddlewaretoken" value="([0-9a-zA-z]+)',body)
if match:
    csrfmiddlewaretoken = match.group(1)
else:
    # deal with it

出于快速开发目的,您可以通过在flask应用运行设置中添加临时配置来启用HTTPS中的安全连接。

{
    "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
    }
}
,

让我用这个警告作为这个答案的开头:

不要在生产环境中这样做

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

无论如何,打开 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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?