TKSS-1229: Backport JDK-8368301: sun/security/util/math/intpoly compiler warnings
[](https://central.sonatype.com/search?q=com.tencent.kona
English | 中文
腾讯Kona国密套件是一组Java安全特性的Provider实现,主要服务于Java生态中的国密应用场景。具体地,该套件包含有六个Provider:
KonaCrypto
JNI
OpenSSL
Linux x86_64/aarch64
PhantomReference
KonaCrypto-Native
keytool
PBEWithHmacSM3AndSM4
HmacPBESM3
KonaPKIX
KonaSSL
本项目还提供了一个Spring Boot模块,即kona-demo,作为服务端的示例。该模块演示了将腾讯Kona国密套件集成入第三方Web服务器,包括Jetty和Tomcat,的途径。但该模块并不是本项目的制品之一。另外,kona-ssl模块的测试集还提供了与Netty,gRPC,Apache HttpClient和OkHttp进行集成的示例。
Jetty
Tomcat
kona-ssl
Netty
gRPC
Apache HttpClient
OkHttp
腾讯Kona国密套件可以运行在任何支持JDK的操作系统上。
腾讯Kona国密套件支持JDK的全部五个长期支持(LTS)版本,即8,11,17,21和25。
注意:已经使用Oracle颁发的JCE代码签名证书对本套组件的jar文件签名,所以它们也可以运行在Oracle JDK上。
欢迎使用腾讯的OpenJDK发行版,即Tencent Kona JDK,它提供四个长期支持(LTS)版本8,11,17和21,支持Linux,macOS和Windows等主流操作系统以及x86_64和aarch64等主流CPU架构。最新的Tencent Kona JDK 8和17已经原生地支持了国密密码学算法,国密SSL/TLCP协议和RFC 8998规范。
默认情况下,腾讯Kona国密套件并不需要依赖JDK的任何内部API实现,所以它也可以运行Android平台上。
腾讯Kona国密套件的所有制品(jar文件)都已经上传到了Maven中央仓库。一般地,只需要在项目的构建脚本中把它们声明为依赖就可以了。比如,在Gradle的构建脚本中可以有如下的依赖声明,
repositories { mavenCentral() } dependencies { implementation("com.tencent.kona:kona-crypto:<version>") implementation("com.tencent.kona:kona-pkix:<version>") implementation("com.tencent.kona:kona-ssl:<version>") implementation("com.tencent.kona:kona-provider:<version>") }
注意,并不一定要将所有的Provider都加到类路径中,请根据实际需求去声明依赖。例如,只需要使用国密的密码学算法,且想使用Provider名称Kona时,那么依赖声明可能就像下面这样,
Kona
dependencies { implementation("com.tencent.kona:kona-crypto:<version>") implementation("com.tencent.kona:kona-provider:<version>") }
腾讯Kona国密套件使用Gradle进行构建,其脚本使用Kotlin DSL。该Gradle项目包含有四个子模块,即kona-crypto,kona-pkix,kona-ssl和kona-provider,它们分别对应于五个Provider,即KonaCrypto和KonaCrypto-Native,KonaPKIX,KonaSSL和Kona。
构建该项目的一个典型方法就是在项目的根目录下执行命令:
./gradlew build
它会编译源代码,并执行单元测试,最后制作出jar文件。也可以仅构建某个子模块,比如像下面这样:
./gradlew :kona-pkix:build
非常欢迎与我们一起改进和维护腾讯Kona国密套件,请阅读CONTRIBUTING.md以了解如何报告缺陷,安全漏洞,提出需求和贡献代码。
腾讯Kona国密套件使用的许可协议是GNU GPL v2.0 license with classpath exception,请详见附带的许可协议文本。
问:为何使用SM2 Cipher时会遇到异常java.security.InvalidKeyException: Illegal key size or default parameters? 答:在JDK 8u161之前,JDK默认不能支持较强的加密算法和密钥长度。它们就不能支持256位长度的加密算法,如AES-256。而SM2加密算法的密钥长度也是256,所以也存在这个问题。具体解决方法,请见这个Stack Overflow的问题。
java.security.InvalidKeyException: Illegal key size or default parameters
8u161
AES-256
问:能否在TLS 1.2中支持ECC_SM4_GCM_SM3和ECDHE_SM4_GCM_SM3? 答:由于没有任何RFC规范将国密密码套件引入TLS 1.2协议,所以无法在该协议中支持上述密码套件。但本项目基于RFC 8998支持在TLS 1.3协议中使用国密密码套件TLS_SM4_GCM_SM3。
ECC_SM4_GCM_SM3
ECDHE_SM4_GCM_SM3
TLS_SM4_GCM_SM3
问:是否支持GMSSL或GMSSL 1.1协议? 答:国家标准GB/T 38636-2020定义的这个类TLS安全通信协议是传输层密码协议,其英文为Transport layer cryptography protocol。本组件使用它的简称TLCP,版本为1.1。而TLCP或TLCP 1.1就是GMSSL或GMSSL 1.1。
GMSSL
GMSSL 1.1
传输层密码协议
Transport layer cryptography protocol
TLCP
1.1
TLCP 1.1
问:为什么不能在Oracle JDK下执行本项目中的测试用例? 答:Oracle JDK会验证JCE实现(此处为KonaCrypto或KonaCrypto-Native)是否被签名,并且其关联的证书要由JCE Code Signing CA颁发。而在执行本项目中的测试用例时,其使用的KonaCrypto和KonaCrypto-Native Provider还没有签名,所以不能在Oracle JDK中执行它们。但发布到Maven中央仓库中的jar文件都被签名了,所以它们都可以在Oracle JDK中运行。
问:本项目与BoucyCastle中的国密实现有何关系? 答:本项目的早期版本会依赖BouncyCastle中的国密密码学算法,但从1.0.5版开始,已经不再对BouncyCastle有任何的依赖。由于都是遵循中国相关标准来实现的国密密码学算法,所以这两个组件之间可以正常交互。另外,需要了解的是,BouncyCastle并不支持国密安全通信协议,包括TLCP和TLS 1.3/RFC 8998。
1.0.5
问:可以支持的JDK 8最低版本是多少? 答:根据不同的应用场景,对JDK 8的版本的要求也不尽相同。
8u141
8u251
8u261
你所遇到的问题,之前可能已经有人提出来过了。在提出新的问题之前,请先浏览这些已有的问题。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802032778号
English | 中文
腾讯Kona国密套件
概览
腾讯Kona国密套件是一组Java安全特性的Provider实现,主要服务于Java生态中的国密应用场景。具体地,该套件包含有六个Provider:
KonaCrypto相同。然而,它是基于JNI和OpenSSL的,并且仅支持Linux x86_64/aarch64平台。该Provider会基于PhantomReference自动地管理JNI本地内存。KonaCrypto-Native基本相同,但它不会自动地管理JNI本地内存。KonaCrypto或KonaCrypto-Native。另外,它还提供了两个工具类:keytool相同,可以生成密钥对,创建证书以及密钥库。它支持使用PBEWithHmacSM3AndSM4算法对私钥和密钥库进行加密,也可使用HmacPBESM3算法验证密钥库的完整性。KonaCrypto或KonaCrypto-Native,以及KonaPKIX。KonaCrypto,KonaPKIX和KonaSSL中的特性进行了简单的封装,所以它需要根据实际需求去依赖这些Provider中的一个或多个。。本项目还提供了一个Spring Boot模块,即kona-demo,作为服务端的示例。该模块演示了将腾讯Kona国密套件集成入第三方Web服务器,包括
Jetty和Tomcat,的途径。但该模块并不是本项目的制品之一。另外,kona-ssl模块的测试集还提供了与Netty,gRPC,Apache HttpClient和OkHttp进行集成的示例。系统要求
操作系统
腾讯Kona国密套件可以运行在任何支持JDK的操作系统上。
JDK
腾讯Kona国密套件支持JDK的全部五个长期支持(LTS)版本,即8,11,17,21和25。
注意:已经使用Oracle颁发的JCE代码签名证书对本套组件的jar文件签名,所以它们也可以运行在Oracle JDK上。
欢迎使用腾讯的OpenJDK发行版,即Tencent Kona JDK,它提供四个长期支持(LTS)版本8,11,17和21,支持Linux,macOS和Windows等主流操作系统以及x86_64和aarch64等主流CPU架构。最新的Tencent Kona JDK 8和17已经原生地支持了国密密码学算法,国密SSL/TLCP协议和RFC 8998规范。
Android
默认情况下,腾讯Kona国密套件并不需要依赖JDK的任何内部API实现,所以它也可以运行Android平台上。
安装
腾讯Kona国密套件的所有制品(jar文件)都已经上传到了Maven中央仓库。一般地,只需要在项目的构建脚本中把它们声明为依赖就可以了。比如,在Gradle的构建脚本中可以有如下的依赖声明,
注意,并不一定要将所有的Provider都加到类路径中,请根据实际需求去声明依赖。例如,只需要使用国密的密码学算法,且想使用Provider名称
Kona时,那么依赖声明可能就像下面这样,构建
腾讯Kona国密套件使用Gradle进行构建,其脚本使用Kotlin DSL。该Gradle项目包含有四个子模块,即kona-crypto,kona-pkix,kona-ssl和kona-provider,它们分别对应于五个Provider,即
KonaCrypto和KonaCrypto-Native,KonaPKIX,KonaSSL和Kona。构建该项目的一个典型方法就是在项目的根目录下执行命令:
它会编译源代码,并执行单元测试,最后制作出jar文件。也可以仅构建某个子模块,比如像下面这样:
贡献
非常欢迎与我们一起改进和维护腾讯Kona国密套件,请阅读CONTRIBUTING.md以了解如何报告缺陷,安全漏洞,提出需求和贡献代码。
许可协议
腾讯Kona国密套件使用的许可协议是GNU GPL v2.0 license with classpath exception,请详见附带的许可协议文本。
常见问题
问:为何使用SM2 Cipher时会遇到异常
java.security.InvalidKeyException: Illegal key size or default parameters?答:在JDK
8u161之前,JDK默认不能支持较强的加密算法和密钥长度。它们就不能支持256位长度的加密算法,如AES-256。而SM2加密算法的密钥长度也是256,所以也存在这个问题。具体解决方法,请见这个Stack Overflow的问题。问:能否在TLS 1.2中支持
ECC_SM4_GCM_SM3和ECDHE_SM4_GCM_SM3?答:由于没有任何RFC规范将国密密码套件引入TLS 1.2协议,所以无法在该协议中支持上述密码套件。但本项目基于RFC 8998支持在TLS 1.3协议中使用国密密码套件
TLS_SM4_GCM_SM3。问:是否支持
GMSSL或GMSSL 1.1协议?答:国家标准GB/T 38636-2020定义的这个类TLS安全通信协议是
传输层密码协议,其英文为Transport layer cryptography protocol。本组件使用它的简称TLCP,版本为1.1。而TLCP或TLCP 1.1就是GMSSL或GMSSL 1.1。问:为什么不能在Oracle JDK下执行本项目中的测试用例?
答:Oracle JDK会验证JCE实现(此处为
KonaCrypto或KonaCrypto-Native)是否被签名,并且其关联的证书要由JCE Code Signing CA颁发。而在执行本项目中的测试用例时,其使用的KonaCrypto和KonaCrypto-NativeProvider还没有签名,所以不能在Oracle JDK中执行它们。但发布到Maven中央仓库中的jar文件都被签名了,所以它们都可以在Oracle JDK中运行。问:本项目与BoucyCastle中的国密实现有何关系?
答:本项目的早期版本会依赖BouncyCastle中的国密密码学算法,但从
1.0.5版开始,已经不再对BouncyCastle有任何的依赖。由于都是遵循中国相关标准来实现的国密密码学算法,所以这两个组件之间可以正常交互。另外,需要了解的是,BouncyCastle并不支持国密安全通信协议,包括TLCP和TLS 1.3/RFC 8998。问:可以支持的JDK 8最低版本是多少?
答:根据不同的应用场景,对JDK 8的版本的要求也不尽相同。
8u141(甚至更老的版本)。8u251。8u261。你所遇到的问题,之前可能已经有人提出来过了。在提出新的问题之前,请先浏览这些已有的问题。