2024年9月25日更新,推荐使用1panel面板管理docker及证书
1panel负责,证书注册,共享证书文件给xui容器,签发证书后脚本重启xui容器(docker restart xui容器名)

下文仅供参考

acme介绍可参见docker-acme-nginx实现服务https证书自动化 嫌麻烦也可以使用lucky,使用lucky进行ddns、端口转发、https证书acme续签

安装acme.sh

使用docker 安装(推荐)

version: '3.4'  
services:  
  acme.sh:  
    image: neilpang/acme.sh  
    container_name: acme.sh      
    command: daemon  
    restart: unless-stopped  
    volumes:  
      - ./acme.sh:/acme.sh  
      - /var/run/docker.sock:/var/run/docker.sock # 映射宿主机的docker通信,acme.sh会用此来通知docker守护服务重启nginx服务  
      - ./certs:/certs  
    environment:  
      - CF_Key=9afxxxxb941344  
      - CF_Email=demo@foxmail.com  
      # 指定acme.sh部署证书文件位置,相关的配置里要同步    
      - DEPLOY_DOCKER_CONTAINER_LABEL=your_label_name  
      - DEPLOY_DOCKER_CONTAINER_KEY_FILE="/certs/key"  
      - DEPLOY_DOCKER_CONTAINER_CERT_FILE="/certs/cert"  
      - DEPLOY_DOCKER_CONTAINER_CA_FILE="/certs/ca.pem"  
      - DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE="/certs/fullchain"  
      # 到期续签新证书之后,acme.sh会通知docker守护进程执行自定义的指令如重启x-ui或相关    
      - DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="docker restart x-ui"  
  
  x-ui:  
    image: enwaiax/x-ui:alpha-zh  
    container_name: x-ui  
    #image: enwaiax/x-ui:latest  
    volumes:  
      - ./xui-db/:/etc/x-ui/  
      - /var/run/docker.sock:/var/run/docker.sock  
      - ./certs:/certs  
    #ports:  
    #  - 54321:54321  
    restart: unless-stopped  
    labels:  
      - your_label_name  
    network_mode: host  
  
networks:  
  web:

宿主机直接安装

下载acme.sh

apt-get install -y socat curl

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

申请证书

注册账号

可以是真邮箱也可以是假邮箱

docker exec acme.sh --register-account -m xxxx@gmail.com

~/.acme.sh/acme.sh --register-account -m xxxx@gmail.com
zeroSSL

2024年9月18日,zeroSSL有限制,导致默认的证书无法申请。需要手动改一下默认服务:

#切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
#切换 Buypass
acme.sh --set-default-ca --server buypass
#切换 ZeroSSL
acme.sh --set-default-ca --server zerossl
#切换 SSL.com
acme.sh --set-default-ca --server ssl.com
#切换 Google Public CA
acme.sh --set-default-ca --server google

1. dns校验

注意

2024年5月实践,acme现在默认签发的ecc证书,在x-ui可能用不了,如果要签发之前的格式可以指定参数-k: docker: docker exec acme.sh --issue --dns dns_cf -d rn.12345.xyz -k 2048

宿主机:

acme.sh --issue --accountconf ~/.acme.sh/account.conf --server letsencrypt --dns dns_cf -d demo.com -d *.demo.com -k ec-384 --debug
 
# --accountconf ~/.acme.sh/account.conf可选
# --server指定签发商,现在默认是zerossl.com
# --dns 指定dns管理方
# -d 指定证书中需要包含的域名信息
# -k 指定密钥类型,这里使用了 ECDSA 算法,P-384 类型的密钥,默认ECC
# --debug 是为了打印详细日志,方便出错时排查
# 填写通配符域名必须同时填写一个子域名或者主域名,给x-ui使用的话,不要用通配符域名,会选不到文件夹

默认公私钥位置(fullchain.cer才是要用到的完整证书链)

/root/.acme.sh/demo.com/fullchain.cer
/root/.acme.sh/demo.com/demo.com.key
可选1,使用cloudflare api进行dns挑战验证,但是cloudflare api不支持垃圾后缀的域名
export CF_Key="9axxxx1344"
export CF_Email="a@b.com"
acme.sh --issue --dns dns_cf -d *.demo.com -d demo.com

Cloudflare 的API 不技持 .cf, .ga, .gq, .ml, or .tk 的域名申请证书。 Cloudflare 的API 不技持 .cf, .ga, .gq, .ml, or .tk 的域名申请证书。 Cloudflare 的API 不技持 .cf, .ga, .gq, .ml, or .tk 的域名申请证书。

“message”: “You cannot use this API for domains with a .cf, .ga, .gq, .ml, or .tk TLD (top-level domain). To configure the DNS settings for this domain, use the Cloudflare Dashboard.” 来自 <https://gcsee.com/?p=954>

可选2,使用he.net的dns服务进行dns挑战验证,支持垃圾后缀的域名(支持cf、ga、gq、ml,不支持tk)

Hurricane Electric ( https://dns.he.net/) doesn’t have an API so just set your login credentials like so:

export HE_Username="你的usename"
export HE_Password="你的he密码"
# Then you can issue your certificate:
~/.acme.sh/acme.sh --issue --dns dns_he -d 1984free.cf -d *.1984free.cf

来自 <https://github.com/acmesh-official/acme.sh/wiki/dnsapi#31-use-hurricane-electric>

可选3 godaddy.com
export GD_Key="gHfxxGsFizAxu"
export GD_Secret="ZWuu7BA"
acme.sh --issue --dns dns_cf -d *.demo.com -d demo.com

./acme.sh —issue —dns dns_gd -d example.com -d www.example.com GD_Key and GD_Secret 将保存在~/.acme.sh/account.conf中,需要时将被重用。 来自 <https://github.com/acmesh-official/acme.sh/wiki/dnsapi>

2. http校验(续期时会占用80端口,可能会端口冲突,不推荐)

~/.acme.sh/acme.sh --issue  -d go.demo.com -d admin.demo.com --standalone

如果装了nginx,那么去代理80端口,并添加配置,用于代理acme的http挑战:

server {
	listen 80;
	listen [::]:80;
	server_name example.com;
	location /.well-known/acme-challenge {
		root /var/www/acme-challenge;
	}
	location / {
		rewrite ^/(.*)$ [https://$host/$1](https://$host/$1) permanent;
	}
}

acme申请证书时,加上参数指定挑战目录 -w /var/www/acme-challenge

3. 单独部署

申请完成后,可以把证书部署到指定目录。

可选,把证书安装到指定文件夹

如果是docker部署:

docker exec acme.sh --deploy -d rn.12345.xyz --deploy-hook docker
# 部署证书到指定为止,并触发docker钩子函数,用于重启依赖证书的服务
# 重启相关容器:docker restart 你的相关容器名,或者docker-compose down && docker-compose up -d。
# 之后每60天acme会自动续期证书,续期完成后会重启你的相关服务(不重启新证书不生效)。

此时公私钥路径是docker-compose.yml里指定的路径。

如果是宿主机部署:

mkdir ./certs
docker exec acme.sh --install-cert -d demo.com \
--cert-file      /certs/cert  \
--key-file       /certs/key  \
--fullchain-file /certs/fullchain.key \
--reloadcmd     "systemctl restart x-ui"

此时公私钥路径

/root/acme-keys/demo.com.cert.crt
/root/acme-keys/demo.com.private.key

x-ui

数据备份与迁移

面板所有数据包括账号信息等都存在 /etc/x-ui/x-ui.db 中,只要备份此文件即可。在新服务器安装了面板之后,先关闭面板,再将备份的文件覆盖新安装的,最后启动面板即可。

服务器的同样的路径下有相同的证书文件,否则将无法在新服务器启动面板。同样的,若配置了 为途锐 的tls,并且使用了证书文件配置,也要确保新服务器有证书文件,否则将无法启动 为途锐,若使用证书内容配置,则无需关心。

忘记用户名和密码

使用以下命令重置用户名和密码,默认都为 admin

/usr/local/x-ui/x-ui resetuser

面板设置修改错误导致面板无法启动

使用以下命令重置所有面板设置,默认面板端口修改为 54321,其它的也会重置为默认值,注意,这个命令不会重置用户名和密码。

/usr/local/x-ui/x-ui resetconfig