目前发现 sm2 有很多实现,比如 gmssl, openssl 1.1.1 ,openssl 3.0 和各种代码库实现等等。实践中发现这些实现会出现不能互相验签的情况。
网上的资料,给出了一些 openssl 指令,但是没有标明 openssl 的版本,由于 openssl1.1.1 版本和 openssl 3 版本支持的参数有区别,会导致到具体环境可能执行出错的情况1
openssl 3.0.2 sm2 签名验签
#Ubuntu 22.04.1 LTS
#version
#openssl version
#OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
#生成秘钥
openssl ecparam -genkey -name SM2 -out pri.key
openssl ec -in pri.key -pubout -out pub.key
echo -n "1234" > data
#pkeyutl 默认 userid 是空的,可通过 distid 指定。
openssl pkeyutl -sign -in data -inkey pri.key -out pkeysig -rawin -digest sm3
openssl pkeyutl -verify -pubin -in data -inkey pub.key -sigfile pkeysig -rawin -digest sm3
#dgst 这个 -sm3 好像不用加,默认就是sm3,默认 userid 是空的,可通过 distid 指定。
openssl dgst -sm3 -sign pri.key -out dgstsig -sigopt distid:1234567812345678 data
openssl dgst -sm3 -verify pub.key -signature dgstsig -sigopt distid:1234567812345678 data
不能互相验签的原因
在数据、公私钥一致的情况下,不同工具之间不能互相验签有三种原因:签名算法不同、userid 不同、摘要算法不同。下面是一个由于算法不同导致无法互相验签的例子。
gmssl v2 用 dgst 命令通过 sm2 私钥签名出的结果,在别的工具上无法验签的问题分析
注
macos 上的openssl version 显示为 libressl ,还不支持sm2
openssl 1.1.1 目前停止维护了。 ↩︎