WebDAV服务器搭建

-------------------- 2023.3.30~2023.4.1将全部内容更新 -------------------------------
之前发布时的文章比较零乱,不够简洁...
目录
1.WebDAV服务器搭建
2.搭建目的
3.说明
4.使用HTTPS协议
4.1 HTTPS单向认证
4.1.1 Nginx
4.1.1.1推荐指数:★★★★★☆
4.1.1.2 使用感受
4.1.1.3. 思路方法
4.1.1.4 脚本搭建WebDAV(推荐)
4.1.1.5. 学习使用
4.1.1.5.1 第1步:生成一个自签名的数字证书
4.1.1.5.2 第2步:安装Nginx并配置WebDAV模块
4.1.1.5.3 第3步:增强安全性及相关设置
4.1.1.6 开放安全规则,入方向:443端口。关闭防火墙
4.1.1.7.WebDAV同步设置
4.1.1.7.1 Joplin客户端WebDAV同步设置
注意
Joplin安卓和ios端同样需要安装证书Joplin同步效果展示
4.1.1.7.2 Obsidian客户端WebDAV同步设置
4.1.2. webdav-go
4.1.2.1 推荐指数:★★★★★☆
4.2.HTTPS 双向认证
4.2.1. 推荐指数:★★★★★★
4.2.2 目的
4.2.3. Joplin、Obsidian 不支持双向认证
5.视频教程
1.WebDAV服务器搭建
搭建的初衷是为了同步Joplin笔记(https://joplinapp.org/),后来发现其实也可以同步Obsidian笔记(https://obsidian.md/)虽然同步功能没有Joplin友好。前者是软件自带WebDAV同步方式,后者是使用WebDAV同步插件
2.搭建目的
用于笔记等数据的实时同步
笔记同步三件套:WebDAV客户端 + WebDAV服务端 + 服务器
WebDAV客户端:可以是Joplin(https://joplinapp.org/),也可以是Obsidian(https://obsidian.md/),或者其它支持WebDAV同步的软件
WebDAV服务端(Nginx或者WebDAV-go ):搭建在服务器中,如云服务器
服务器:笔记等数据存放的地方,可以随时随地使用任何的WebDAV客户端同步数据
ps: 关于服务器的选择,这里将使用云服务器
3.说明
1.本篇文章需要一点Linux基础,如果有不明白的地方,欢迎到评论区留言
2.需要使用到ssh终端登录服务器(SecureCRT、Finalshell等等都是可以的)
3.本篇文章中列出的代码的使用方式:
将列出的代码全部复制(快捷键:ctrl+insert),并粘贴到ssh终端(快捷键:shift+insert),最后回车,其中某些步骤需要多次回车(总之,粘贴后多按几次回车即可)
4.云服务器的安全组记得开放指定端口!!! 另外服务器中莫忘记开放指定端口(为了省事,可直接关闭服务器中的防火墙)
4.使用HTTPS协议
如果使用的是HTTP协议,这意味着我们的笔记数据,完全luolu地在网上跑来跑去……,笔记数据容易被坏人监听,所以这里推荐使用HTTPS协议传输数据
下面有2种HTTPS认证方式:单向认证和双向认证。但目前Joplin、Obsidian笔记软件均不支持双向认证,所以为了方便,推荐使用HTTPS单向认证
4.1 HTTPS单向认证
下面展示了两种方式,一种是由Nginx编译安装搭建的WebDAV服务器,另一种是Github上由Go语言编写的WebDAV-go项目。当然这两者都已经脚本化,只为方便搭建,使用其中一种就行。
4.1.1 Nginx
4.1.1.1推荐指数:★★★★★☆
4.1.1.2 使用感受
如今,由于考虑到Nginx的泛用性,我已经将其作为WebDAV服务器使用了,通过它同步Joplin笔记已经1年多,是比较稳定的
4.1.1.3. 思路方法
为了笔记传输过程中更安全,就需要使用HTTPS,而最麻烦的是SSL数字证书问题,这个问题如果解决了,其他的问题也就不算问题
方法:
首先需要我们有一个SSL数字证书,可以自己购买,但是无奈价格昂贵,但可以使用开源软件mkcert帮助我们生成一个自签名的数字证书(它比openssl方便许多)
安装Nginx,配置WebDAV模块,使Nginx能够通过WebDAV传输数据,然后配置相关安全设置进一步加强安全性
设置服务器安全组,开放Nginx监听的https默认端口443(但不一定非要443,我们可以改为2022,2023,...都行)。并且关闭服务器防火墙(服务器中也可以开放指定端口,如443,80等任意的端口)
同步效果展示
4.1.1.4 脚本搭建WebDAV(推荐)
复制下面代码,粘贴到终端,然后回车
输入Nginx监听的HTTP端口,然后回车(默认80端口)
输入Nginx监听的HTTPS端口,然后回车(默认443端口)

注:main.sh这个shell文件有提供多种功能

脚本v2.1版本:支持Ubuntu、Debian、CentOS系统
经过测试的系统版本:
ubuntu22.04、 ubuntu20.04、ubuntu18.04、ubuntu16.04
Debian11.1、Debian10.0、Debian9.0
CentOS7.9、CentOS7.2
4.1.1.5. 学习使用
下面是详细步骤,供学习交流,以CentOS为例,其他Linux系统同理操作即可
ps: 由于文本格式,像空格,tab符及特殊符号等、以及这篇文章发布的平台本身等等原因,有一定的概率会出错,所以,推荐使用给出的shell脚本执行(见4.1.1.4),而手动部分展示出来是为了供学习使用和参考。
4.1.1.5.1 第1步:生成一个自签名的数字证书
方式1:手动执行
开源软件mkcert(go语言编写的程序)是一个用于制作本地信任的开发证书的简单工具
下载:https://github.com/FiloSottile/mkcert/releases
https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
方式2:自动执行,为ip地址生成自签名数字证书。
4.1.1.5.2 第2步:安装Nginx并配置WebDAV模块
4.1.1.5.3 第3步:增强安全性及相关设置
1.相关安全性增强配置:
1.1.HTTPS 密钥交换算法
执行下面指令生成DH 参数文件:(执行需半分钟左右)
1.2HTTPS 会话缓存
说明:之后将会为nginx配置会话凭证(Session Ticket)方式
执行下面指令生成会话凭证密钥文件:
2.配置笔记数据存放目录
3.配置用于登录认证的密码文件
说明:执行下面指令,记住生成的WebDAV用户名和密码,如果忘记了,再次执行即可
4.修改Nginx配置文件
4.1.将mkcert生成证书和私钥移动到Nginx配置目录
4.2.修改配置文件(注:此处有一百余行)
注意:此块内容除了EOF所在行,其余不要用Tab符,如果有,请替换为空格,否则重定向无法正确输出
(有的$需要保留,所以使用了转义符反斜杠)
4.1.1.6 开放安全规则,入方向:443端口。关闭防火墙
以阿里云为例,入方向:开放您设置的https的端口(您设置的https的端口,并非一定是443,不过是默认情况下是443),并在ssh终端输入下面指令关闭服务器防火墙(也并非一定要关闭,您也可开放这个端口):
下面,以开启443端口为例:

方式1:关闭防火墙
方式2:开放443端口
####
下面以Joplin和Obsidian这两款笔记软件为例,它们都支持WebDAV同步,可以很好作为同步测试对象
4.1.1.6.1 Joplin客户端WebDAV同步设置
将根证书从服务器中下载到Windows中,然后配置证书到Joplin客户端
演示中的Joplin版本:2.9.17
1.下载根证书
执行下面指令下载根证书rootCA.pem,在弹出的对话框中选择存放的目录,比如我将它下载到N盘根目录

2.给Joplin客户端配置 TLS 证书
配置方法:
打开Windows版本的Joplin:依次点击工具——选项——同步,然后选择同步目标WebDAV

接着点击【显示高级设置】,然后鼠标往下滑动,找到TLS证书字样。接着看下面配置方式
方式1:配置证书文件的全路径。比如我将下载的证书复制到N盘的cert目录,那么配置TLS路径
为N:\cert\rootCA.pem

方式2:配置证书文件所在目录,比如我将证书放到N盘的cert目录,那么配置TLS证书路径为 N:\cert

3.填写WebURL、WebURL用户名、WebURL密码
WebURL格式:https://【域名或IP】:【设置的https端口】/dav
如:https://125.26.53.206:2022/dav

接着点击【应用】,然后点击【检查同步设置
注意
证书文件所在路径中不能有中文和空格!
检查同步设置可能会有以下报错:
1.401:说明WebDAV配置信息有误
2.unable to verify the first certificate :说明证书配置有误
值得说明的是,由于Joplin对证书的检验方式、以及其他等等原因,我们的配置的根证书存在小概率报错(原因未知)。
解决的方式如下几种:
更改证书存放路径,重新配置TLS证书,然后必须重启Joplin。这是为了解决该软件不能及时更新修改的配置信息等原因,体验不是太好,希望以后能修复吧
在Joplin软件中忽略TLS证书错误,然后重启Joplin,不过这会丢失些安全性。
Joplin安卓和ios端同样需要安装证书
安卓端安装证书:设置——>隐私安全——系统安全——加密与凭据——从SD卡安装证书即可
ios端安装证书:
将证书文件通过邮件发送到一个邮箱,然后用safari浏览器登录这个这个网页邮箱,然后找到这个邮件,并将其中的附件(也就是证书)下载下来(会提示是不可描述文件)
然后进入设置——>通用——>描述文件——>选择这个证书文件,然后安装
继续进入设置——>通用——>关于本机——>证书信任设置——>开启【针对根证书启用完全信任】的开关
Joplin同步效果展示



安卓端

4.1.1.6.2 Obsidian客户端WebDAV同步设置
1.首先下载根证书,并导入证书到本地计算机中,避免同步时400错误(原因:由于自签名证书
400错误:
https://github.com/remotely-save/remotely-save/issues/79





以当前用户为例,点击【下一步】




点【是】

3.先重启obsidian软件,然后打开如remotely-save插件,填写WebDAV 同步信息

3.点击检查测试是否同步成功

4.1.2. webdav-go
4.1.2.1 推荐指数:★★★★★☆
webdav-go似乎不需要过多的环境依赖,由Golang语言编写,不像Nginx编译安装需要较为复杂的环境
此项目github上有1.7W星星,稳定性感觉还是不错的
二进制文件:https://github.com/hacdias/webdav/releases
安装过程:待更新...
4.2.HTTPS 双向认证
4.2.1. 推荐指数:★★★★★★
4.2.2 目的
在单向认证的基础上进一步加强安全性,比如网银就采用了该方式,简单的说就是客户端和服务器端都需要验证彼此的身份,它可以防止中间人对数据的监听和篡改。
4.2.3. Joplin、Obsidian 不支持双向认证
Joplin错误信息:
发生错误。请检查 URL、用户名、密码等是否正确以及同步目标是否可访问。报告的错误为:
PROPFIND : Unknown error 2 (400): <html> <head><title>400 No required SSL certificate was sent</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>No required SSL certificate was sent</center> <hr><center>nginx</center> </body> </html> (Code 400)
查了下资料:"Joplin does not use certificates for authentication. The certificate to specify is for certificate verification of the Server".
(译:证书只是用来验证服务器证书的,并不会将它发送给服务器)
资料来源:
所以,目前无法实现双向认证
这个问题先留着,如果官方提供解决方案了,再来更新这块内容...
5.视频教程
https://www.bilibili.com/video/BV1ie4y157yz/?vd_source=b64c0f67d52589e036d7ed622dff19bc