Celery 拒绝反序列化我的自定义序列化的内容,抛出 ContentDisallowed 异常

Sat*_*ddy 5 python serialization openssl celery

我一直在使用 celery 和 rabbitmq 作为我的后端队列来管理我的任务。有些对象包含无法使用 json 序列化的日期时间属性,因此我选择使用 pickle 作为序列化程序。

问题与安全相关,它报告不受信任的内容无法反序列化。通过此链接http://celery.readthedocs.org/en/latest/userguide/security.html#guide-security 后, 我生成了私钥和关联的自签名证书 usinf openssl并相应地配置了身份验证设置。这次我看到错误为 ExpiredCerticate,我没有找到任何相关的文档。

所以我写了自定义 serializer 如下,之后它抛出与泡菜说的相同类型的错误

import json
from datetime import datetime
from time import mktime

class DateTimeEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime):
            return {
                '__type__': '__datetime__',
                'epoch': int(mktime(obj.timetuple()))
            }
        else:
            return json.JSONEncoder.default(self, obj)

def datetime_decoder(obj):
    if '__type__' in obj:
        if obj['__type__'] == '__datetime__':
            return datetime.fromtimestamp(obj['epoch'])
    return obj

# Encoder function                                                                                                                                                                                               
def datetime_dumps(obj):
    return json.dumps(obj, cls=DateTimeEncoder)

# Decoder function                                                                                                                                                                                               
def datetime_loads(obj):
    return json.loads(obj, object_hook=datetime_decoder)
Run Code Online (Sandbox Code Playgroud)

ContentDisallowed:拒绝反序列化类型序列化器(应用程序/x-序列化器)的不受信任的内容

有人可以指导我如何进行。任何帮助表示赞赏。

提前致谢!

小智 5

上面没有完全的解决方案,但您可以通过以下解决方法。默认情况下,在 kombu 序列化文件 (serialization.py) 中调用禁用所有可用序列化程序的函数(包括pickle)

from kombu.serialization import registry
registry.enable('pickle')
Run Code Online (Sandbox Code Playgroud)

它将启用 pickle 序列化程序,而不管内容是可信的还是不可信的。当然这是一个黑客。希望对你有帮助!