该教程帮助用户在TrueNas Core (FreeBSD) Jail内正确安装acme.sh并且正确运行。这里以Plex插件为例。
注:本文参考GitHub上该文章https://github.com/sethkor/plex-cert-acme-aws,但由于有一定错误或未更新,以及配置不全面,这里增加了部分修正信息。

1.安装pkg以及curl包

首先,我们需要安装curl包用来git获取acme的。
第一次输入pkg指令有可能需要下载pkg,请务必确认网络设置正确,否则pkg可能无法安装。
如果卡住或者始终无法安装,一般都是网络设置不正确导致。

pkg install curl

2.为对应用户创建目录以及赋予权限

接下来为对应的用户创建文件夹或者指定其主页目录。
由于Plex在Jail里均使用plex用户执行操作,所以我们需要给予其登录bash指令的目录和home主页目录。

mkdir -p /home/plex
chown plex:plex /home/plex

上述代码,创建/home/plex目录,-p表示如果没有上级目录就创建上级目录,并且将该文件夹的所有者更改为plex用户。当然你也可以将根目录设置在任何位置。只要你觉得自己好找就行。

接下来输入

chpass plex

然后你就会看到以下vi界面(下列为已经改好的样子)
把Gid更改为wheel(避免组权限问题)
把Home directory改为 /home/plex (设置用户home目录)
把Shell目录改为 /bin/sh (赋予用户登录)
注:chpass指令调用vi进行编辑,按i插入字符,x删除当前字符,可以用del退回指令状态,因为在VNC界面看不到那个底部指令栏,更该完成后,shift+q可以调出指令界面,然后再输入wq,回车,就可以保存修改了。

#Changing user information for plex.
Login: plex
Password: *
Uid [#]: 972
Gid [# or name]: wheel
Change [month day year]:
Expire [month day year]:
Class:
Home directory: /home/plex
Shell: /bin/sh
Full Name: Plex Media Server
Office Location:
Office Phone:
Home Phone:
Other information:

更改完成后,就可以使用su指令登录plex用户了。
以下三条指令请根据需要使用。

//登录并打开用户目录
su - plex
//或者,当前目录登录
su plex
//切换到用户根目录
cd ~

3.获取acme.sh并准备目录

运行下列指令,获取并且安装acme.sh(运行前,记得以plex用户登录)。
区别是否是plex账户,默认Jail的Terminal会用root账户显示为root@PLEX:~ #,而plex用户则是$ 。

curl https://get.acme.sh | sh

正确情况下,acme.sh会被安装在/home/plex目录下,为.acme.sh文件夹。如果你的提示没有目录权限,或者不能正常完成安装,请重启Jail。

安装完成后,请在.acme.sh目录运行以下指令以更改acme的默认CA证书机构为letsencrypt。
(由于从2.21年8月1日起,acme.sh使用zerossl为默认CA,需要账户和登录,较为麻烦)

acme.sh --set-default-ca  --server  letsencrypt
//以下指令用于以绝对路径运行
/home/plex/.acme.sh/acme.sh --set-default-ca  --server  letsencrypt

接下来,在/home/plex目录下创建cert文件夹,用于等下保存转换完的文件。

mkdir /home/plex/cert

4.正确配置reload.sh和renew.sh

首先,为PLEX需要的PKCS #12密钥文件创建一个随机密码。
如果你是win的系统,可以用类似这个的在线Terminal来运行下列指令。
下列指令,会随机一个PKCS12支持的密码。

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1

随机出来的字符串,请妥善保存,后续有俩地方要用到。

4.1.创建reload.sh

该脚本用于转换和移动证书文件,模板如下,对应目录也可以根据你之前的选择来修改。
你可以用pkg install nano来获取nano然后nano reload.sh来创建并且修改该文件。

#!/bin/sh

/home/plex/.acme.sh/acme.sh --toPkcs -d <你想使用的域名> --password <生成的密码>
cp /home/plex/.acme.sh/<你想使用的域名>/<你想使用的域名>.pfx /home/plex/cert

使脚本变成可执行。

chmod +x reload.sh

注:你也可以把该脚本的转换功能整合到renew.sh里面,不影响,也可以不转换成PKCS12文件。
看需要移除对应flag即可。比如–toPkcs和–password是可以被移除的

4.2.创建renew.sh

该脚本用于使用acme更新证书,模板如下,以下为阿里云版默认写法。

#!/bin/sh
export Ali_Key=<你的阿里云Key>
export Ali_Secret=<你的阿里云Secret>

/home/plex/.acme.sh/acme.sh --force --issue --dns dns_ali -d <你想使用的域名> --reloadcmd "/home/plex/reload.sh" --renew-hook "/home/plex/reload.sh"

使脚本变成可执行。

chmod +x renew.sh

对于其他云服务提供者,请自行参考该页面,然后更改上述前两行的export值,以帮助acme.sh正确读取账户信息。以下以DP为例(腾讯云可用)。

TrueNas/FreeNas 监狱Jail/Plex插件 安装ACME证书(阿里云/腾讯云/AWS)-MLEN
打开dns_dp.sh查看
TrueNas/FreeNas 监狱Jail/Plex插件 安装ACME证书(阿里云/腾讯云/AWS)-MLEN

可以看到里面使用的是DP_Id值和DP_Key值,对应的,只需要将模板里的Ali_Key和Ali_Secret改为前两者即可,其次要将代码中的dns_ali改成dns_dp。

5.生成证书并配置使用

运行以下指令来使用脚本

./renew.sh

脚本会利用API来发起DNS挑战,成功后会发送对应的证书到本地,一般需要30-60秒。
reload脚本会把证书复制到对应目录并且修改为PKCS12格式并添加密码。

接下来你需要到PLEX那里正确配置SSL证书的信息。格式如下图。
该设置在,本地连接服务器时,设置/网络/显示高级选项,目录下可以看到。

TrueNas/FreeNas 监狱Jail/Plex插件 安装ACME证书(阿里云/腾讯云/AWS)-MLEN

按下保存后,刷新页面,或者重启浏览器,就可以看到证书正确加载了。
如果还没有加载,请仔细参照之前的步骤查错,或者用ls -l检测对应各个文件的权限。