ssl.SSLCertVerificationError 使用 django-channels 连接到 heroku redis 时

ssl.SSLCertVerificationError When connecting to heroku redis with django-channels

我正在聊天。我需要使用 WebSocket 并将我的应用程序部署到 Heroku。我使用免费的 heroku-redis 和 django-channels 在我的设置中 py:

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [os.environ.get('REDIS_TLS_URL')],
        },
    },
}

我尝试使用 REDIS_URL 但我遇到了同样的错误

然后我切换到REDIS_TLS_URL。 这两个错误都是从 consumers.py 的“await self.channel_layer.group_add()”

引发的
class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name

        print('==================================')
        print('==================================')
        print(self.room_name)
        print(self.room_group_name)
        print('==================================')
        print('==================================')

        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()
.........

这是日志

2021-12-25T08:59:56.469939+00:00 app[web.1]: 2021-12-25 08:59:56,469 DEBUG    Upgraded connection ['10.1.3.218', 11273] to WebSocket
2021-12-25T08:59:56.859805+00:00 app[web.1]: 2021-12-25 08:59:56,859 INFO     ==================================
2021-12-25T08:59:56.859921+00:00 app[web.1]: 2021-12-25 08:59:56,859 INFO     ==================================
2021-12-25T08:59:56.860015+00:00 app[web.1]: 2021-12-25 08:59:56,859 INFO     FIRST
2021-12-25T08:59:56.860107+00:00 app[web.1]: 2021-12-25 08:59:56,860 INFO     chat_FIRST
2021-12-25T08:59:56.860196+00:00 app[web.1]: 2021-12-25 08:59:56,860 INFO     ==================================
2021-12-25T08:59:56.860287+00:00 app[web.1]: 2021-12-25 08:59:56,860 INFO     ==================================
2021-12-25T08:59:56.860674+00:00 app[web.1]: 2021-12-25 08:59:56,860 DEBUG    Creating tcp connection to ('ec2-34-241-115-34.eu-west-1.compute.amazonaws.com', 29080)
2021-12-25T08:59:56.861684+00:00 app[web.1]: 2021-12-25 08:59:56,861 DEBUG    Creating tcp connection to ('ec2-34-241-115-34.eu-west-1.compute.amazonaws.com', 29080)
2021-12-25T08:59:56.872570+00:00 app[web.1]: 2021-12-25 08:59:56,872 DEBUG    Closed 0 connection(s)
2021-12-25T08:59:57.708867+00:00 app[web.1]: 2021-12-25 08:59:57,706 ERROR    Exception inside application: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)
2021-12-25T08:59:57.708874+00:00 app[web.1]: Traceback (most recent call last):
2021-12-25T08:59:57.708875+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/routing.py", line 71, in __call__
2021-12-25T08:59:57.708876+00:00 app[web.1]: return await application(scope, receive, send)
2021-12-25T08:59:57.708877+00:00 app[web.1]: File "/usr/src/app/./config/middlewares.py", line 58, in __call__
2021-12-25T08:59:57.708878+00:00 app[web.1]: return await super().__call__(scope, receive, send)
2021-12-25T08:59:57.708878+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/middleware.py", line 26, in __call__
2021-12-25T08:59:57.708878+00:00 app[web.1]: return await self.inner(scope, receive, send)
2021-12-25T08:59:57.708878+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/routing.py", line 150, in __call__
2021-12-25T08:59:57.708879+00:00 app[web.1]: return await application(
2021-12-25T08:59:57.708879+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/consumer.py", line 94, in app
2021-12-25T08:59:57.708880+00:00 app[web.1]: return await consumer(scope, receive, send)
2021-12-25T08:59:57.708880+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/consumer.py", line 58, in __call__
2021-12-25T08:59:57.708881+00:00 app[web.1]: await await_many_dispatch(
2021-12-25T08:59:57.708882+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/utils.py", line 51, in await_many_dispatch
2021-12-25T08:59:57.708882+00:00 app[web.1]: await dispatch(result)
2021-12-25T08:59:57.708882+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/consumer.py", line 73, in dispatch
2021-12-25T08:59:57.708883+00:00 app[web.1]: await handler(message)
2021-12-25T08:59:57.708883+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels/generic/websocket.py", line 173, in websocket_connect
2021-12-25T08:59:57.708883+00:00 app[web.1]: await self.connect()
2021-12-25T08:59:57.708883+00:00 app[web.1]: File "/usr/src/app/./chat/consumers.py", line 49, in connect
2021-12-25T08:59:57.708884+00:00 app[web.1]: await self.channel_layer.group_add(
2021-12-25T08:59:57.708884+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels_redis/core.py", line 646, in group_add
2021-12-25T08:59:57.708885+00:00 app[web.1]: async with self.connection(self.consistent_hash(group)) as connection:
2021-12-25T08:59:57.708885+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels_redis/core.py", line 902, in __aenter__
2021-12-25T08:59:57.708885+00:00 app[web.1]: self.conn = await self.pool.pop()
2021-12-25T08:59:57.708885+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels_redis/core.py", line 93, in pop
2021-12-25T08:59:57.708886+00:00 app[web.1]: conn = await self.create_conn(loop)
2021-12-25T08:59:57.708886+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/channels_redis/core.py", line 79, in create_conn
2021-12-25T08:59:57.708886+00:00 app[web.1]: return await aioredis.create_redis_pool(**kwargs)
2021-12-25T08:59:57.708887+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/aioredis/commands/__init__.py", line 188, in create_redis_pool
2021-12-25T08:59:57.708887+00:00 app[web.1]: pool = await create_pool(address, db=db,
2021-12-25T08:59:57.708887+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/aioredis/pool.py", line 58, in create_pool
2021-12-25T08:59:57.708888+00:00 app[web.1]: await pool._fill_free(override_min=False)
2021-12-25T08:59:57.708888+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/aioredis/pool.py", line 383, in _fill_free
2021-12-25T08:59:57.708888+00:00 app[web.1]: conn = await self._create_new_connection(self._address)
2021-12-25T08:59:57.708889+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/aioredis/connection.py", line 111, in create_connection
2021-12-25T08:59:57.708889+00:00 app[web.1]: reader, writer = await asyncio.wait_for(open_connection(
2021-12-25T08:59:57.708889+00:00 app[web.1]: File "/usr/local/lib/python3.9/asyncio/tasks.py", line 442, in wait_for
2021-12-25T08:59:57.708890+00:00 app[web.1]: return await fut
2021-12-25T08:59:57.708890+00:00 app[web.1]: File "/usr/local/lib/python3.9/site-packages/aioredis/stream.py", line 23, in open_connection
2021-12-25T08:59:57.708890+00:00 app[web.1]: transport, _ = await get_event_loop().create_connection(
2021-12-25T08:59:57.708891+00:00 app[web.1]: File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1081, in create_connection
2021-12-25T08:59:57.708891+00:00 app[web.1]: transport, protocol = await self._create_connection_transport(
2021-12-25T08:59:57.708891+00:00 app[web.1]: File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1111, in _create_connection_transport
2021-12-25T08:59:57.708892+00:00 app[web.1]: await waiter
2021-12-25T08:59:57.708892+00:00 app[web.1]: File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 528, in data_received
2021-12-25T08:59:57.708892+00:00 app[web.1]: ssldata, appdata = self._sslpipe.feed_ssldata(data)
2021-12-25T08:59:57.708892+00:00 app[web.1]: File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 188, in feed_ssldata
2021-12-25T08:59:57.708893+00:00 app[web.1]: self._sslobj.do_handshake()
2021-12-25T08:59:57.708893+00:00 app[web.1]: File "/usr/local/lib/python3.9/ssl.py", line 944, in do_handshake
2021-12-25T08:59:57.708893+00:00 app[web.1]: self._sslobj.do_handshake()
2021-12-25T08:59:57.708894+00:00 app[web.1]: ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1129)
2021-12-25T08:59:57.709065+00:00 app[web.1]: 2021-12-25 08:59:57,708 INFO     failing WebSocket opening handshake ('Internal server error')

我在 channels_redis 上发现了解决此问题的未解决问题:https://github.com/django/channels_redis/issues/235

这似乎是一个临时修复,直到 channels_redis 被更新以正确设置 SSL 上下文

ssl_context = ssl.SSLContext()
ssl_context.check_hostname = False

heroku_redis_ssl_host = {
    'address': 'rediss://:password@127.0.0.1:6379/0'  # The 'rediss' schema denotes a SSL connection.
    'ssl': ssl_context
}

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            'hosts': (heroku_redis_ssl_host,)
        }
    },
}