赞
踩
首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料、博客,一点点摸索总结出来的。但项目必须得做身不由己,无奈只能自己试一试了。
如果有哪里不对的地方,请各位一定指出,也让我学习一下,感谢!
博客参考的资料地址会将参考的内容会在文中给出,我总结的步骤有不清楚的地方可以参考原文。
相信看到这篇博客的同学对于openssl的认识应该都比我要深,我就不班门弄斧了。可能国密这个领域对于其他技术来说还是太小众了,可以参考的教程太少,而且个人实现的国密算法基本上都没有经过严格测试,问题的解决也不是很迅速。本文的目的是记录我在国密https尝试过程中遇到的坑以及解决方法,或许对刚入坑的新手有所帮助,不会像我一样毫无头绪。
废话少说我们就开始吧
一、360国密浏览器
如果要实现国密https通讯的话,个人实现难度很大,特别像我这样的新手完全不可能。那么就要借助前辈们的工作成果。国密https经过这几年的发展,在某些领域已经广泛应用了。比如360安全浏览器和信密浏览器都已经集成了国密算法,使用这些浏览器访问例如沃通搭建的SM2SSL证书测试网站和中国银行官网,会显示:
这些例子确实证明国密算法已经开始应用了
如果要搭建国密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在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的问题
Update statem_gmtls.c这个patch是修改gmssl的源码,文件位置在ssl/statem/statem_gmtls.c,本来想把修改后的贴出来,但是太多了,上传了资源statem_gmtls.c,怕修改错的可以直接下载替换。
之后就是重新编译的问题了,这个我在新手入坑GMSSL(一)Windows下编译GMSSL并生成CA证书这个博客里提到过,重复编译会出现的问题,这里不再赘述。
首先不要忘了在设置里开启国密ssl选项
如何信任新的根证书
由于目前浏览器内置的国密根证书有限,如果测试时需要信任新的根证书,有如下两种方法:
第一种方法:
请在地址栏左侧的证书小锁头上点击,显示证书弹窗。
点击[证书信息],点击最下方的信任按钮
第二种方法:
如果上述操作不能生效,说明证书链不完整。请编辑 %appdata%(或安装路径)\360se6 \User Data\Default\gmssl\ctl目录下的ctl.dat
(如该文件不存在请新建文本文件,注意扩展名[/i]),填入根证书和必要的证书链证书,格式为PEM。
上述为360浏览器论坛的标准说法,我已经把双证书和对应的ctl.dat文件打包上传:
有需要的同学可以去下载尝试。
经过上述方法,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
但是我们还需要进行抓包检查是否真正的握手成功。
其实这个软件我之前也没有用过,现学现卖,如果有不对的地方欢迎大家批评指正。
这部分大家可以去看大佬的博客:国密SSL通信的调试技巧
看了之后获益匪浅,文中提到了一个国密版本的wireshark抓包工具,非常适合我们的需求。
Windows用户甚至不需要编译就有release版本,幸福哭了有没有,这样的大佬麻烦再来一打,谢谢!
怕出其他为止问题不好解决,我都按照缺省值安装,没有改动。安装之后软件长这样:
哈哈哈然后就尴尬了,枪都给手上了,不会扣扳机
没办法只能现学,参考了wireshark如何抓取本机包,Https流程,openssl本地自建证书,抓包,wireshark怎么抓包、wireshark抓包详细图文教程这几篇博客,大概知道了怎么去操作,大家的教程写的都超级好的,这也是促使我写这几篇博客的原因,希望可以让后来人少走弯路。
先在“捕获”-“选项”-“Manage Interfaces”把其他的都隐藏起来,只留loopback这一个:
然后就可以开始抓包了,不过想更清晰明了的话还可以进行端口筛选:
tcp.port ==44330, 只显示端口为44330的消息
直接输入就好了:
接下来就是见证奇迹的时刻:
出现了,错误
好像没有协商成功
但是不要慌乱,使用重启大法再尝试一下:
我也不是很懂这个抓包结果,但是应该是成功了的。
好了,请给gmssl一杯卡布奇诺,谢谢~
ps:在查资料的过程中,无意发现了一个很好的国密网站:免费申请国密证书,功能很强大,请大家务必一试~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。