OpenSSL.crypto.X509.sign()抛出" '字节'对象没有属性'编码' "

时间:2016-08-05 02:22:27

标签: python python-3.x pyopenssl

所以我尝试使用OpenSSL加密模块使用以下代码生成新的CA证书:

#warning: this block is background information, probably not 
#where my real problem is

#generate the key pair
key=OpenSSL.crypto.PKey()
key.generate_key(OpenSSL.crypto.TYPE_RSA,2048)

#print the private and public keys as PEMs
print(codecs.decode(OpenSSL.crypto.dump_publickey(OpenSSL.crypto.FILETYPE_PEM,key),'utf8'))
print(codecs.decode(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM,key),'utf8'))

#generate a new x509 certificate
ca=OpenSSL.crypto.X509()

#fill it with goodies
ca.set_version(3)
ca.set_serial_number(1)
ca.get_subject().CN = "CA.test.com"
ca.gmtime_adj_notBefore(0)
ca.gmtime_adj_notAfter(60 * 60 * 24 * 365 * 10)
ca.set_issuer(ca.get_subject())
ca.set_pubkey(key)

#print the new certificate as a PEM
print(codecs.decode(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM,ca),'utf8'))

打印出来的证书在SSLShopper certificate decoder解码好,所以我对这部分感到非常自信。当我尝试使用

签署证书时,问题才真正开始
ca.sign(key, 'sha1')
因为我得到了一个"期望的类型'字节',得到' str'相反"来自IDE。检查OpenSSL.crypto.X509.sign()文档并确认它确实需要一个bytes对象,切换到

digestname='sha1'.encode('utf-8')
ca.sign(key, digestname)

我得到一个" AttributeError:' bytes'对象没有属性'编码' "例外。单步执行代码我发现OpenSSL._util.byte_string()中抛出了异常,因为

if PY3:
    def byte_string(s):
    return s.encode("charmap")
else:
    def byte_string(s):
    return s

其中PY3 = True且s = {bytes} b' sha1',当然没有.encode方法。

因此开始我的士气低落的字节' vs' str'斗争。我想我并不是唯一一个遇到这个问题的人,但是我最好的Google-fu已经说服了我。在这一点上,我甚至不知道该怎么读才能弄明白这一点。

1 个答案:

答案 0 :(得分:1)

事实证明我的IDE(PyCharm)让我误入歧途。 ca.sign(key, 'sha1')确实是正确的方法。即使PyCharm给出了类型错误,程序执行流程直到语句并且输出正确。