0x00 故事背景

近年来,随着个人隐私保护技术的愈加完善,网络浏览防监控防劫持的需求也越来越多。https技术是比较完善,可行性高的隐私保护手段,篇幅原因本文对具体原理不做赘述,可以自行百度。本站也是较早采用全站https的站点之一,由于子域名较多,早期是通过购买沃通和alphassl的白菜通配符证书来实现。自从沃通被360收购之后,各种原因就逐渐没落了,alphassl的白菜通配符证书苟了一年,终于盼得letsencrypt的免费通配符证书发布。letsencrypt后台非常硬气,证书支持通配符,而且免费,美中不足的是证书有效期只有三个月,好在大多数服务商都有自动续签方案,自己搭建服务器的话也可以使用acme.sh的开源方案。

0x01 事件起因

路由是此前淘的二手R8500,性能基本跟asus的rt-ac5300一致,也是8天线双5G,5300mbps。不过网件的固件移植效率就不报太大期待了,论坛终版固件380.70-x7.9.1,以后基本也没有更新的可能了。软件中心内的软件也基本不会更新了,遇到什么bug基本都得自己修。此前修过一次dnspod的ddns插件,这次acme插件又出问题╮(╯▽╰)╭

0x02 本文正文

昨天顺手修博客和图床cdn的证书过期问题时候,发现路由器的acme插件一直自动续期失败,过去的经验和我的直觉让我菊花一紧,不会又是停止支持之后出现bug了吧。

重装大法好,先试着卸载重装acme插件,试试申请证书。

在Registering account后等待300秒直接超时,通过winscp登上路由器,看看acme.sh的版本号吧。

emmmm,是2.7.9,看一下官方的更新记录

差不多两年前了,那么最新的relase是多少了呢

很好,今年1月的新版本,2.8.5,是不是直接下载更新就可以解决呢,想想还有点小期待...

下载最新的relase包后,替换acme.sh文件发现虽然还是失败了,但是起码报错不一样了,跟日常调bug差不多,让我们继续往下看

报错变成了invalid domain,看日志找找原因吧

可以看到是调用了dnspod的domaininfo接口,用来判断你是否是域名所有者。前面参数还算正常,也能正常返回域名信息,后面参数丢失了.cn前面的域名信息,dnspod不认,导致域名验证失败。

报错信息

为了确认原因,我找到了dnspod的官方文档https://www.dnspod.cn/docs/domains.html#domain-info

不出意外,code:8,非域名所有者,验证了我的猜想。

那是不是dnspod的接口也过时了呢,刚才下载了最新的release包,把里面的dnsapi/dns_dp.sh拷贝进对应目录试试看。可是未能如愿,发现依然出现同样的问题。

去github查看dns_dp.sh的更新记录发现3月25号有更新,而最新的release是1月份更新的。

那问题就简单了,拷贝最新版dns_dp.sh的代码,替换掉之前的。

ps:这里我图省事,直接在winscp中使用编辑器功能,对路由器上的文件进行修改,因此导致了后面的问题,后面会单独再讲。

替换最新版dns_dp.sh后,重新尝试申请证书,可以看到他继续了,只是又换了个地方error,调试bug本身就是这么简单乏味且枯燥

错误的地方变成了Adding record,查看详细日志如下

可以看到调用了Record.Create接口,返回值为26:无效的recordline,观察post的参数可以发现,recordline的参数为“默认”。

我开始有了小问号???dnspod真不愧是国人开发,参数居然是中文???

赶紧打开api文档查看接口详细信息https://www.dnspod.cn/docs/records.html#record-create

从官方文档可以得知,返回值26确实是记录线路参数有误,而recordline的参数确实是中文的默认。但是同时也了解了recordline可以使用纯数字的id来代替。那么报错是什么情况呢,遂复制了路由中出错的参数,直接在mac上发起请求测试完成正常,效果如下图所示

遂怀疑是路由器上shell对中文支持不佳,导致中文的参数无法正常发送,那能否使用id的形式发送记录线路呢?

同样在文档中找到相应的线路和id的对照列表

从列表中可以得知,默认线路的id即为0,那参数“record_line=默认”相应的可以替换为"record_line_id=0",效果应该是一样的。

同样先在mac的终端中测试,虽然返回结果不是成功,但是可以看出来是因为之前测试的时候添加了记录,导致重复,功能应该是ok的,接下来替换dns_dp.sh文件中的对应代码,测试一下。

可以看到证书申请成功,外网访问可以看到出现了熟悉的绿锁,系统设置里也可以正常显示新申请的证书信息了。大功告成,可喜可贺。

0x03 知错就改

弄好之后还有一个疑问,如果是路由器不支持中文post,那之前是怎么申请证书成功的?于是我重新下载了一份软件中心的acme插件,一探究竟。

打开一看默认两个字变成了乱码,仔细一看原来是winscp的编辑器默认使用cp936编码也就是GBK编码,导致utf-8编码的中文变成了乱码。我顿时灵光一闪,开窍了。猜想应是我此前图省事,直接把github上最新版的dnspod代码复制进编辑器保存,而winscp的默认编码正是GBK,导致接口发送时使用utf-8发送乱码,接口无法识别导致参数错误。

知道原因之后想马上验证,于是重新下载了git上最新的dns_dp.sh,文件上传到路由器直接替换了原装的脚本,重新跑了下流程,发现一切正常,此时的我内牛满面。原本还以为github上代码出了bug,还想去提个pr,这下不用了,想想还有点小失落。

0x03 一些收获

吃一堑,长一智,总归不能白忙活。

1、github上最新的release包也可能存在bug,如果release包出现问题,可以试试直接把最新的线上版本download zip。

2、winscp的默认编码是GBK,涉及到修改中文代码的情况一定要手动更改编码为utf-8.

3、程序/代码出现问题报错不用怕,仔细排查log进行debug,一定可以解决问题。

4、使用第三方SDK/API,出现问题不要怕,仔细阅读文档,肯定可以找到问题的原因和解决方案(文档写的太烂的就算了)。

0x04 一些感想

1、dnspod不愧是祖国希望之光,接口中文传参惊天地泣鬼神。

2、dnspod接口文档还算比较详细,仔细阅读后确实可以解决问题,和某些草鸡项目的凑数文档不在一个档次上。

3、网件就是后妈生的,固件都没得支持了,不是自己动手能力强,千万不要买网件。直接华硕亲儿子,固件支持顶呱呱。

4、如果能帮你解决问题的话,欢迎打赏,好想换个AX11000啊♪(・ω・)ノ

love loli,love live!