赞
踩
最近完成的工作项目需要在python3的环境中实现SM2的数字证书,踩了无数个坑才完成,特此记录。
首先,由于SM2是近些年来提出的,python的公开库中没有实现这个功能的库!!找了好久,最后找到了北京大学团队开发的GmSSL库,这个库中提供了很多标准的国密算法功能,这个库目前还在不停的更新,数据库的开发文档不完整……我目前使用的版本是3.1.1
我的开发环境是win11,安装这个库的时候使用的是visual studio配套的可视化安装,这个库的说明文档中有具体的安装方法,可以直接按照其进行安装,需要再windows上下载cmake;成功运行gmssl后从debug和realease中找到对应的gmssl.dll作为动态库。
虽然这个库中提供了python的接口版本,但是其中只有SM2数字证书内容导入和验证,没有相关证书生成功能,想要实现SM2数字证书必须通过ctypes调用gmssl的C语言编译出来的动态库。
相关接口函数的使用方法可以通过dumpbin /exports [dll所在路径]来查看,相关的函数可以参考gmssl和VS附带的x509test的源代码。
SM2数字证书一般有DER格式和PEM格式,我依照x509test中的案例,生成了DER格式result_der,再通过添加:
pem_data = base64.b64encode(result_der).decode('utf-8')
pem_data = '-----BEGIN CERTIFICATE-----\n' + pem_data + '\n-----END CERTIFICATE-----\n'
将DER格式转化为PEM格式,之后直接写到.cer文件中就行。
虽然GmSSL库中提供了将DER转化为PEM格式后存入文件中的函数接口,但是这个函数再python中没有办法调用,具体原因为止,查询后没有解决方案,但是可以推测是因为这个函数需要调用一个文件的句柄,但是python中无法将这个句柄传入动态链接库。
SM2数字证书是用SM2withSM3算法进行签名的,这个可以直接找gmssl再python中提供的库,用pycharm可以直接查询到,提供了签名的方式,注意数字证书的usr_id,我在生成和验证时使用的都是默认值,如果usr_id进行修改,可能验证部分也要进行修改(未验证)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。