找回密码
 加入我们
搜索
      
查看: 2294|回复: 68

[NAS] 学习大佬帖子,小白简配版自建ownCloud家庭服务器,启用Let's Encrypted证书流程分享

[复制链接]
发表于 2024-12-26 14:27 | 显示全部楼层 |阅读模式
本帖最后由 tedaz 于 2024-12-26 16:50 编辑

看了kn69968的帖子DIY 家庭小主机 AIO (10)——将私服暴露到公网, 安全便利地回家及无缝网络服务,其中通过创建并启用授信证书,解决浏览器提示自建https服务器证书无效问题深深地吸引了我。

于是开始了下面的折腾。

特别感谢kn69968elvbajimmy203308的讨论、帮助和支持!

现况
  • 家庭服务器宿主:Windows Server 2016 Data Center版。
  • Hyper-V虚拟机:Ubuntu Server 22.04,ip=192.168.1.24,按照官方手册安装ownCloud,启用https,禁用http。
  • 局域网通过 https://192.168.1.24 访问,提示https证书无效,但可以点击忽略风险,继续使用。
  • 路由上将公网 7777 端口映射到 192.168.1.24 的 443 端口,公网通过 https://ted.ddns.net:7777 进行访问,同样会提示证书无效,但可以使用。
  • 安卓版ownCloud app可以通过 https://ted.ddns.net:7777 添加并访问,添加时提示证书无效,但可以使用。
  • 考虑到ddns服务器的不稳定性,实际上在路由器上绑定了多个不同服务商的ddns域名,当一个域名暂时挂掉时,可以继续使用其他域名正常访问ownCloud。多个域名均已经添加到ownCould的添加trusted_domains中了。

安卓版Moon+ Reader通过“Sync to cloud”的“Sync via WebDav”同步读书进度 和/或 电子书时,会因为证书无效,直接被Moon+ Reader拒绝,没有忽略风险的选项。这个问题困扰我多年,多次尝试过不同的解决方案,均为成功。

直到看到kn69968的帖子,开始再次尝试。

题外话
个人一直不倾向于使用“一键脚本”、“无敌汇总大全docker”等解决方案;而是倾向于使用命令逐步自己完成各项设置。
脚本主要是为了海量、多次部署减轻工作量;不一定真的可以让啥都不懂的电脑小白“一键升天”。

实际上,尝试过很多脚本、集成大包、docker等,都没有成功,而且出现的问题很难解决,因为看不明白脚本中到底写的是什么,给出的错误信息也不知道到底属于哪个软件、程序,想查官方手册都不知道从哪里入手。

我的需求
  • 通过生成、启用有效的数字证书,解决https访问时证书无效的问题,达成安卓版Moon+ Reader通过“Sync to cloud”的“Sync via WebDav”同步读书进度 和/或 电子书。
  • 添加一个新的有效数字证书的域名来访问ownCloud;同时保持目前路由器端口转发(正向代理)可以继续访问ownCloud。
  • 在浏览器地址栏可以看到ownCloud的完整URL而不仅仅是域名(不需要重写URL)。
  • 在访问域名时附带端口号。
  • 所有服务器、功能、软件均分布在不同的虚拟机上,确保明白每个命令的原理、影响,方便远期维护、更新。
  • 尽量不使用手机号码、微信才能注册的服务(比如阿里系列)。
  • 不依赖公网VPS(中转对速度影响太大;与其中转,不如直接在公网VPS建立服务了)。

前提条件
  • 家庭宽带需要有动态公网ipv4;不需要ipv4的80、443端口;不需要ipv6。
  • 家庭服务器,可以开启多个虚拟机(方便测试和折腾)。
  • ddns服务商支持添加TXT记录,以便在公网ipv4的80、443端口不可用的情况下,完成Let's Encrypt证书的申请。
  • 不需要手机号码注册,不需要微信注册。
  • 不需要公网服务器。
  • 无需域名备案等流程。
  • 有折腾的意愿和时间。

Let's Encrypt有两种验证方式
  • 在本地服务器创建一个URL,然后Let's Encrypt通过访问https://ted.ddns.net/test-string的方式完成域名验证。因为这是Let's Encrypt发起的访问,所以无法自定义https的端口,也就是必然会使用默认的443端口访问。我之前就是在这个步骤卡了几年,一直没找到解决方案。
  • 在ddns域名服务商那边设置,添加一个TXT记录,然后Let's Encrypt通过访问https://test-string.ted.ddns.net来完成域名验证。这样就不需要用到本地服务器的80、443端口了,因为仅用了域名解析,没有访问本地服务器。

优点 缺点
第一种验证方式对ddns服务没有要求(不是所有ddns服务都可以创建TXT记录)。 需要本地服务器(公网ipv4)的80、443端口可用。
第二种验证方式无需本地服务器(公网ipv4)的80、443端口(目前几乎所有家庭宽带的公网ipv4的80、443端口均已封闭)。 需要ddns服务支持创建TXT记录。

综上,如果ddns服务不支持创建TXT记录,同时公网ipv4也封闭了80、443端口,那就没戏了,放弃吧。或者根本就没有动态公网ipv4也可以放弃了(虽然依然可以用各种神奇的穿透、反代,但都不是本文的讨论范文了)。


实施:第一步 申请Let's Encrypt证书

新建一台Ubuntu 24.04虚拟机,使用root用户登录,运行命令安装certbot
  1. apt install certbot
复制代码


运行certbot命令,开始申请证书。其中“--preferred-challenges dns”的意思是本地ownCloud服务器的80、443端口不可用(也就是家庭宽带的动态公网ipv4的80、443端口不可用),需要通过域名验证方式完成证书申请。
  1. certbot certonly --manual --preferred-challenges dns -d "ted.ddns.net"
复制代码


按照提示输入真实邮箱地址(邮箱用于后续证书更新,Let's Encrypt证书需要每90天更新一次)后,会提示
  1. Account registered.
  2. Requesting a certificate for ted.ddns.net

  3. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  4. Please deploy a DNS TXT record under the name:

  5. _acme-challenge.ted.ddns.net.

  6. with the following value:

  7. 1rd_7j4uhZDBY_iiQOheE2QvwSU7h47tVi-GoqRLCyk

  8. Before continuing, verify the TXT record has been deployed. Depending on the DNS
  9. provider, this may take some time, from a few seconds to multiple minutes. You can
  10. check if it has finished deploying with aid of online tools, such as the Google
  11. Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.ted.ddns.net.
  12. Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
  13. value(s) you've just added.

  14. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  15. Press Enter to Continue
复制代码
这段话的主要意思是,到你的ddns服务商创建一个TXT记录,以便Let's Encrypt验证这个域名确实属于你:

Hostname = _acme-challenge.ted.ddns.net   
Type = TXT
Data = 1rd_7j4uhZDBY_iiQOheE2QvwSU7h47tVi-GoqRLCyk


在ddns服务商那里创建好TXT记录后,可以用nslookup验证下TXT记录解析是否成功:
  1. nslookup _acme-challenge.ted.ddns.net

  2. 回显:
  3. Server:         127.0.0.53
  4. Address:        127.0.0.53#53

  5. Non-authoritative answer:
  6. Name:   _acme-challenge.ted.ddns.net
  7. Address: 911.911.911.911
复制代码
TXT记录解析成功了。
在Let's Encrypt的脚本界面按回车继续,完成域名验证、证书创建成功。

证书在/etc/letsencrypt/live/ted.ddns.net文件夹中。


实施:第二步 更新ownCloud配置文件

修改ownCloud的配置文件/var/www/owncloud/config/config.php,添加trusted_domains。
不需要写http、https等前缀,也不需要写端口号。

  1.   'trusted_domains' =>
  2.   array (
  3.     0 => 'localhost',
  4.     1 => '192.168.1.24',
  5.     2 => 'ted.facebook.net',
  6.     3 => 'ted.twitter.net',
  7.     4 => 'ted.youtube.net',
  8.     5 => 'ted.ddns.net',
  9.   ),
复制代码
这样设置后,可以用本地ip地址和多个域名访问ownCloud,而且每个域名既可以用主路由上的端口映射的7777、6666等端口访问;也可以用Nginx反向代理的有授信证书的https访问端口8888、9999等。

重启apache2服务,使修改后的配置文件生效:
  1. systemctl restart apache2
复制代码

可以不用,但不能没有:保留多种访问方式,可以最大程度的提高灵活度。比如Nginx被玩崩了,依然可以用端口转发访问存在ownCloud上的《TCP/IP详解》、《用TCP/IP进行网际互联》、《TCP/IP指南》、《TCP/IP路由技术》 等书籍,学习网络知识,修复Nginx。

端口转发等安不安全不是最重要的,毕竟ownCloud上只是存了一些TCP/IP电子书,和Moon+Reader的读书进度,不怕泄露,不怕攻击。废了就重建,还能顺便复习Nginx教程。

ownCloud的配置文件中,不需要添加trusted_proxies。不需要更改overwrite.cli.url,我这里是
  1.   'overwrite.cli.url' => 'https://192.168.1.24/',
复制代码

重要:
  • 在ownCloud已经部署正常的情况下,除了修改trusted_domains,绝对不要为了Nginx更改ownCloud的其他任何东西。
  • 记住,只要在端口转发状态下ownCloud工作正常,在Nginx反向代理的情况就应该一切正常,就不需要改ownCloud。
  • 要改的是Nginx。

千万不要用乱七八糟的正则表达式去重写URL等骚操作,那样也许可以暂时解决某些问题,但是ownCloud的功能和代码太复杂了,很可能有的页面、有的功能就不正常了。
特别的,当后期ownCloud版本升级后,可能需要新的URL重写规则,不是顶级高手,不要重写URL;不要乱改ownCloud的配置,确保未来ownCloud可以正常升级和使用。

实施:第三步 配置、运行Nginx

新建Windows虚拟机,ip=192.1681.2。
下载Windows版Nginx,解压缩到C:\。

编辑配置文件nginx-1.27.3\conf\nginx.conf

添加一个server块,注意端口不要冲突。
  1. server {
  2.     listen 443 ssl; #Nginx监听443端口
  3.     server_name ted.ddns.net; #ddns域名

  4.     ssl_certificate fullchain.pem; #certbot生成的证书文件
  5.     ssl_certificate_key privkey.pem; #certbot生成证书的key

  6. location / {
  7.         proxy_pass https://192.168.1.24; # 指向内网ownCloud地址
  8. proxy_set_header Host $host:8888; # 传递请求的 Host
  9.         proxy_set_header X-Real-IP $remote_addr; # 传递真实客户端 IP
  10. }
  11. }
复制代码
这里最重要的是proxy_set_header Host $host:8888,这个端口号非常重要,这是公网https访问时使用的端口号。这里不写端口,会导致Nginx跳转后的URL缺少端口号。


重要:不要用各种顶级高手的正则表达式overwrite URL。用最小化修改实现的功能往往是最全面最完整的。修改越多,可能埋的雷越多。

ownCloud的配置文件中,不需要添加trusted_proxies。不需要更改overwrite.cli.url,我这里是
  1.   'overwrite.cli.url' => 'https://192.168.1.24/',
复制代码

小结
至此,应该可以在公网用浏览器访问ownCloud了,且https的证书是Let's Encrypt的有效证书。

访问时的流程:
  • 浏览器访问网址https://ted.ddns.net:8888
  • ddns服务将ted.ddns.net域名指向家庭宽带的公网动态ipv4;
  • 主路由收到访问请求后,依照端口映射规则,将来自公网8888端口的请求转发至内网Nginx服务器(ip=192.168.1.2)的443端口;
  • Nginx使用Let's Encrypt证书响应,并将请求转发至内网的ownCloud服务器(ip=192.168.1.24)的443端口;
  • ownCloud服务器上的apache2提供服务。

关于证书自动更新
Let's Encrypt的证书有效期只有90天,需要定期更新。
手动更新是可以的,但是不方便。

目前用Ubuntu+lego+nginx搞定了证书自动更新:每天检查;证书到期前10天更新证书。
暂时dry run通过了,就看80天后自动更新的效果了。

等有时间写自动更新的部分。

发表于 2024-12-26 14:33 | 显示全部楼层
棒棒棒棒棒棒棒棒棒棒棒棒棒棒棒!!!!!

发表于 2024-12-26 15:03 | 显示全部楼层
这么来说的话,你把 nginx 改成
  1. server {
  2.     listen 8888 ssl;
复制代码


路由器上端口映射也改为 8888 到 8888 ,那么 nginx 那里就不需要加
  1. proxy_set_header Host $host:8888;
复制代码
去改 Host 了。
发表于 2024-12-26 15:08 | 显示全部楼层
其实可以多用用docker,Windows Server 2016不知道能不能安装docker,docker版本NPM自带ssl申请和反代,可以自动定期更新ssl证书,不知楼主需要用到owncloud哪些功能,owncloud也有docker版本,这样整体架构就简单很多,WinServer下跑几个docker应用,实现需求,通过映射文件夹管理ssl证书,运维也简单很多

点评

已经用Ubuntu+lego+nginx搞定了证书自动更新,每天检查,证书到期前10天更新证书。目前dry run通过了,就看80天后自动更新的效果了。  发表于 2024-12-26 16:44
发表于 2024-12-26 15:09 | 显示全部楼层
对的,最后你会发现你还需要一个自动续签证书的东西。
所以,推荐 Nginx Proxy Manager,这个好用,可以自动帮你管理证书,自动帮你通过 dns 服务商做证书验证,自动更新 nginx 的证书配置。

点评

已经用Ubuntu+lego+nginx搞定了证书自动更新,每天检查,证书到期前10天更新证书。目前dry run通过了,就看80天后自动更新的效果了。  发表于 2024-12-26 16:44
发表于 2024-12-26 15:53 | 显示全部楼层
ssl证书这个东西,现在几家服务商都只给90天免费了,折腾个半天太麻烦了,还是选择tb十几块搞定一年的。。。

点评

已经用Ubuntu+lego+nginx搞定了证书自动更新,每天检查,证书到期前10天更新证书。目前dry run通过了,就看80天后自动更新的效果了。  发表于 2024-12-26 16:45
 楼主| 发表于 2024-12-26 16:40 | 显示全部楼层
jimmy203308 发表于 2024-12-26 15:08
其实可以多用用docker,Windows Server 2016不知道能不能安装docker,docker版本NPM自带ssl申请和反代,可 ...

Windows Server可以运行docker:直接运行windows构架的docker,通过hyper-v虚拟化运行linux构架docker。

尝试过ownCloud的docker,一直没弄明白docker如何扩容,或者如何让docker直接使用宿主上的文件夹作为ownCloud的存储空间。

hyper-v的unbuntu装ownCloud就比较简单,直接暴力的建立一个100TB的vhd。ownCloud安装时就用默认路径,直接用“/”。后来需要扩容,将vhd扩展到200TB,然后ubuntu运行Gparted扩展一下就好。
 楼主| 发表于 2024-12-26 16:42 | 显示全部楼层
elvba 发表于 2024-12-26 15:03
这么来说的话,你把 nginx 改成

试过了,改server块的listen不管用。跳转后的URL是没有端口号的。

只有在proxy_set_header Host $host添加“:8888”才能让跳转后的URL带有端口号。
 楼主| 发表于 2024-12-26 16:45 | 显示全部楼层
elvba 发表于 2024-12-26 15:09
对的,最后你会发现你还需要一个自动续签证书的东西。
所以,推荐 Nginx Proxy Manager,这个好用,可以自 ...

NPM有非docker的版本吗?

感觉这东西完全没必要做成docker。
理论上一个可执行程序就行了。
 楼主| 发表于 2024-12-26 16:46 | 显示全部楼层
mysky 发表于 2024-12-26 15:53
ssl证书这个东西,现在几家服务商都只给90天免费了,折腾个半天太麻烦了,还是选择tb十几块搞定一年的。。 ...

淘宝一年后还是要手动更新,不如自动更新方便。
已经用Ubuntu+lego+nginx搞定了证书自动更新,每天检查,证书到期前10天更新证书。目前dry run通过了,就看80天后自动更新的效果了。
发表于 2024-12-26 17:38 | 显示全部楼层
tedaz 发表于 2024-12-26 16:45
NPM有非docker的版本吗?

感觉这东西完全没必要做成docker。

NPM 是专门给 docker 用的,以前没有的时候也得自己手撸,有了之后方便很多。

你折腾这么多真的不如多用下 docker,其实难度比你折腾的这些还要小的。

docker 直接用 -v 就可以挂载宿主机的文件夹作为 owncloud 的存储空间,-v 就是映射本地的目录到 docker 里面的目录, -p 就是映射本地的端口到 docker 里面的端口,然后就没了,这不比你开虚拟机再去单独部署简单的多。

评分

参与人数 1邪恶指数 +10 收起 理由
tedaz + 10

查看全部评分

发表于 2024-12-26 22:31 | 显示全部楼层
tedaz 发表于 2024-12-26 16:46
淘宝一年后还是要手动更新,不如自动更新方便。
已经用Ubuntu+lego+nginx搞定了证书自动更新,每天检查, ...

问题是我需要证书部署在几个别的地方,还得同步也是个麻烦事。。。
发表于 2024-12-26 22:33 | 显示全部楼层
ownCloud和Joplin哪个强大好用呀?
发表于 2024-12-26 22:45 | 显示全部楼层
内网设备证书只能特定服务商的表示我还是手动更吧
另外个人倾向泛域名,这样一般人基本一个证书全搞定了
发表于 2024-12-27 00:36 | 显示全部楼层
我一直在aio上的黑裙里申请的证书,然后给docker里面的服务开反代就好了,都有https
 楼主| 发表于 2024-12-27 10:21 | 显示全部楼层
本帖最后由 tedaz 于 2024-12-27 10:37 编辑
elvba 发表于 2024-12-26 17:38
NPM 是专门给 docker 用的,以前没有的时候也得自己手撸,有了之后方便很多。

你折腾这么多真的不如多用 ...


试了一下,NPM支持的ddns太少了,没有我在用dyn、dynv6,这个有什么办法吗,比如装个NPM的插件?

看github上有discussion,2022年就有人提出添加dynv6,https://github.com/NginxProxyMan ... er/discussions/2488
到现在还没加上,这是不打算添加的样子。

2024-12-27 10 18 29.png
 楼主| 发表于 2024-12-27 10:24 | 显示全部楼层
mysky 发表于 2024-12-26 22:31
问题是我需要证书部署在几个别的地方,还得同步也是个麻烦事。。。

不是很明白你的意思。

一个证书只能绑定一个域名,就家用来说,一个域名只能帮顶一个公网ipv4。这个公网ipv4也就是家里主路由的wan口ip。
然后内网nginx服务器使用一个证书,就可以反向代理局域网的多个内网地址、多个内网服务。

为什么说还要同步到别的地方呢?
发表于 2024-12-27 10:26 | 显示全部楼层
owncloud 我记得是把文件打散了存储吧,对普通家用来说,是不是出了问题文件恢复起来又难了点
 楼主| 发表于 2024-12-27 10:26 | 显示全部楼层
红色狂想 发表于 2024-12-26 22:33
ownCloud和Joplin哪个强大好用呀?

这两个是不同的东西吧。
ownCloud是用于同步海量文件的,而且实际测试下来,ownCloud官方原版非常robust;nextcloud同步海量文件会出错,即使暂停同步确保文件拷贝完成后再开启同步,nextcloud依然有很大几率会出错,几乎没法用于海量、大型文件的同步。

Joplin类似于WordPress,是写笔记、写博客的。
发表于 2024-12-27 10:26 | 显示全部楼层
tedaz 发表于 2024-12-27 10:21
试了一下,NPM支持的ddns太少了,没有我在用dyn、dynv6,这个有什么办法吗,比如装个NPM的插件?

...

使用Lucky可以快速解决问题
 楼主| 发表于 2024-12-27 10:32 | 显示全部楼层
chip_discovery 发表于 2024-12-27 10:26
owncloud 我记得是把文件打散了存储吧,对普通家用来说,是不是出了问题文件恢复起来又难了点 ...

这不是问题。一方面最近十来年的使用,ownCloud没出过问题。另一方面,即使ownCloud崩了,也只需要新建虚拟机重装ownCloud,然后用本地的文件重新同步到ownCloud服务器就行了。
 楼主| 发表于 2024-12-27 10:34 | 显示全部楼层
mhggpo 发表于 2024-12-27 10:26
使用Lucky可以快速解决问题

Lucky是什么,也是nginx的docker吗,有完整的名字或关键字吗?
我用google搜索Lucky,Lucky let's encrypt,Lucky nginx都搜不出来啊。
发表于 2024-12-27 10:44 | 显示全部楼层
tedaz 发表于 2024-12-27 10:24
不是很明白你的意思。

一个证书只能绑定一个域名,就家用来说,一个域名只能帮顶一个公网ipv4。这个公网 ...

有些服务在一个内网但不在一个服务器上,在不同虚拟机
发表于 2024-12-27 10:54 | 显示全部楼层
tedaz 发表于 2024-12-27 10:34
Lucky是什么,也是nginx的docker吗,有完整的名字或关键字吗?
我用google搜索Lucky,Lucky let's encryp ...

用go写的反代
docker镜像:gdy666/lucky:latest

评分

参与人数 1邪恶指数 +10 收起 理由
tedaz + 10 谢谢,正在测试

查看全部评分

 楼主| 发表于 2024-12-27 10:58 | 显示全部楼层
mysky 发表于 2024-12-27 10:44
有些服务在一个内网但不在一个服务器上,在不同虚拟机

nginx就是为了满足你这种需求的啊。

所有https访问都会先到nginx,然后nginx用证书相应,并按照nginx的配置文件,将访问转发到多个内网服务器、多个服务。
发表于 2024-12-27 11:01 | 显示全部楼层
tedaz 发表于 2024-12-27 10:58
nginx就是为了满足你这种需求的啊。

所有https访问都会先到nginx,然后nginx用证书相应,并按照nginx的 ...

我不是所有机都适合nginx,而且服务多了网络阻塞。
 楼主| 发表于 2024-12-27 11:10 | 显示全部楼层
mhggpo 发表于 2024-12-27 10:54
用go写的反代
docker镜像:gdy666/lucky:latest

试了一下,这玩意儿是个ddns客户端,然后集成了所有功能并强制同时使用它的所有功能。这也太霸道了。

我不需要lucky管理、更新ddns。可以用lucky仅申请证书、做nginx转发吗?
发表于 2024-12-27 11:13 | 显示全部楼层
tedaz 发表于 2024-12-27 11:10
试了一下,这玩意儿是个ddns客户端,然后集成了所有功能并强制同时使用它的所有功能。这也太霸道了。

我 ...

可以,我就是ddns在ikuai上,只做证书更新和反代。
 楼主| 发表于 2024-12-27 11:19 | 显示全部楼层
highchh 发表于 2024-12-27 11:13
可以,我就是ddns在ikuai上,只做证书更新和反代。

能简单说下从哪个菜单进入证书申请吗?
官方教程没有文字版证书申请,视频也没有有包含“证书”关键字的。
发表于 2024-12-27 11:26 | 显示全部楼层
本帖最后由 highchh 于 2024-12-27 11:27 编辑

https://post.色魔张大妈.com/p/awz4dnrk/
安全管理里面,添加证书。

评分

参与人数 1邪恶指数 +10 收起 理由
tedaz + 10

查看全部评分

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|Chiphell ( 沪ICP备12027953号-5 )沪公网备310112100042806 上海市互联网违法与不良信息举报中心

GMT+8, 2025-1-3 09:45 , Processed in 0.017098 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2007-2024 Chiphell.com All rights reserved.

快速回复 返回顶部 返回列表