python中找不到crypto.sign,但它在模块中

1 投票
2 回答
4222 浏览
提问于 2025-04-18 16:54

我正在尝试使用一些谷歌的API示例代码,但它没有正常工作。老实说,我对Python还不太熟悉,但我把问题简化成了这个简单的测试程序:

#!/usr/bin/python

from OpenSSL import crypto

print crypto.sign('key', 'xyzzy', 'sha256')

运行后得到的结果是:

Traceback (most recent call last):
  File "./ot", line 5, in <module>
    print crypto.sign('key', 'xyzzy', 'sha256')
AttributeError: 'module' object has no attribute 'sign'

当我查看openssl的加密模块(/usr/lib/python2.6/site-packages/OpenSSL/crypto.py)时,确实发现里面有定义“sign”这个功能:

def sign(self, pkey, digest):
    """
    Sign the certificate request using the supplied key and digest

所以我感到非常困惑。根据我所能判断的,周围没有其他版本的文件。

pip show pyopenssl
---
Name: pyOpenSSL
Version: 0.14
Location: /usr/lib/python2.6/site-packages
Requires: cryptography, six

根据评论扩展的输出:

openssl file:
/usr/lib64/python2.6/site-packages/OpenSSL/__init__.pyc

dir(crypto):
['Error', 'FILETYPE_ASN1', 'FILETYPE_PEM', 'FILETYPE_TEXT', 'NetscapeSPKI', 'NetscapeSPKIType', 'PKCS12', 'PKCS12Type', 'PKCS7Type', 'PKey', 'PKeyType', 'TYPE_DSA', 'TYPE_RSA', 'X509', 'X509Extension', 'X509ExtensionType', 'X509Name', 'X509NameType', 'X509Req', 'X509ReqType', 'X509StoreType', 'X509Type', 'X509_verify_cert_error_string', '_C_API', '__doc__', '__file__', '__name__', '__package__', '_exception_from_error_queue', 'dump_certificate', 'dump_certificate_request', 'dump_privatekey', 'load_certificate', 'load_certificate_request', 'load_pkcs12', 'load_pkcs7_data', 'load_privatekey']

crypto file
/usr/lib64/python2.6/site-packages/OpenSSL/crypto.so

crypto.sign:
Traceback (most recent call last):
  File "./ot", line 16, in <module>
print crypto.sign('key', 'xyzzy', 'sha256')
AttributeError: 'module' object has no attribute 'sign'

2 个回答

2

我发现我的电脑上有一些冲突的安装包。我先删除了一些用yum安装的python-crypto包,然后用pip卸载了openssl,但在/usr/lib64/python2.6/site-packages/OpenSSL/这个文件夹里还有一些东西(包括crypto.so)。所以我手动把那个文件夹删掉了,然后用pip重新安装了pyopenssl,这样问题就解决了。谢谢你的建议...

3

对于那些没有使用openssl并遇到这个问题(缺少签名方法)的人,还有另外一个解决办法。

检查你代码顶部的导入部分,你需要确保有这个导入:

from Crypto.Signature import PKCS1_v1_5

而不是Crypto.Cipher的实现:

from Crypto.Cipher import PKCS1_v1_5

这个类没有签名方法:

https://www.dlitz.net/software/pycrypto/api/2.6/Crypto.Cipher.PKCS1_v1_5.PKCS115_Cipher-class.html

而Crypto.Signature PKCS1_v1_5类是有签名方法的:https://www.dlitz.net/software/pycrypto/api/2.6/Crypto.Signature.PKCS1_v1_5.PKCS115_SigScheme-class.html

撰写回答