一、现象:
最近项目上与三方对接需要实现TLS国密证书认证,由于jdk没有实现TLCP协议,选择使用阿里的开源项目gmsse,但在与三方连接时发现有概率出现java.lang.IllegalArgumentException : Invalid point coordinates错误
二、原因:
找了很久,怀疑过我们生成的证书有问题,也怀疑过是不是对面加密有问题,最后,在抓包过程中发现在TLS加密握手的过程中Client Key Exchange阶段传递过来的密文总是在208198开头的时候可以成功连接,但除了208198开头的密文外,还有208199和20819a这两种前缀。
208198:

208199:

20819a:

遂开始研究国密交换流程,查找许多资料后发现(TLCP交互流程),国密在客户端交换秘钥时SM2加密后C1||C3||C2使用的是ASN1.DER编码格式,这种编码格式在R或S的最高位为1时,需要前补0X00,为了在有符号的情况下避免被误认为是负数。
具体可以查看:【加密算法】SM2签名本地验证成功,为啥对方判定非法?——深入解析SM2签名格式兼容性问题
回到我们抓包拿到的密文,根据ASN1.DER可以辨别出208198后面跟着的C1的值是152个字节,继续解析C1x和C1y可以发现,这对坐标的长度都是32个字节,而208199的密文C1x和C1y都有可能出现前补0X00的情况,20819a则C1x和C1y都会前补0X00
三、解决:
发现了上面的情况后,debug追踪代码发现gmsse在接收client交换来的密文后,解密时并没有对C1x和C1y做任何处理,尝试修改源码,将0X00删除后不在出现java.lang.IllegalArgumentException : Invalid point coordinates错误

5705

被折叠的 条评论
为什么被折叠?



