一般而言,SSL自签证书应用场景受限较大,尤其是面对不特定人群时——比如发布一个可公开访问的HTTPS站点。这是因为证书的真实性由CA来验证(自签证书由自建CA保证),只有客户端认可CA的权威性,CA对证书的验证行为才会被客户端接受。
但如果我们是针对特定人群发布应用时,则可以让客户手动选择接受这个CA,比如内网站点,比如涉及到加密的一些应用。

上图就是一个很典型的SSL证书错误的场景:CA无效。由于设备厂商的CA绝大多数情况下不被系统默认信任,所以客户端在访问设备时一定只会是这个结果。解决办法是:使用受客户端信任的CA签发的证书,或者直接让客户端信任这个证书的签发者(将ca证书导入到“受信任的根证书签发机构”。
类似的,还有IPSEC Mobile等用到证书认证的场景里也会要求客户端对CA进行信任。而某些软件,例如OpenVPN,则可以直接把CA自身的证书配置到客户端,由客户端软件读取作为配置文件之一的ca.crt来验证客户端证书client.crt + client.key。
如果内部有多个服务需要使用证书,为了保持统一,也为了方便管理,可以考虑使用自建CA对各个服务进行证书签发,并让每一个客户的电脑都信任这个自建CA。
比如,内网有IKEV2的ipsec mobile服务,有一台防火墙的web管理后台,有一台群晖,另外还迁移了一台openvpn服务器的ca和客户端证书到pfSense。这时,我们就可以按上文所描述的,用一台自建CA分别创建各自服务的证书并部署到对应服务上,然后让访客电脑导入这个CA证书即可(最后一步最难实现,但因为我们的服务均是面向特定访客,所以具备可操作性,否则只能向权威的公共CA申请或购买证书进行部署)。
1. 创建CA
pfSense默认自带了一个CA,也可以用自定义的属性手动创建一个CA,入口位于System -> Cert. Manager -> CAs

创建后,到CAs页面,导出对应CA的证书文件备用。
2. 签发证书并部署,用于pfSense管理后台https服务


签发后,回到System -> Advanced,选择刚刚签发的证书作为web管理后台使用的证书即可。

3. 签发证书用于pfSense IPSEC MOBILE服务
3.1 流程与上一小节相似,签发一张用于ipsec服务端认证(ipsec.xxxx.com)的服务器证书;
3.2 VPN -> IPSEC页面中,编辑ipsec mobile的P1,选择服务器证书为3.1小节,由自建ca签发的ipsec专用证书,保存即可。
* 关于如何配置ipsec mobile,可参考我之前写的教程。
4. 签发用于群晖网页https的证书
4.1 签发流程与上一节相似,签发一张用于192.168.0.2(群晖ip)的证书,并导出证书和密钥(独立https站点部署时,需要用到证书、key文件,并且CA需要被访客电脑信任);
4.2 登录到群晖管理后台,导航到控制面板 -> 安全性 -> 证书,点击“新增”按钮打开创建证书界面;
4.3 上传4.1步骤中的证书和密钥文件;
4.4 回到证书列表页面,点击“设置”按钮,设置“系统默认”证书为4.3步骤中上传的证书,此时群晖会自动重启web服务并应用新证书。





5. 从旧的openvpn服务器导入外部CA和客户端证书
5.1 复制旧服务器的ca.crt和ca.key,以及每一对客户端证书;
5.2 System -> Cert. Manager -> CAs页面,点击Add按钮;
5.3 在新页面选择Method为Import an existing Certificate Authority,即导入已有CA,并粘入旧服务器的ca公私钥(只导入ca公钥将得到一个外部CA,只可进行验证不可进行签发,只有同时导入私钥才能得到一个完整功能的内部CA);
5.4 与上一步操作一样,入口位于System -> Cert. Manager -> Certificates,也是导入公私钥的内容即可。
* 关于如何配置pfsense上的openvpn服务,也可参考我之前发过的相关教程。



最后,在OPENVPN服务连接的编辑界面指定CA,并选择相应服务器证书,用户既可使用导入的客户端证书,也可以从CA重新签发的证书。
6. 访客电脑导入证书:
双击ca证书,点击“安装证书”按钮,存储位置选择“本地计算机”的“受信任的根证书颁发机构”,然后一路下一步即可(openvpn客户端不需要将ca证书导入到系统受信任的根证书颁发机构区域,只需要在配置文件中指定文件的物理路径)。

