当前位置:   article > 正文

用python实现SM2数字证书的坑

用python实现SM2数字证书的坑

最近完成的工作项目需要在python3的环境中实现SM2的数字证书,踩了无数个坑才完成,特此记录。

一、GmSSL库的选择 

首先,由于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的源代码。

二、 生成DER格式证书后的编译。

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进行修改,可能验证部分也要进行修改(未验证)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/448911
推荐阅读
相关标签
  

闽ICP备14008679号