因项目需要了解一下fisco SDK与节点如何实现gm tls
思路:
- fisco webase-front这个项目可以直接与节点进行通讯,我们首先了解这个项目。
在front的配置文件中设置gm or k1连接,说明在front中支持两种连接方式,我们需要在front中找到构建这两种连接的地方。 - 在研究front这个项目的时候,发现front与节点进行沟通是通过web3sdk这个项目,因此我们需要了解一下webase的web3sdk
web3sdk for fisco 的内部实现
在rpc通道构建的时候,在ChannelConnections类中有个startConnect方法,在这个方法中有个 sm2 Or ECDSA 的判断
SslContext sslContext =
(EncryptType.encryptType == EncryptType.ECDSA_TYPE)
? initSslContext()
: initSMSslContext();
然后我们进入到initSMSslContext方法
public SslContext initSMSslContext()
throws IOException, InvalidKeySpecException, CertificateException,
NoSuchAlgorithmException, NoSuchProviderException {
// The client's SM SSL certificate exists
if ((getGmCaCert() != null && getGmCaCert().exists())
|| (getGmEnSslCert() != null && getGmEnSslCert().exists())
|| (getGmEnSslKey() != null && getGmEnSslKey().exists())
|| (getGmSslCert() != null && getGmSslCert().exists())
|| (getGmSslKey() != null && getGmSslKey().exists())) {
return SMSslClientContextFactory.build(
getGmCaCert().getInputStream(),
getGmEnSslCert().getInputStream(),
getGmEnSslKey().getInputStream(),
getGmSslCert().getInputStream(),
getGmSslKey().getInputStream());
}
logger.info(" Has no SM Ssl certificate configuration ");
// The client's SM SSL certificate not exists or not configured correctly
return initSslContext();
}
因此加载不同算法的逻辑伪代码:
if (EncryptType.encryptType == EncryptType.ECDSA_TYPE){
initSslContext();
} else {
if (国密相关cert、key存在){
initSMSslContext();
} else {
initSslContext();
}
}
web3sdk 对国密的支持主要就是修改了SSLContext对象,具体构建的过程是通过org.fisco-bcos:netty-sm-ssl-context这个类库实现的。
有个疑问是这个类库里只有几个文件,明明可以直接放到项目中,为什么不直接把代码放进项目里边呢?难道是为了方便其他项目使用?
compile 'org.fisco-bcos:netty-sm-ssl-context:1.0.0'
结论
我们假如想要使用fisco web3sdk的国密,或许只需要两个步骤
- 添加这两个依赖
compile 'io.netty:netty-all:4.1.50.Final'
compile 'org.fisco-bcos:netty-sm-ssl-context:1.0.0'
- 构建SSLContext对象的时候使用SMSslClientContextFactory.build方法