1. 问题
站在server的角度,使用mosquitto例程测试时发现不对劲的地方:
使用cafile参数来指定client的ca证书文件时,client可以正常接入到服务中来;
但使用capath参数指定client的证书文件时,client不能正常接入,报错如下
1648891572: New connection from 10.0.2.2:64977 on port 8883.
1648891572: OpenSSL Error[0]: error:14089086:SSL routines:ssl3_get_client_certificate:certificate verify failed
1648891572: Client <unknown> disconnected: Protocol error.
2.分析
测试过程中使用自签名的ca系列证书来进行验证。按照capath的设定,应该是可以允许多个CA签发的证书对应的client来接入的,否则没必要用一个capath列表,用一个固定的cafile就足够了。
CA证书制作完成后,将其(ca.crt)放到capath指定路径下,启动mosquitto broker,之后发现对应CA签发的client始终报错(如上所示),而一旦将broker的ca参数指定为cafile,对应的client就可以接入了。
这说明而对应的client证书、CA证书本身是没有问题的,而是在使用过程中,capath目录下的证书文件并没有被正常解析。
3.解决
Mosquitto with SSL and wildcard certificate does not work without --capath option - Stack Overflow
经查询,按照上面的链接中的解释,mosquitto在使用capath时,并不是直接将CA证书文件直接放到capath目录下就可以了,而是要进行解析才可以。
46.8K的点赞,实在是太6了,说明遇到这个问题的人还真是不少,很奇怪为啥官方不把这个写明白了。
对于不同的发行版来说,用法也有可能是 c_rehash 、rehash等,是一个perl的脚本工具,如下所介绍。
4. 扩展
4.1 rehash干了点啥呢?
请看下图,执行完该指令后,可以看到该目录下产生了两个软链接文件,而上文的rehash函数介绍中提到了,链接文件名的生成规则。
是否是因为证书文件名符合规则,才导致mosquitto 没有正常解析呢?
4.2 自己hash证书怎么样?
根据rehash的介绍,自己创建新的证书,并重命名成对应的文件名,之后测试果然成功了。
因此,如果不是什么复杂的系统的话,我们也没必要使用rehash这种工具了,直接自己计算重命名一下就可以了。
如何计算证书文件的hash值?
4.3为啥重命名证书就能解析了呢?
查到如下说明。
https://docs.infor.com/ln/10.5/it-it/lnolh/help/tt/onlinemanual/https_soap_generate_hash.html
验证下我自己的Ubuntu电脑看下?
果然。。。