所以我尝试使用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已经说服了我。在这一点上,我甚至不知道该怎么读才能弄明白这一点。
答案 0 :(得分:1)
事实证明我的IDE(PyCharm)让我误入歧途。 ca.sign(key, 'sha1')
确实是正确的方法。即使PyCharm给出了类型错误,程序执行流程直到语句并且输出正确。