代码之家  ›  专栏  ›  技术社区  ›  Eric D'Souza

在lambda上使用M2Crypto的问题(适用于EC2)

  •  0
  • Eric D'Souza  · 技术社区  · 6 年前

    我用 Lambda AMI image ,将M2Crypto安装到virtualenv中,并能够使我的函数在EC2上工作。

    然后我压缩了站点包并上传到Lambda。我犯了这个错误

    无法导入模块“epd\u M2Crypto”: sk_deep_copy,文件中未定义libcrypto.so.10版本 带链接时间参考的libcrypto.so.10

    也有类似的问题和提示 here here

    • OpenSSL 1.0.0-fips 2010年3月29日(lambda版本)
    • OpenSSL 1.0.2k-fips 2017年1月26日(ec2版本)

    我不认为答案是降低ec2上的openssl等级,因为1.0.0版本已经过时(AWS应用了安全补丁,但版本仍然显示为1.0.0)(而且百胜没有这么老的版本)

    以下是我在EC2实例上使用的使其在EC2上工作的步骤:

    $ sudo yum -y update
    $ sudo yum -y install python36
    $ sudo yum -y install python-virtualenv
    $ sudo yum -y groupinstall "Development Tools"
    $ sudo yum -y install python36-devel.x86_64
    $ sudo yum -y install openssl-devel.x86_64
    
    $ mkdir ~/forlambda
    $ cd ~/forlambda
    $ virtualenv -p python3 venv
    $ source venv/bin/activate
    
    $ cd ~
    $ pip install M2Crypto -t ~/forlambda/venv/lib/python3.6/site-packages/
    
    $ cd ~/forlambda/venv/lib/python3.6/site-packages/
    $ (create python function that uses M2Crypto)
    $ zip -r9 ~/forlambda/archive.zip .
    

    然后添加到zip文件

    • /usr/bin/openssl

    并上传到兰姆达,这就是我现在被困的地方。

    """
    Wrapper for M2Crypto
    https://github.com/mcepl/M2Crypto
    https://pypi.org/project/M2Crypto/
    """
    
    from __future__ import print_function
    from M2Crypto import RSA
    import base64
    import json
    
    def decrypt_string(string_b64):
        rsa = RSA.load_key('private_key.pem')
        string_encrypted = base64.b64decode(string_b64)
        bytes = rsa.private_decrypt(string_encrypted, 1)
        string_plaintext = bytes.decode("utf-8")
    
        response = {
            's': string_plaintext,
            'status': "OK",
            'statuscode': 200
        };
        return response
    
    
    def lambda_handler(event, context):
    
        response = ""
        action = event['action']
    
        if action == "decrypt":
            string_b64 = event['s']
            response = decrypt_string(string_b64)
    
        return response
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   Eric D'Souza    6 年前

    首先,我在EC2实例上运行了这个命令,以确保在我的.zip中包含了正确的.so文件:

    $ ldd -v _m2crypto.cpython-36m-x86_64-linux-gnu.so 
    

    ldd命令的输出(为简洁起见进行了编辑):

        libssl.so.10 => /lib64/libssl.so.10 (0x00007fd5f1892000)
        libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fd5f1433000)
    

    根据上面的输出,我将/lib64/libcrypto.so.10包含在我的.zip文件中。

    我不确定我是否需要这两个改变来解决我的问题,但它现在工作,经过三天的故障排除,我不敢触摸它,看看是一个或另一个使它工作。

        2
  •  0
  •   mcepl    6 年前

    这也许太残忍了,但有没有可能 LD_PRELOAD

        3
  •  0
  •   Eric D'Souza    6 年前

    我们的内部团队已经确认问题出在Lambda的Python上 初始化后,Lambda无法链接到正确的OpenSSL 库-而不是链接到Lambda自己的内置OpenSSL 二进制文件。

    研究小组建议在Python3.7环境中进行试验 更新的openssl 1.0.2,您不必在 Lambda包。。。仍然必须在中包含OpenSSL二进制文件

        4
  •  0
  •   Omer Akhter    6 年前

    awslambda在旧版本的amazonlinux上运行代码( amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html

    因此,要运行依赖于共享库的代码,它需要在相同的环境中编译,以便能够正确链接。

    在这种情况下,我通常使用docker容器创建virtualenv。virtualenv可以用lambda代码打包。

    请注意,如果需要使用yum(docker容器中)安装任何内容,则必须使用与amazon linux版本相同的发布服务器:

    yum --releasever=2017.03 install ...