在内网中使用自签名证书搭建Nextcloud X ONLYOFFICE Documentserver(Docker)

Posted by 橙叶 on Wed, Nov 27, 2019

在内网里给Nextcloud搭建ONLYOFFICE Documentserver一直是件很头痛的事。Nextcloud的ONLYOFFICE插件不仅要求DocumentServer使用HTTPS连接,而且不允许自签名证书,在局域网里就很尴尬了。之前是打算把买的域名解析到局域网的地址,不过这显然很傻。其实办法还是有的,直接修改HOSTS文件可以让我们用我们自己任意的域名访问。

在内网里给Nextcloud搭建ONLYOFFICE Documentserver一直是件很头痛的事。Nextcloud的ONLYOFFICE插件不仅要求DocumentServer使用HTTPS连接,而且不允许自签名证书,在局域网里就很尴尬了。之前是打算把买的域名解析到局域网的地址,不过这显然很傻。其实办法还是有的,直接修改HOSTS文件可以让我们用我们自己任意的域名访问。

问题

1.在局域网内部署Nextcloud+ONLYOFFICE时,第一个问题是要求使用HTTPS连接: [errorbox]Error when trying to connect (Mixed Active Content is not allowed. HTTPS address for Document Server is required.)[/errorbox] 这个问题很明显也很直接:要么配置DocumentServer自己的HTTPS,要么用Nginx反代成HTTPS,我用的是后者。如果用的是自签名证书,那么还会引发下一个问题。

2.cURL报错,提示是自签名证书

错误来自PHP的cURL模块 [errorbox]cURL error 60: SSL certificate problem: self signed certificate[/errorbox] 我的解决办法是,把我们自签名证书的公钥添加到系统里。

3.DocumentServer无法从Nextcloud中获取文件 [errorbox]Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)[/errorbox] 这个其实也是自签名证书的问题,不过是来自作为后端的NodeJs,官方给的一个临时的解决方法是在/etc/onlyoffice/documentserver/default.json中将unauthorized_reject字段改为false。我不知道还有没有更好的解决方法。

简介

首先我们需要知道Nextcloud和ONLYOFFICE之间时怎样交互的。这里只以打开和保存两个步骤做说明。

打开一个文件……

这里用官方的示意图,左边是Brower客户端,右边是Server服务端【包括document storage service (上)和document editor service(下),即文档存储服务器(这里就是Nextcloud)和文档编辑服务器(Document Server)】,
当我们在Nextcloud上点开一个docx/xlsx/pptx文件时 (①),由插件(其实是启用ONLYOFFICE插件后的前端)调用Document Server API (②③),这个API加载一个框架到HTML里,框架里就是编辑界面,Document Server先把文件从Nextcloud下载到Docment Server中④,处理解析(④)后再传到前端(⑤),前端所做的任何修改都传到Docment Server里:

修改/保存一个文件……

  1. 用户在前端对文档作出修改
  2. 前端将改动传到Document Server。
  3. 用户关闭浏览器页面,被Document Server 检测到后,Document Server保存该文件所有改动。
  4. Document Server使用JavaScript API的回调Url通知Nextcloud文件已完成编辑,并返回指向修改后的文件的链接。(Document Server 访问Nextcloud)
  5. Nextcloud从Document Server处下载修改后的文件。(Nextcloud访问Document Server)
所以可见,如果要让Nextcloud和ONLYOFFICE协作运行,必须保证:前端(客户端)可以访问Nextcloud和Docment Server(必须为HTTPS),DocmentServer和Nextcloud可以互相访问(必须为HTTPS)。如图:

一般如果Nextcloud和DocmentServer都可以从外网通过HTTPS访问(意味着DocumentServer也可以访问Nextcloud)而且都是ca签发的证书的话,只需要填写前两项就可以了。后两项第一个是手动指定的Nextcloud访问DocumentServer的地址,第二个手动指定DocumentServer访问Nextcloud的地址。

这里我假设我有一个192.168.226.0的网段,里面有一台做客户端(192.168.226.1),另有一台虚拟机做服务端(192.168.226.77),虚拟机里用Docker跑了一个DocumentServer,容器和宿主机连在docker0网桥上,容器地址是172.17.0.2(其实这个无所谓),宿主机的地址是(172.17.0.1)。

Step1:域名

首先我们解决域名的问题,这里就不捣鼓DNS服务器了(其实是没那水平),就直接修改HOSTS文件了,给Nextcloud的域名是storag.local,给DocuemtServer的域名是document.local。Windows的HOSTS文件在C:\Windows\System32\drivers\etc\hosts,Linux的HOSTS文件在/etc/hosts
192.168.226.77 storage.local
192.168.226.77 document.local
以上是Windows里的HOSTS文件示例,Linux中的格式是一样的,直接加在后面即可,最好不要动其他行。

在客户端电脑的hosts中添加storage.local和document.local,在虚拟机hosts里添加document.local,指向127.0.0.1(因为要做反向代理,将容器代理到本地)。

在客户端的效果如下:

在容器中添加宿主机和自己的地址,宿主机在docker0里的地址一般是172.17.0.1,容器自己还是127.0.0.1:

172.17.0.1 storage.local
127.0.0.1 document.local

Step2:自签名证书

在虚拟机里创建两个自签名证书,分别用于Nextcloud和DocumentServer的HTTPS,这里不对DoucmentServer的Docker容器设置TLS,而是在虚拟机里用Nginx做DocumentServer的反向代理。
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned-nc.key -out selfsigned-nc.crt
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout selfsigned-ds.key -out selfsigned-ds.crt
提示要输入的信息中,除了”Common Name”其他随便填,Common Name即CN,要填写我们要使用的域名(document.local,storage.local)不然后面我们实装的时候会报错。

Step3:添加证书到服务端

在Ubuntu下的添加方式:

首先将我们之前创建的两个.crt文件拷贝到/usr/share/ca-certificates:

sudo cp *.crt /usr/share/ca-certificates

然后运行下面的命令添加两个证书到系统:

dpkg-reconfigure ca-certificates

在出现的图形界面里选择“yes”,回车,

然后往下翻找到我们要添加的两个证书(此处为test.crt,test2.crt,是我自己试验的时候做的,你看到的应该是前面创建的selfsigned-nc.crt,selfsigned-ds.crt),用空格选定,tab键切到<Ok>,回车:

Ok,保存。

Step4:Nginx反向代理设置

其实这一部分已经提到过很多了,具体可以参考【承上启下】Docker所知总结 Docker+Nginx架构详解

主要是设置证书,网上有许多相关的教程。

Step5:禁用Document Server 访问验证

接下来禁用Document Server的访问验证,Document Server默认拒绝未认证的请求(也就是自签名的HTTPS请求)。

我现在是用的Docker跑的Document Server,使用docker exec命令登入到容器中。

容器中好像只有nano编辑器,不过也够用了。

打开/etc/onlyoffice/documentserver/default.json,向下找到rejectUnauthorized字段,将其值改为false。

重启容器。

Step6:验证结果

按下图填写地址,Save保存。(Secret key留空)

Trouble Shooting

很有可能你做了以上这些事,最后还是报错,可以从Nextcloud和Document Server能否互相访问上入手。 比如
Error when trying to connect (Error occurred in the document service: Error while downloading the document file to be converted.)
这就是Document Server无法访问Nextcloud。

comments powered by Disqus