gpt4 book ai didi

python - OpenSSL.crypto.X509.sign() 抛出 "' 字节的对象没有属性 'encode'“

转载 作者:太空狗 更新时间:2023-10-30 01:32:47 27 4
gpt4 key购买 nike

所以我尝试使用 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解码OK所以我对那部分很有信心。当我尝试用

签署证书时,问题才真正开始
ca.sign(key, 'sha1')

因为我从 IDE 得到了一个“期望的类型‘bytes’,得到的是‘str’”。检查OpenSSL.crypto.X509.sign()文档并确认它确实需要一个字节对象,切换到

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

我得到一个“AttributeError: 'bytes' object has no attribute 'encode'”异常。单步执行代码,我发现在 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 方法。

就这样开始了我士气低落的“bytes”与“str”的斗争。我想我不是唯一遇到这个问题的人,但我最好的 Google-fu 说服了我。在这一点上,我什至不知道要读些什么才能弄明白这一点。

最佳答案

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

关于python - OpenSSL.crypto.X509.sign() 抛出 "' 字节的对象没有属性 'encode'“,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38780150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com