新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯

首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料、博客,一点点摸索总结出来的。但项目必须得做身不由己,无奈只能自己试一试了。

如果有哪里不对的地方,请各位一定指出,也让我学习一下,感谢!

博客参考的资料地址会将参考的内容会在文中给出,我总结的步骤有不清楚的地方可以参考原文。

相信看到这篇博客的同学对于openssl的认识应该都比我要深,我就不班门弄斧了。可能国密这个领域对于其他技术来说还是太小众了,可以参考的教程太少,而且个人实现的国密算法基本上都没有经过严格测试,问题的解决也不是很迅速。本文的目的是记录我在国密https尝试过程中遇到的坑以及解决方法,或许对刚入坑的新手有所帮助,不会像我一样毫无头绪。

废话少说我们就开始吧

一、360国密浏览器

如果要实现国密https通讯的话,个人实现难度很大,特别像我这样的新手完全不可能。那么就要借助前辈们的工作成果。国密https经过这几年的发展,在某些领域已经广泛应用了。比如360安全浏览器和信密浏览器都已经集成了国密算法,使用这些浏览器访问例如沃通搭建的SM2SSL证书测试网站和中国银行官网,会显示:

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第1张图片新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第2张图片

这些例子确实证明国密算法已经开始应用了

二、初步尝试自建SM2证书与国密浏览器牵手

如果要搭建国密https通道,与浏览器之间的联调是必须要攻克的难关。

我大致搜索了一下,还是选择了360浏览器做尝试,虽然感觉这个口碑不怎么样,但是也算是国产浏览器之光吧,用的人多,社区也还算活跃。

但是吧,还是我想多了 = =

我在360浏览器的论坛提了问,可是并没有什么用,我在关于360国密浏览器本地调试gmssl的问题这个帖子里面说明了我的问题:

gmssl开启s_server服务,浏览器访问的时候会报错:

ACCEPT
ERROR
1816732:error:1417A0C1:SSL routines:tls_post_process_client_hello:no shared cipher:ssl\statem\statem_srvr.c:1502:
shutting down SSL
CONNECTION CLOSED
ACCEPT
ssl_get_algorithm2=0x08x
ERROR
1816732:error:14094416:SSL routines:ssl3_read_bytes:sslv3 alert certificate unknown:ssl\record\rec_layer_s3.c:1385:SSL alert number 46
shutting down SSL
CONNECTION CLOSED
ACCEPT
ssl_get_algorithm2=0x08x

 大家也可以尝试一下,大概率也会是这个错吧。

后来我看到了服务器使用国密(SM2/SM3/SM4)证书,通过浏览器访问这个博客,博主介绍了三种方法:

1.Apache + Gmssl

2. Apache + Wotrus ssl

3. Nginx + tls

说实话,这三个我用的都不多,也就大概知道是干嘛的。仔细看了博客之后,第一个方法和s_server没啥区别,并没有解决浏览器访问的问题,放弃;第二个需要沃通的ssl,看了一下收费作为最后的备选;第三个方法应该是可以的,我没有尝试,但是这个方法避开了gmssl的服务,只用了其生成的证书,通过Nginx进行服务的启动。

讲道理这片博文到这里就可以结束了,不过呢,我这个人比较倔,必须得解决gmssl这个问题。

三、解决gmssl与国密浏览器的通讯问题

看了很多博客和资料,隐隐感觉到应该不是浏览器的问题,不然这么多国密证书早就出问题了,问题应该还是在gmssl上。

于是我开始翻看gmssl在GitHub上的issues:

360国密浏览器访问sm2服务:https://github.com/guanzhi/GmSSL/issues/774

gmssl server与360国密浏览器通信-gmssl返回Decrypt Error:https://github.com/guanzhi/GmSSL/issues/940

Nginx搭配Gmssl使用国密浏览器连接不成功:https://github.com/guanzhi/GmSSL/issues/939

其中后两个issues给了我很大帮助,下面这位给出了问题和解决方法,就是默认ID的问题

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第3张图片

Update statem_gmtls.c这个patch是修改gmssl的源码,文件位置在ssl/statem/statem_gmtls.c,本来想把修改后的贴出来,但是太多了,上传了资源statem_gmtls.c,怕修改错的可以直接下载替换。

之后就是重新编译的问题了,这个我在新手入坑GMSSL(一)Windows下编译GMSSL并生成CA证书这个博客里提到过,重复编译会出现的问题,这里不再赘述。

在使用360国密浏览器的时候,我们自己生成的ssl证书需要进行信任处理

首先不要忘了在设置里开启国密ssl选项

如何信任新的根证书
由于目前浏览器内置的国密根证书有限,如果测试时需要信任新的根证书,有如下两种方法:
第一种方法:
请在地址栏左侧的证书小锁头上点击,显示证书弹窗。
新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第4张图片
点击[证书信息],点击最下方的信任按钮
新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第5张图片
第二种方法:
如果上述操作不能生效,说明证书链不完整。请编辑 %appdata%(或安装路径)\360se6 \User Data\Default\gmssl\ctl目录下的ctl.dat
如该文件不存在请新建文本文件,注意扩展名[/i]),填入根证书和必要的证书链证书,格式为PEM。 

上述为360浏览器论坛的标准说法,我已经把双证书和对应的ctl.dat文件打包上传:

GMSSL双证书demo.rar

有需要的同学可以去下载尝试。

经过上述方法,s_server端基本上是没有问题了:

ACCEPT
ssl_get_algorithm2=0x08x
-----BEGIN SSL SESSION PARAMETERS-----
MHUCAQECAgEBBALgEwQgqLlCVD/1Ly5wDokXuZeCrim6smTKkZxeYKcMZGuG/tsE
MBNuV04VONwH2HuGWeXV/FelBdgomH4NrT6J0peHUXD1nR3EZu+eeNbRdulpzT7n
lqEGAgRe8MyrogQCAhwgpAYEBAEAAAA=
-----END SSL SESSION PARAMETERS-----
Shared ciphers:SM2-WITH-SMS4-SM3
CIPHER is SM2-WITH-SMS4-SM3
Secure Renegotiation IS NOT supported
GET / HTTP/1.1
Host: localhost:44330
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9

 但是我们还需要进行抓包检查是否真正的握手成功。

四、wireshark抓包

其实这个软件我之前也没有用过,现学现卖,如果有不对的地方欢迎大家批评指正。

这部分大家可以去看大佬的博客:国密SSL通信的调试技巧

看了之后获益匪浅,文中提到了一个国密版本的wireshark抓包工具,非常适合我们的需求。

Windows用户甚至不需要编译就有release版本,幸福哭了有没有,这样的大佬麻烦再来一打,谢谢!

怕出其他为止问题不好解决,我都按照缺省值安装,没有改动。安装之后软件长这样:

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第6张图片

哈哈哈然后就尴尬了,枪都给手上了,不会扣扳机

没办法只能现学,参考了wireshark如何抓取本机包,Https流程,openssl本地自建证书,抓包,wireshark怎么抓包、wireshark抓包详细图文教程这几篇博客,大概知道了怎么去操作,大家的教程写的都超级好的,这也是促使我写这几篇博客的原因,希望可以让后来人少走弯路。

先在“捕获”-“选项”-“Manage Interfaces”把其他的都隐藏起来,只留loopback这一个:

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第7张图片

然后就可以开始抓包了,不过想更清晰明了的话还可以进行端口筛选:

tcp.port ==44330,  只显示端口为44330的消息

直接输入就好了:

 新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第8张图片

接下来就是见证奇迹的时刻:

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第9张图片

出现了,错误

好像没有协商成功

但是不要慌乱,使用重启大法再尝试一下: 

新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯_第10张图片

我也不是很懂这个抓包结果,但是应该是成功了的。

好了,请给gmssl一杯卡布奇诺,谢谢~

 

ps:在查资料的过程中,无意发现了一个很好的国密网站:免费申请国密证书,功能很强大,请大家务必一试~

你可能感兴趣的:(gmssl,国密)