目录
前言
当前的软件形势来看,国密和信创都是大势所趋。项目组中也越来越多场景要求使用通道加密。维护的项目中大多用到netty框架,netty默认支持SSL/TLS,但都是国际算法,当前openssl对国密算法支持仅限于基础算法层面,还没有涉及到通道加密。记录一下Netty适配国密SSL通道加密的过程,避免遗忘,也算是让自己这段时间的成果不白费。
一、Tongsuo是啥?
铜锁开源密码库 · 语雀铜锁/Tongsuo(原BabaSSL)是一个提供现代...https://www.yuque.com/tsdoc
二、为什么选择Tongsuo?
简单粗暴,选择Tongsuo是因为他获得了国密资质,了解这个东西的人估计都会选择Tongsuo吧。
三、Netty的实现
Netty调用Netty-tcnative组件,Netty-tcnative调用集成Openssl算法库的JNI动态库。集成思路:将Openssl替换为Tongsuo。
Netty编译需要依赖Netty-tcnative组件。Netty-tcnative使用Maven编译时会去下载密码库代码,编译密码库组件,并将密码库的库文件静态依赖到JNI动态库中。由此完成Netty到密码库的通道加密的调用。
四、编译方法
1.Netty
mvnw clean install \
-DskipTests \
-Dmaven.test.skip=true \
-Dcheckstyle.skip=true
2.Netty-tcnative
mvnw clean install
3.Tongsuo
config -O3 -fno-omit-frame-pointer -fPIC \
no-ssl3 no-shared no-comp \
-DOPENSSL_NO_HEARTBEATS \
--strict-warnings enable-ntls \
--prefix=${opensslHome} --openssldir=${opensslHome}
make -j
make install
五、集成过程
1.Netty-tcnative编译Tongsuo密码库
Netty-tcnative主要分为openssl-classes(JNI Java类模块)、openssl-dynamic(JNI 动态库C代码模块)、openssl-static(动态库集成密码库模块),其他的两个模块boringssl-static和libressl-static没用过,没有深入了解。maven编译时直接注释了。
openssl-static pom.xml中编译openssl有windows、linux、mac不同系统的profile,对应替换Tongsuo下载路径:
<configuration>
<target>
<taskdef resource="net/sf/antcontrib/antcontrib.properties" />
<if>
<available file="${opensslSourceDir}" />
<then>
<echo message="OpenSSL was already downloaded, skipping the build step." />
</then>
<else>
<echo message="Downloading Tongsuo" />
<mkdir dir="${opensslSourceDir}" />
<get
src="https://codeload.github.com/Tongsuo-Project/Tongsuo/zip/refs/heads/master"
dest="${project.build.directory}/tongsuo-${opensslVersion}.zip" verbose="on" />
<exec executable="unzip" failonerror="true"
dir="${project.build.directory}/" resolveexecutable="true">
<arg line="tongsuo-${opensslVersion}.zip" />
</exec>
<move file="${project.build.directory}/Tongsuo-master"
tofile="${opensslSourceDir}" /&g