为docker容器中unifi controller导入自有域名的SSL证书

预格式化文本
我启用了unifi controller的来宾管理系统。系统提示OSX下,自签名SSL证书可能有些问题。于是想更换一下unifi controller的SSL证书。
借腾讯送优惠券的东风,很快搞定了域名,也申请了免费的ECC加密(此处有坑)的SSL证书。但如何在docker环境中替换SSL证书,实在让我头疼了好几天。中文网络上基本找不到手把手教程,在即将放弃的时候,想也许老外们用的多,也许有解决方案。找了找,果然问的人很多,回答的人也很多。比中文网络上热闹多了。
我的controller运行于docker里,硬件是n1。镜像是inuxserver/unifi-controller:latest,默认安装方式运行。

腾讯的免费SSL包含四个文件夹和一个应该是私钥的文件。

四个文件夹上图。
在unifi controller中导入自有域名的SSL证书需要Apache中的三个文件1.crt,2.crt和3.key。

首先使用winscp或者其他的命令将本地的三个证书文件上传到armbian的/root目录中。上传完毕后,使用SSH工具登录进入armbian系统,我这里使用Putty。

使用root登录。默认进入root目录。
将1.crt,2.crt,3.key等三个文件传输入unifi controller的容器目录中的~/usr/lib/unifi/data目录中
然后在armbian的终端中运行
docker exec -it unifi-controller /bin/bash #该命令进入unifi controller的容器的终端
在unifi controller的容器的终端中执行
cd data
*keytool -list -keystore keystore # Note the dates/stamp of the key that’s in there- it should change *
service unifi stop

~/usr/lib/unifi/data中有个keystore文件,你最好先备份一下这个文件,万一导入证书出问题,可以恢复。登录不进去了,可以作为后悔药。
然后运行以下命令
*openssl pkcs12 -export *
*-in “1.crt” *
*-in “2.crt” *
*-inkey “3.key” *
*-out “temp” -passout pass:“aircontrolenterprise” *
-name “unifi”
这几个命令的作用大概是,把1.crt,2.crt,3.key打包进入temp文件中,过程中有交互,会要求你输入密码:aircontrolenterprise
然后输入命令删除原有的keystore,过程中还是有交互要求输入刚才的密码。

keytool -delete -alias unifi -keystore keystore -deststorepass aircontrolenterprise
keytool -list -keystore keystore # should have nothing in the store
我的系统执行过程的交互如下:
root@3d9d82388600:/usr/lib/unifi/data# keytool -list -keystore keystore # Note the dates/stamp of the key that’s in there- it should change
Enter keystore password:
Keystore type: jks
Keystore provider: SUN

Your keystore contains 0 entries(此处重点,必须是0)

然后在容器的终端中输入证书导入命令

*keytool -importkeystore *
*-srckeystore “temp” -srcstoretype PKCS12 *
*-srcstorepass “aircontrolenterprise” *
*-destkeystore “keystore” *
*-deststorepass “aircontrolenterprise” *
*-destkeypass “aircontrolenterprise” *
-alias “unifi” -trustcacerts
过程中仍然有输入密码的交互,输入刚才的密码:aircontrolenterprise
完成后执行命令
keytool -list -keystore keystore # New cert should be in there.
此时应该显示如下
Keystore type: jks
Keystore provider: SUN

Your keystore contains 1 entry (此处重点,必须是1)

unifi, Feb 13, 2021, PrivateKeyEntry,
Certificate fingerprint (SHA1): DA:EA:89:D4:48:55:1E:01:50:FC:54:22:E0:49:2D:A9:DF:22:81:88

Warning:
The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using “keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12”.

完成后执行
service unifi start
退出容器的shell,进入armbian的终端执行

docker container restart unifi-controller

重启unifi-contoller 的容器。刷新几次后就可以在浏览器发现在使用自有域名的证书了。

然鹅,如果是使用的是ECC加密的证书,此时依然不可用,浏览器会提示证书和的协议版本不兼容。这时你需要进入unifi的容器终端中

root@aml-unifi:~# docker exec -it unifi-controller /bin/bash
root@3d9d82388600:/usr/lib/unifi# echo “unifi.https.sslEnabledProtocols=TLSv1.2” >> /usr/lib/unifi/data/system.properties
root@3d9d82388600:/usr/lib/unifi# echo “unifi.https.ciphers=TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256” >> /usr/lib/unifi/data/system.properties

然后就要可以愉快的使用了。

参考连接:
installing SSL cert for controller running on docker

Unifi Cloud Key: Custom SSL Certificate

1赞