在Cisco路由器上使用Let’s encrypt 证书

以下是一个笔记,用来更新Cisco 28xx系列路由器上的Anyconnect 证书

1. 生成Let’s encrypt 证书。我习惯用getssl

2. 加密private key 这台设备较老,只接受des加密的格式
openssl rsa -des -in privkey.pem -out privkey-enc.pem
这时候会要求输入一个密码,在下文会用到

3. 从private key中提取public key
openssl pkey -in privkey.pem -pubout -out pubkey.pem

4. 登陆到路由器并切换到配置模式

enable
configure terminal

5. 创建ISRG Root certificate trustpoint

crypto pki trustpoint ISRG_Root_X1
chain-validation stop
revocation-check none
enrollment terminal pem
exit

6. 导入ISRG Root certificate (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

7. 创建中间证书 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 的trustpoint

crypto pki trustpoint Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
chain-validation continue ISRG_Root_X1
revocation-check none
enrollment terminal pem
exit

8. 同样粘帖复制中间证书 (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

9. 导入路由器证书
crypto pki import host.domain.com-cert pem terminal @Password@
这里的@Password@ 替换为 #2 中自定义的密码
粘帖复制 Let’s Encrypt Authority X3 的中级证书,也就是在#8 中用过的。在换行后输入quit
粘帖复制 privkey-enc.pem 中的内容,注意不要有空行。在换行后输入quit
最后粘帖复制 #1 中创建的证书。在换行后输入quit
如果一切正常的话应该能看到
"% PEM files import succeeded."

10. 替换原有的证书
这里用到的gateway名字是我本机的,请根据实际情况输入

webvpn gateway gateway_1
ssl trustpoint host.domain.com-cert

90天过期前需要重新更新服务器证书并且重复 #10 步

参考文献
Tutorial: Get Let’s Encrypt on Cisco routers/switches

Cisco 7941G IP Phone 刷SIP固件

托@lty1993 的福,最近入手了几台便宜的Cisco 7941G IP Phone,由此开启了刷机之旅。

默认情况下这部电话通过Cisco自家的Call manager系统来provison和管理。仅在固件升级到9.2 SIP之后才能连接标准的SIP服务器当作一部SIP Phone来独立使用。Cisco的各种文档里只描述了如何通过自家系统provison,对于如何通过TFP刷机之有寥寥数语。@lty1993 反复试验探索出了如下刷机方法,我在此做一份笔记,希望可以帮到(想淘便宜电话的)后人

首先要确定你的电脑固件版本,低于8.0的情况下没法直接升级。建议先做一个hard reset后从8.0固件刷起。方法是按住#键接电源,看到液晶屏右边选择两路线路的灯(以下简称两灯)黄色闪烁后放开,按3491672850*# 后机器下方耳机,静音,speaker(以下简称三灯)开始红色闪烁即开始了删除固件的过程。这个过程完成后电话开机液晶屏是完全不现实内容的,只有两灯交替闪烁绿色。

这个时候就要开始刷机。你需要一台TFT服务器根目录下放置电话固件内容(稍后会详细解释)。并且你的DHCP服务器需要添加一个额外的Option。code为150,value是转成16进制的TFTP server的IP地址。比如你的IP如果是192.168.66.3,那value就是0xC0A84203 注意前面的0x不能省略。这样做的目的是为了让电话在启动的时候通过DHCP拿到TFTP服务器地址从而进行固件升级。

根据无数次人肉实验得出的经验是固件升级可以跳级,但是必须遵循 8.0 (3)-> 8.5(2) -> 9.4(2) -> 9.2(2)[sip] 这个顺序。低于8.0的固件需要先做hard reset后才能刷入8.0固件。固件可以从Cisco网站下载。记得需要下载zip文件版本,文件解压缩后得到的文件放入TFTP服务器根目录。在Linux下我们尝试过tftp-hpa,在Mac OSX下有TftpServer都测试可以正常使用。

紧接着刚才提到的hard reset后两灯闪烁绿色情况。如果这个时候TFTP server开启并且DHCP option设置成功的话,你的电话应该能自动开始刷机。刚刚hard reset后升级液晶屏是没有显示的,但是电话右下角的三灯会慢慢地出现一个红色灯从左往右移动,这个过程会持续一分半钟。如果发现红色快速一闪而过那说明固件校验不合格或版本非法。

当升级8.0 成功后第一次启动就能看到液晶屏上又出现久违的Cisco字样。这时候可以准备更新TFTP上的固件并且拔掉电话电源。之后还是需要按着#键开机,并且在两灯黄色闪烁的时候soft reset,按键如下 123456789*0# 这个时候电话会立刻重启并且寻找TFTP服务器开始升级。在固件升级的同时可以在液晶屏上看到正在更新的文件和进度显示。

前三次升级 8.0, 8.5, 9.4的时候都只需要固件文件即可,最后一次升级9.4 SIP完成后开机会自动在TFTP服务器上寻找SIP服务器配置和dial plan配置文件。这个时候情确保TFTP server继续开启。这两个配置文件也是Cisco文档里找不到具体schema,全靠 @lty1993 人肉一点点摸索出来。其中SEPXXXXXXXXXXXX.cnf.xml 中的XXXXXXXXXXXX需要替换为电话的Mac地址其中字母全部大写。dialplan-XXXXXXXXXXXX.xml 文件名是在SEPXXXXXXXXXXXX.cnf.xml中指定的, 所以不一定需要叫这个名字,这里仅仅为了便于管理才保持同样命名规则。

下面是2个配置例子。基本上修改下服务器地址和extension/password就可以正常使用了。需要注意的是这部电话似乎只支持SIP TCP链接,而freepbx/asterisk默认是UDP,需要手工开启TCP支持,否则registering会一直注册不上。 <transportLayerProtocol>这个参数值为1即为TCP,2为UDP,默认是4(不知道是什么?也许是CM中某个协议?)

需要修改的地方还有EXTENSION_NUMBER 换成SIP服务器上真实的extension号码,比如100. <authPassword> 的值替换成账户密码。<dialTemplate> 的值替换为你的dial plan文件用户名。

至此当你的电话升级固件至9.2 SIP之后开机能读到正确的2个配置文件就应该能立刻注册上你的SIP服务。如果发现registering一直不过,首先检查你的服务器是否支持TCP连接。

Cisco网站固件下载地址
用户配置文件

配置文件修改还可以参考 这个网址

如果你在配置文件中发掘中了新功能不妨留言和大家分享一下,比如通讯录功能如果可以和LDAP连起来应该会很有意思。