其实本来onlyOffice启用https是个很简单的事情,参照官网配置进行启用即可。但是由于网络环境的特殊性我们只能使用自签证书来部署所有的系统服务。所以整个过程还是比较多坑需要踩。
开始时我想以往一样,域名嘛、证书嘛直接到rancher后台新建一个负载均衡利用ingress转发。启用后发现问题,我们能通过https正常访问我们onlyoffice但是预览文件等功能都不行了,直接懵逼了,然后查看了一下onlyoffice的文档发现它里面还有nginx转发,所以这种配置应该是有问题的,那么应该来配置呢?
正文开始之前希望读者明白几个关于ssl证书的问题:
①:什么是https证书,用来干嘛的?
②:什么CA根证书,什么是服务器证书?
③:如何自己利用openssl等工具生成自签证书?
④:为什么像阿里云、华为云这些地方申请购买的https证书部署到服务器后浏览器就提示它是安全的,我们自己签的证书虽然可以用https进行请求,但为什么会提示不安全?
如果你不是很明白为什么,那建议你先详细的看懂这篇文章《局域网内搭建浏览器可信任的SSL证书》后再来理解本文,就会很好理解了。(这篇文章的作者是个真大佬,全是干货点进去你不会后悔的)
ok相信聪明的你已经准备好了自己的证书了,,比如我的:audit.xunshi.com.crt、audit.xunshi.com.key这两个文件
1:进行onlyOffice容器查看 /var/www/onlyoffice/Data 下面是否有certs 文件夹,没有的创建即可。然后退出。
2:将准备好的audit.xunshi.com.crt、audit.xunshi.com.key 两个文件拷贝到onlyOffice容器内/var/www/onlyoffice/Data/certs 里面(拷贝时修改名称为:onlyoffice.crt和onlyoffice.key)
3:重启容器将443端口映射出来,即可。
docker ps | grep onlyoffice //查找onlyOffice容器
docker exec -it 30735d5257c9 /bin/bash //进入onlyOffice容器
cd /var/www/onlyoffice/Data
mkdir certs
exit //退出容器
//将宿主机文件拷贝到docker中(如果你已将这个路径映射到主机,放到主机对应目录就行)
docker cp audit.xunshi.com.crt 30735d5257c9:/var/www/onlyoffice/Data/certs/onlyoffice.crt
docker cp audit.xunshi.com.key 30735d5257c9:/var/www/onlyoffice/Data/certs/onlyoffice.key
//重启onlyOffice并映射443端口到主机32191(前期443端口没映射的一定要加上!)
docker run -i -t -d -p 32191:443 --restart=always onlyoffice.documentserver
注:因为我是k8s集群所以第三步重启时直接升级服务即可。
4.重启后我们可以验证我们的onlyoffice是否可以https访问了,浏览器输入:https://audit.xunshi.com:32191
我的主服务是: https://audit.xunshi.com ; onlyOffice服务是:https://audit.xunshi.com:32191
经过前面两步其实已经开启了onlyOffice的https地址,同时还让浏览器信任了这个域名证书,照理说应该是皆大欢喜普天同庆了,但是接下来我访问我的系统,查看文件,直接提示“下载失败”。这。。。直接懵逼了,于是乎使用百度大法,但是无一例外全是在教你如何开启https以及使用的都是联网版本的域名证书内网环境下到这一步好像大家都沉默了,王德发。。。。
我是这样思考的:首先现在问题处在onlyOffice服务向主服务发送https请求时出现了异常,且我们主服务采用同样是 自 签 证 书!!还记这篇文章吗《局域网内搭建浏览器可信任的SSL证书》,如果我们理解为onlyOffice就是一台浏览器那么它去请求一个自签的https地址,它会认吗?好按照这个思路我尝试将证书甩到onlyOffice的受信任区里面去:
//一样的步骤将我们的audit.xunshi.com.crt甩到容器的受信任区里面去
$ docker cp audit.xunshi.com.crt 30735d5257c9:/usr/share/ca-certificates/audit.xunshi.com.crt
//进入容器
$ docker exec -it 30735d5257c9 /bin/bash
//将audit.xunshi.com.crt最加到授信列表中
# echo 'audit.xunshi.com.crt' >> /etc/ca-certificates.conf
//更新受信任的根证书列表
# update-ca-certificates
//尝试请求自签文件服务器地址
# curl https://audit.xunshi.com
......
到这儿看到正常请求高兴坏了,跑去系统一看,还是“文件下载失败”,王德发。。。。啥玩意儿。OnlyOffice里面都认这个地址了还给我报错呢,难道是文件服务器的问题,跑去文件服务器一看压根没收到请求。
好吧,冷静下来查看onlyOffice的错误日志吧,还别说真看到一条有用的报错: unable to verify the first certificate ...[ERROR] nodeJS - error....,好家伙,原来是nodejs去拉取文件报错不认证书。还是说白了对onlyOffice结构不太熟悉,开发时都是拿来主义对接口接口一通,好,功能完成!(狗头)
Error: unable to verify the first certificate
at TLSSocket.onConnectSecure (_tls_wrap.js:1058:34)
at TLSSocket.emit (events.js:198:13)
at TLSSocket._finishInit (_tls_wrap.js:636:8)
[2022-08-18T05:35:26.349] [ERROR] nodeJS - error downloadFile:url=https://audit.xunshi.com/a/file/stream?time=1660800922151&fileName=/upload/2022/08/17/ef8b712407e066a53991d70ce2688358.docx;attempt=2;code:UNABLE_TO_VERIFY_LEAF_SIGNATURE;connect:null;(id=d50913c3e495aa921b38)
最后通过一番艰苦的文档阅读和查看终于找到了onlyOffice内部的nodejs的配置:在容器内/etc/onlyoffice/documentserver/default.json 中大致97行左右将rejectUnauthorized的值改为false,然后重启服务即可:
"requestDefaults": {
"headers": {
"User-Agent": "Node.js/6.13",
"Connection": "Keep-Alive"
},
"gzip": true,
"rejectUnauthorized": false
},
注意:如下onlyoffice容器没有安装vim命令,你可选择把它cp出来,修改了在cp回去。
最后效果: