NAS系统折腾记 – 申请域名和数字签名

群晖NAS硬件和DSM安装完毕,现在已经可以在家里局域网的环境下正常服务了。下一个问题自然是考虑出门在外的时候,怎样能通过外网远程访问NAS的服务了。为此,我需要给我的NAS服务器申请一个便于记忆的域名,然后配合DDNS服务实现域名解析远程访问我的NAS(DDNS配置参见这篇博文)。另外为了安全原因并使我的NAS服务看起来更专业,我还要为此域名申请数字签名。

申请域名

有很多服务商可以提供域名的申请,比如国外的cloudflare,godaddy,国内的阿里云,腾讯云,西部数码,等等。我的域名通过cloudflare购买,所以以cloudflare作为例子。实际上域名申请和购买是一个非常简单的过程,不同服务商的流程基本差不多,不同的地方主要是价格和提供的服务,可以根据个人的实际需求比较一下。

首先访问cloudflare(https://www.cloudflare.com)官网,注册账号并登录。

注册cloudflare账号并登录

在dashboard里选择“域注册”->“注册域”(是不是觉得很绕?)

注册域名界面

搜索域名,这个域名被我买了。

搜索域名是否可用

搜索到自己心仪的域名后,点击“购买”。

点击购买并进入付款流程

付款方式支持VISA,MasterCard,AmericanExpress,DISCOVER和PayPal。

选择付款方式

选择好付款方式并输入其它的一些必要信息后就可以点击“完成购买”将心仪的域名收入自己名下了。由于后面的步骤要实际付款,我就不再一步步演示了。

完成购买

申请数字签名

域名申请好了以后,我们还要为域名申请数字签名。在群晖NAS上,我使用acme.sh docker镜像脚本来申请免费的Let’s Encrypt数字签名。

首先在DSM Container Manager的注册表里搜索“acme.sh”并下载neilpang/acme.sh镜像。

下载neilpang/acme.sh

接下来为acme.sh映像创建容器运行实例。在映像里选择neilpang/acme.sh并点击“运行”。

运行neilpang/acme.sh

设置容器名称,启用资源限制,启用自动重新启动。请记住此容器名称(neilpang-acme-sh-1),在后面的脚本中要用到。

acme.sh常规设置

在高级设置里映射如下的存储空间到docker,并选择网络为”host”。

映射存储空间

选择网络为host模式

取消勾选“向导完成后运行此容器”,点击完成。

完成创建容器

在NAS的/docker/acme.sh目录下创建account.conf文件,并输入如下的内容:

export CF_Email="your cloudflare email" # 如果使用其它的域名提供商,请参考相应文档
export CF_Token="your cloudflare token"
AUTO_UPGRADE='1'
export SYNO_Username="your nas account"
export SYNO_Password="your nas password"
export SYNO_Certificate=""
SYNO_Create='1'
SYNO_Port='5000'
LOG_FILE='/acme.sh/acme.sh.log'

CF_Token的申请可以参照如下的步骤:

登录cloudflare账号,选择账号->我的个人资料->API令牌

选择“创建令牌”。

创建令牌

选择“编辑区域DNS”,“使用模板”。

编辑区域DNS

选择域名并点击“继续以显示摘要”。

创建用户API令牌

将上述的API令牌拷贝到account.conf文件中。

在/docker/acme.sh目录下创建文件run.sh,将如下的内容写入文件中,并将域名改为自己申请的域名。我共申请了www.yanghong.dev, nas.yanghong.dev和blog.yanghong.dev的证书,大家可以视自己的事情情况更改。

#!/bin/bash

# docker exec 容器名称 运行命令;
# 第一个acme.sh是容器的名称,上文新建容器时有提到,如果不一样,请修改为对应的容器名称;
# 第二个acme.sh是运行命令;

# 注册ZeroSSL
# 邮箱更改成你注册ZeroSSL时的邮箱账号;
# 如果证书服务商选择Let's Encrypt,下面这行代码请注释掉;
# docker exec acme.sh acme.sh  --register-account  -m [email protected] --server zerossl

# 生成证书
# 根据证书服务商修改--server,如选择Let's Encrypt的话,对应的值为--server letsencrypt;
# 域名更改为自己的域名;
# 其他设置请参考:https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide
docker exec neil-pang-acme-sh-1 acme.sh --force --log --issue --server letsencrypt --dns dns_cf --dnssleep 120 -d "www.yanghong.dev" -d "nas.yanghong.dev" -d "blog.yanghong.dev"

# 部署证书到群晖上
# 域名更改为自己的域名;
docker exec neil-pang-acme-sh-1 acme.sh --deploy -d "www.yanghong.dev" -d "nas.yanghong.dev" -d "blog.yanghong.dev" --deploy-hook synology_dsm

创建计划任务

进入控制面板 -> 计划任务 -> 新增 -> 计划的任务 -> 用户自定义的脚本 -> 常规,任务名称:acme.sh;用户账号:root

计划任务常规设置

在计划tab选择“在以下日期运行”,“每三个月重复”,并设置开始日期。

在任务设置里输入如下的命令脚本并选择确定。

bash /volume1/docker/acme/run.sh >>/volume1/docker/acme/log.txt 2>&1

用户自定义脚本

作者个人Blog(HY's Blog):https://blog.yanghong.dev