宝兰德BES应用服务器是一款JavaEE应用服务器,支持最新的JavaEE规范标准,如EJB3.2、Servlet3.1、JSP2.3、JSTL1.2、JSF2.2、JavaMail1.5、JMS2.0等。从大的功能来讲BES应用服务器功能主要包括:
国密算法指的是SM2/SM3/SM4等算法,其中“SM”代表“商密”,即用于商用的、不涉及国家秘密的密码技术。
国密证书是使用国密算法进行公钥签名和HASH运算,并采用国密密钥封装的证书。国密证书同样符合X.509等国际标准证书规范。在国内很多政企应用场景中,经常会使用“双国密证书”架构,即每个服务同时部署两套证书:签名证书和加密证书。签名证书代表该节点身份,用于身份认证和对数据签名;加密证书用于交换密钥和对数据加密。
国密SSL协议是符合国密标准GM/T0024-2014[4]和GB/T38636-2020[5]的安全传输协议,类似于国际SSL/TLS,国密SSL协议实际落地,需要国密证书、国密Web服务器、国密浏览器等互相配合。
国密SSL可同时兼容标准SSL,在同一个服务端口中,自适应来自不同客户端标准SSL通信和国密SSL通信,解决从标准SSL到国密SSL的平滑过度。
下面主要介绍宝兰德BES应用服务器如何通过毕昇JDK的BGMProvider来实现web服务的国密SSL通信。
可以通过maven坐标直接依赖编译好的库,目前最新版本是1.0.3.2:
将target目录下的jsse-xxxx.jar,jca-xxxx.jar,bgmprovider-xxxx.jar三个jar包(或bgmprovider-xxxx-jar-with-dependencies.jar一个jar包)拷贝至CLASSPATH目录即可。如果在tomcat中使用,则还需要将tomcat-adaptor-xxxx.jar拷贝至$TOMCAT_HOME/lib。
方式一:修改JDK配置文件,直接集成到JDK当中
修改path_to_jre/lib/security/java.security文件,添加BGMProvider。
例:设置BGMProvider为最高优先级
这里我们选择毕昇JDK8u302和BES9.5版本,以下是一些简单的安装和启动过程:
完成之后可以启动BES应用服务器:
在国密通道页面中指定以下参数:
这里我们编写一个简单的web测试应用部署到BES当中,一个静态页面index.html,内容如下:
部署应用之后,即可重启BES使得配置生效,重启方式如下:
可以看到使用的证书确实我们在前文中创建的SM2国密证书。
通过过滤8445端口信息之后,重复上述访问步骤,可获取到如下报文:
基本符合规范中的握手过程:
从握手协议上看,和标准TLS并无太大差别,我们继续看几个核心握手消息的内容,
ClientHello:客户端告诉服务端使用GMTLS协议、密码套件支持ECC_SM4_SM3(同ECC_SM4_CBC_SM3):
ServerHello:确定密码套件选择ECC_SM4_SM3
Certificates:将服务端国密证书发给客户端(签名证书、加密证书、根证书)
ServerKeyExchange:服务端密钥交换,细节可参考国密标准(GM/T0024-2014[4]和GB/T38636-2020[5])
ClientKeyExchange:客户端密钥交换
后续就是数据加密传输,此处不再叙述,详细可参考国密标准。从整个握手过程可判断确实已经在BES上实现GMTLS通信。
经过上面的测试,毕昇JDK的BGMProvider国密库在不做修改的情况下完全可以集成到BES应用服务器当中,作为GMTLS的引擎,且基本功能测试正常,后续还可以测试其他密码套件以及性能测试等,除了web应用,在普通java应用中也可以尝试使用BGMProvider作为国密库使用。以上如有错误的地方,欢迎指正。