Tencent / TencentKonaSMSuite

Tencent Kona SM Suite contains a set of Java security providers, which support algorithms SM2, SM3 and SM4, and protocols TLCP/GMSSL, TLS 1.3 (with RFC 8998) and TLS 1.2.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

是否支持(或有计划支持)国密硬件密码机

eamonzzz opened this issue · comments

请问是否有计划支持国密HSM,因为按国密相关的要求,部分场景通信的签名证书私钥/加密证书私钥需要保存在密码机中。(或者说是否有什么其他方式来实现?)

谢谢!

HSM设备的生产方是不是应该提供相关的JCE/JCA provider?
应用程序会先使用这个provider去生成SM4密钥或SM2密钥对,然后让Kona provider去使用这些密钥或密钥对。

HSM设备的生产方是不是应该提供相关的JCE/JCA provider? 应用程序会先使用这个provider去生成SM4密钥或SM2密钥对,然后让Kona provider去使用这些密钥或密钥对。

  • 就目前我接触到的几个HSM生产方都没有类似的 JCE/JCA 的 provider,他们只是实现了 GM/T 0018 标准的接口库,我们在使用时需要单独使用 JNI 去调用他们的库接口。

  • 调用接口库的方式,在日常基础的加密/签名 是没有问题的,但是用在 TLCP 上就会存在二次封装的问题。当然,这应该只在国密算法这边会有这种问题,像支持 PKCS#11 标准接口的密码机就可以直接使用JCA/JCE 的 provider。

  • 我这边也学习了一下您的代码实现过程,对于 TLCP 协议,您这边是使用了 SM2Signature 和 SM2Cipher 来做签名和加密,那么是否可以提供一些SPI来支持使用 HSM 的能力呢?

(另外我这边前两天也试了一下,自定义一个 Provider 和 Kona 的 Provider去配合,但是实际上不是很理想,因为个人对 Provider 的原理和实现过程没有做太多研究,所以也只是做了简单的尝试。)

就目前我接触到的几个HSM生产方都没有类似的 JCE/JCA 的 provider,他们只是实现了 GM/T 0018 标准的接口库,我们在使用时需要单独使用 JNI 去调用他们的库接口。

如果只是小范围使用,自己做一下封装也是可以的。

调用接口库的方式,在日常基础的加密/签名 是没有问题的,但是用在 TLCP 上就会存在二次封装的问题。

TLCP的代码主要是用的OpenJDK中SunJSSE的代码,自然要调用JCE/JCA的API。

当然,这应该只在国密算法这边会有这种问题,像支持 PKCS#11 标准接口的密码机就可以直接使用JCA/JCE 的 provider。

因为JDK中有SunPKCS11 provider。

我这边也学习了一下您的代码实现过程,对于 TLCP 协议,您这边是使用了 SM2Signature 和 SM2Cipher 来做签名和加密,那么是否可以提供一些SPI来支持使用 HSM 的能力呢?

JDK已经提供了相关的SPI,比如KeyGeneratorSpiKeyPairGeneratorSpi。你去实现它们应该就可以了。
一般地,私钥格式用PKCS#8,而公钥使用X.509中定义的格式。
JDK中已经实现了这些格式,你可以借用那些代码。
Kona国密也是这样做的,比如SM2KeyPairGenerator
实际上,我们在内部也实现了额外的KeyPairGenerator,它就是通过JNI调用C语言库去生成SM2密钥对。