【技术备忘录】Ubuntu下HTTPS网站部署记录
为Ubuntu机器上部署的Web服务配置HTTPS提高安全性的操作记录。
Caddy: 一站式HTTPS管理
我在和DeepSeek交流过程中偶然了解到除了nginx外,还有Caddy这个可以为网站部署HTTPS及反向代理的服务器应用,而且操作很简便。
官方文档:Caddy docs 官方文档中文版翻译文档:Caddy文档
安装
1
2
3
4
5
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/caddy-stable-archive-keyring.gpg] https://dl.cloudsmith.io/public/caddy/stable/deb/debian any-version main" | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
安装过程中会有一个要求确认的选项,直接按Y确认即可。
配置
有关Caddyfile的编写可以参阅此文档链接。
1
sudo vim /etc/caddy/Caddyfile
我采用的示例配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 支持多域名绑定
<绑定到该服务器的域名1>,<绑定到该服务器的域名2> {
# 显式指定 TLS 协议版本(避免旧客户端协商失败)
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
# key_type 可选:ed25519, rsa2048, rsa4096, ecdsa_p256, ecdsa_p384
}
# 反向代理到本地 13000 端口的 HTTP 服务
reverse_proxy localhost:13000 {
header_up Host {host} # 传递原始域名
header_up X-Real-IP {remote} # 传递客户端 IP
}
# 可选:强制 HTTP 跳转 HTTPS(若需要)
@http {
protocol http
}
redir @http https://{host}{uri} permanent
}
# 指定本地12345端口监听的反向代理
:12345 {
tls {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
}
reverse_proxy localhost:13000
}
Caddy会自动申请、绑定、管理并续期这些证书。公签证书颁发的CA是Let's Encrypt这一免费SSL证书颁发机构,为开发者提供免费的HTTPS证书。
本地自签证书,适用内网服务器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 支持多域名绑定
<绑定到该服务器的域名1>,<绑定到该服务器的域名2> {
# 显式指定 TLS 协议版本(避免旧客户端协商失败)
tls internal {
protocols tls1.2 tls1.3
ciphers TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
# key_type 可选:ed25519, rsa2048, rsa4096, ecdsa_p256, ecdsa_p384
}
# 反向代理到本地 13000 端口的 HTTP 服务
reverse_proxy localhost:13000 {
header_up Host {host} # 传递原始域名
header_up X-Real-IP {remote} # 传递客户端 IP
}
# 可选:强制 HTTP 跳转 HTTPS(若需要)
@http {
protocol http
}
redir @http https://{host}{uri} permanent
}
配置完毕后,使用以下命令重载配置:
1
sudo caddy reload --config /etc/caddy/Caddyfile
如果有WARNING提示Caddyfile配置格式有误,可以用命令自动修正配置文件格式:
1
sudo caddy fmt --overwrite /etc/caddy/Caddyfile
重载配置后,可以通过以下命令查看自动申请的TLS证书:
1
sudo ls /var/lib/caddy/.local/share/caddy/certificates/
如果使用的是自签证书,则需要使用caddy trust命令在本机信任内部CA根证书,然后在/var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt下找到获取信任的CA根证书,并分发给内网其他客户端。
Caddy默认的内部CA证书的有效期是10年,注意定时更换。
Linux客户端注册CA根证书的方法
- 基本证书注册
Linux默认的系统级CA根证书存储路径有2个:
1
2
/usr/share/ca-certificates
/usr/local/share/ca-certificates
将CA根证书拷贝到客户端的以上两个任一目录下,然后执行以下命令即可注册证书:
1
sudo update-ca-certificates
然后在.bashrc或者.zshrc中添加以下内容:
1
2
3
export PATH="$PATH:/usr/sharc/ca-certificates:/usr/local/share/ca-certificates"
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
- Anaconda环境信任
如果涉及Anaconda环境的终端,使用以下命令信任(以llmapi_ca.crt为例):
1
sudo cat /usr/share/ca-certificates/llmapi_ca.crt >> /home/wfy/anaconda3/ssl/cacert.pem
- Chromium浏览器信任
如果Edge等基于Chromium的浏览器仍然不信任证书,使用以下命令更新NSS库导入解决(以llmapi_ca.crt为例):
1
2
sudo apt install libnss3-tools
certutil -d sql:$HOME/.pki/nssdb -A -t "C,," -n "LLMAPI CA" -i /usr/share/ca-certificates/llmapi_ca.crt
- 全局信任 编辑
/etc/ca-certificates.conf,添加一行:
1
llmapi_ca.crt
然后运行:
1
sudo update-ca-certificates --fresh
这么做有一个副作用,就是会将系统之前信任的~/.ssh/authorized_keys被清空,遇到这种情况如果手头还有私钥,可以用ssh-keygen命令重新计算公钥并信任:
1
2
3
cd ~/.ssh/
ssh-keygen -y -f ./id_rsa > id_rsa.pub
cat ./id_rsa.pub > authorized_keys
需要在云服务器提供商的防火墙及UFW中放通80和443端口才能正常申请TLS证书,否则在使用https访问的时候将出现访问失败的情况,因为CA在验证域名所有权的时候会检查目标服务器的80/443端口是否开放,如果验证失败就不会签发证书。
dynv6.com + ddclient: 支持DDNS的免费域名
dynv6.com是一个提供免费三级域名的域名服务商,可以在上面快速创建自己的三级域名并且添加DNS解析记录,网站操作很简单,这里不再赘述。 在Linux下,dynv6支持通过利用ddclient来实现自动更新DDNSv6域名,实现IPv6下的纯公网域名免备案访问。
安装ddclient
ddclient的安装需要先添加PPA源,参考官方PPA源里给出的命令:
1
2
3
sudo add-apt-repository ppa:ddclient/ppa
sudo apt update
sudo apt install ddclient -y
配置ddclient
可以参考ddclient文档进行配置。支持绑定某个网卡并自动获取其上的IP并推送到dynv6。使用的配置文件/etc/ddclient.conf如下,其中的password字段需要参考dynv6官网你的域名Zone的Instructions选项卡下的内容,每个账户的password值是恒定的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf
protocol=dyndns2 \
usev4=ifv4, if=enp3s0 \
usev6=ifv6, if=wlp4s0 \
server=dynv6.com \
ssl=yes \
login=none \
password='<password>' \
xxx.dynv6.net
protocol=dyndns2 \
usev4=ifv4, if=wlp4s0 \
usev6=ifv6, if=wlp4s0 \
server=dynv6.com \
ssl=yes
login=none \
password='<password>' \
xxx.dynv6.net
编辑完成后保存,使用sudo ddclient手动更新,但是在ddclient安装完毕后会启动一个每5分钟自动更新的服务,所以一般不太需要手动更新。
ddclient只支持使用sudo权限执行,且
/etc/ddclient.conf的权限配置必需为600,其他用户不可有权限,否则无法使用。
