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

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值