TLS/SSL 协议详解 (29) 国密SSL协议

TLS/SSL 协议详解 (29) 国密SSL协议测试服务器:https://47.89.249.43:4433/(测试时,先将本机时间设置为2018年7月之前(我证书过期了),然后使用360国密浏览器访问。360国密浏览器会在TLS握手失败后才会发起GMSSL握手,所以访问较慢。出现访问不了的情况,请清除360国密浏览器所有缓存,重启浏览器后再访问)源码在https://github.com/mrpre/atls上可以获得…

大家好,又见面了,我是你们的朋友全栈君。

测试服务器:https://www.mrpre.com:4433/  (已经过期,不要测试了)

(测试时,先将本机时间设置为2018年7月之前(我证书过期了),然后使用360国密浏览器访问。360国密浏览器会在TLS握手失败后才会发起GMSSL握手,所以访问较慢。出现访问不了的情况,请清除360国密浏览器所有缓存,重启浏览器后再访问)

源码在 https://github.com/mrpre/atls 上可以获得

GM/T 没有单独规范 SSL协议的文件,而是在SSL VPN技术规范中定义了国密SSL协议。

规范号:GM/T 0024-2014

TLS/SSL 协议详解 (29) 国密SSL协议

这里主要讲的是国密SSL协议和标准的TLS协议之间的区别,根据这些区别,完全可以实现国密SSL握手、通讯,实现效果见文末。

1:协议号

    TLS协议号为0x0301 0x0302 0x0303,分别表示TLS1.0 1.1 1.2

    而国密SSL版本号为0x0101,其参考了TLS1.1。

    故本篇没有描述的握手、加密细节等全部参考TLS 1.1,本篇只罗列GM SSL 与 标准 TLS 之间的区别。

Client hello报文如下:

TLS/SSL 协议详解 (29) 国密SSL协议

 Wireshark是无法解析的该报文的(不知道新版本是否能够解析),若想解析,还需要手动把pcap报文中version对应的字段修改成通用的0x03xx,wireshark方能解析。

故该规范定义的SSL协议被称为 国密SSL 1.1。具体参考规范6.3.2.1。

2:加密算法

国密SSL定义了多个加密套件,见6.4.4.1.1

TLS/SSL 协议详解 (29) 国密SSL协议

实际上,若加密各个阶段(非对称、对称、摘要)都替换成国密标准的,较主流的是如下2个

 1:ECC_SM4_SM3 

 2:ECDHE_SM4_SM3 

 IBC并没有研究过,这里不再详细说明。

注意 ,ECDHE_SM4_SM3 必须要求双向认证。

 ECC 对应的是标准的RSA,切勿被ECC迷惑,这个ECC并不和标准的椭圆曲线密钥交换算法类似,而是和RSA类似。服务器发送ECC公钥(在证书中)到客户端,客户端拿ECC公钥加密随机数给服务器(client key exchange)。

3:PRF算法

PRF算法和TLS 1.2类似,唯一区别:TLS1.2下,PRF算法为SHA256,而GM SSL的算法为SM3。

4:server key exhcnage

标准的server key exchange计算方式是

DH_sign(client_random + server_random + hash_in)

而国密SSL下server key exchange计算方式略有不同

Sm2_sign(lient_random + server_random +hash_len + hash_in)

国密规范如下描述 server key exchange:

Case ECC:

    Digitally-signed struct

    {

        Opaque client_random[32];

        Opaque server_random[32];

        Opaque ASN.1Cert<1, 2^24-1>;

    }

Case ECDHE:

    ServerECDHEParams params

    Digitally-signed struct

    {

        Opaque client_random[32];

        Opaque server_random[32];

        ServerECDHEParams params

    }

总结一下,

(1):

标准TLS server key exchange是椭圆曲线参数+对该报文的签名,签名时的hash是2个随机数加该报文本身。

(2):

国密SSL的ECC的server key exchange只是签名,由于本身不包含任何参数,故签名时的hash是2个随机数加上加密证书(注意国密规范描述证书时采用的尖括号的描述,即证书前需要加上长度信息表示)。具体签名算法使用的是sm2。

(3):

国密SSL的ECDHE证书和标准TLS就一样了,只是签名算法使用的是sm2。

Sm2签名需要一个ID,规范中建议为”1234567812345678”。实现上,都使用该值。

5:finished报文

标准TLS对finished使用标准的SHA1、SHA256、SHA384等进行hash运算,国密SSL中,hash运算为smx。Hash运算完成后,就使用上面描述的prf算法进行计算。

6:certificate报文

 国密规范定义发送证书时需要发送两个证书,签名证书和加密证书(双证书体系)。

与标准TLS报文格式一样,只是第一个证书是签名证书,第二个证书是加密证书。

我没有找到国密SSL规范定义怎么发送证书链的。

7:效果

使用360国密浏览器后,实现效果如下:

TLS/SSL 协议详解 (29) 国密SSL协议

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137062.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java string分割_java 字符串分割的三种方法(总结)[通俗易懂]

    java string分割_java 字符串分割的三种方法(总结)[通俗易懂]最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似Stringstr=”aaa,bbb,ccc”;然后以”,”为分割符,将其分割成一个数组,用什么方法去实现呢?第一种方法:可能一下子就会想到使用split()方法,用split()方法实现是最方便的,但是它的效率比较低第二种方法:使用效率较高的StringTokenizer类分割字符串,StringTokenizer类是JDK中提供的专…

    2022年9月29日
    0
  • 解决ORA-01008: 并非所有变量都已绑定(详解问题所在)

    解决ORA-01008: 并非所有变量都已绑定(详解问题所在)将executeUpdate(sql)或executeQuery(sql)括号中的sql删除。问题代码:publicstaticvoidmain(String[]args)throwsException{Connectionconnection=null;Statementstatement=null;connection=DBHelper.getConnection();Stringsql=”up

    2022年9月7日
    0
  • ddr2 odt_ddr2电压

    ddr2 odt_ddr2电压经常有人会说支持DDR2的主板存在偷工减料的现象。事实上这是由于DDR2内存中使用了一项新的ODT技术,它可以在提高内存信号稳定性的基础上节省不少电器元件。主板终结是一种最为常见的终结主板内干扰信号的方法。在每一条信号传输路径的末端,都会安置一个终结电阻,它具备一定的阻值可以吸收反射回来的电子。但是目前DDR2内存的工作频率太高了,这种主板终结的方法并不能有效的阻止干扰信号。若硬要采用主板终结

    2022年9月8日
    0
  • JavaFX Script语言教程「建议收藏」

    JavaFX Script语言教程「建议收藏」JavaFXScript™(下文中称为JavaFX)语言是一种声明式的静态类型编程语言。它具有第一级函数(first-classfunctions)、声明式的语法、列表推导(list-comprehensions)及基于依赖关系的增量式求值(incrementaldependency-basedevaluation)等特征。JavaFX脚本式语言特别适用于Java2Dswi…

    2022年6月21日
    25
  • 智慧小区解决方案ppt_智慧小区简介

    智慧小区解决方案ppt_智慧小区简介智慧小区项目遇到的问题汇总&解决参考跨域问题mybatisplus操作问题git操作问题跨域问题前端使用vue脚手架搭建项目,后端使用springboot+MySQL,首当其冲的问题是两者不能使用同一个端口启动,这就涉及到跨域操作。事实上,第一步,要在vue项目中的vue.config.js里添加//跨域parallel:require(‘os’).cpus().length>1,pwa:{},devServer:{port:8081,

    2022年10月17日
    0
  • Pytest(1)安装与入门[通俗易懂]

    Pytest(1)安装与入门[通俗易懂]pytest介绍pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高。根据pytest的官方网站介绍,它

    2022年7月28日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号