美文网首页
fisco web3sdk国密连接实现方式

fisco web3sdk国密连接实现方式

作者: ccDown | 来源:发表于2020-08-04 18:09 被阅读0次

    因项目需要,需要了解一下fisco SDK与节点如何实现gm tls

    思路:

    1. fisco webase-front这个项目可以直接与节点进行通讯,我们首先了解这个项目。
      在front的配置文件中设置gm or k1连接,说明在front中支持两种连接方式,我们需要在front中找到构建这两种连接的地方。
    2. 在研究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这个类库实现的。
    有个疑问是这个类库里只有几个文件,明明可以直接放到项目中,为什么不直接把代码放进项目里边呢?难道是为了方便其他项目使用?


    image.png
        compile 'org.fisco-bcos:netty-sm-ssl-context:1.0.0'
    

    结论

    我们假如想要使用fisco web3sdk的国密,或许只需要两个步骤

    1. 添加这两个依赖
        compile 'io.netty:netty-all:4.1.50.Final'
        compile 'org.fisco-bcos:netty-sm-ssl-context:1.0.0'
    
    1. 构建SSLContext对象的时候使用SMSslClientContextFactory.build方法

    相关文章

      网友评论

          本文标题:fisco web3sdk国密连接实现方式

          本文链接:https://www.haomeiwen.com/subject/gbuvrktx.html