我们在调用API时,会涉及到证书问题,这个是最麻烦的,他会将我们请求的数据进行各种加密,这个加密过程中往往加了时间戳、加密证书和公钥证书等一些数据在里面,还有加密的顺序等等,更恶心的还会将加密前的数据进行一次或多次加密,要多猥琐就有多猥琐,最终的请求中还使用了前面证书对数据进行签名,数据即使被别有用心的人拿到了,他不知道加密的顺序和加密的方法,还有证书的话,即使拿到了也没有用。
先跟大家讲解一下这个证书
证书一般来说有两个,一个是签名证书sign.pfx,另一个是加密证书enc.cer,看后缀就可分别
一般来说,这两个证书都是提供API接口的公司给的,签名证书是我们自己的,这个签名证书是根据我们这边的数据生成的
签名证书都有一个密码,这个密码是我们从ie中导出时设置的,或者是对方直接给的我们。
签名证书
得到证书的路径和密码,通过这两个值来得到
列:
p12 = crypto.load_pkcs12(open(sign_cert_file_path, 'rb').read(), pwd) 读取证书路径及密码
p12.get_certificate() # (signed) certificate object 声明证书对象
p12.get_privatekey() # private key. 声明私钥
p12.get_ca_certificates() # ca chain. 声明证书为中国证书
return p12 将这个对象返回
有这个对象后
可以得到
证书ID:str(sign_cert.get_certificate().get_serial_number()) 这个值一定要强转为str类型,不转的话最后面会多个L
私钥 p12.get_privatekey()
加密证书
读取加密证书
with open(encrypt_cert_file_path, 'rb') as f:
public = f.read()
try:
cert = load_pem_x509_certificate(public, backend=default_backend()) load_der_x509_certificate生成公钥私钥对
return cert
返回的这个值可以得到:
公钥:
cert.public_key()
证书ID:
str(cert.serial_number)
等等一系列参数
每个证书都有唯一的ID