第一步:创建用户组和设置目录结构
1. 创建 SSL 证书存储目录
sudo mkdir -p /etc/ssl/shared_certs/
sudo mkdir -p /etc/ssl/shared_certs/live/ # 存储当前证书
sudo mkdir -p /etc/ssl/shared_certs/archive/ # 可选:存储历史证书备份
2. 创建专门管理 SSL 证书的用户组
sudo groupadd ssl-users
3. 查看需要访问证书的用户(以常见Web服务为例)
假设你的系统有以下用户需要访问证书:
- nginx 或 apache 的运行用户(通常是 www-data, nginx, 或 apache)
- 其他需要访问证书的应用程序用户
4. 将相关用户添加到 ssl-users 组
例如,如果你的 Nginx 运行用户是 www-data
sudo usermod -aG ssl-users www-data
如果有其他用户也需要访问,如 app-user, deploy-user 等
sudo usermod -aG ssl-users app-user
sudo usermod -aG ssl-users deploy-user
第二步:设置目录权限
1. 设置目录所有者和权限
sudo chown root:ssl-users /etc/ssl/shared_certs/
sudo chown root:ssl-users /etc/ssl/shared_certs/live/
2. 设置目录权限:root可读写执行,组成员可读执行,其他人无权限
sudo chmod 750 /etc/ssl/shared_certs/
sudo chmod 750 /etc/ssl/shared_certs/live/
3. 确保新文件继承父目录的组设置
sudo chmod g+s /etc/ssl/shared_certs/live/
第三步:使用 acme.sh 申请和安装证书
1. 首先申请证书(假设域名是 example.com)
这里使用 DNS 验证方式(以 Cloudflare 为例),你可以选择适合你的验证方式
export CF_Key="your_cloudflare_api_key"
export CF_Email="your_email@example.com"
acme.sh --issue --dns dns_cf -d example.com -d "*.example.com" # 包含通配符证书
2. 安装证书到共享目录
acme.sh --install-cert -d example.com \
--cert-file /etc/ssl/shared_certs/live/example.com/cert.pem \
--key-file /etc/ssl/shared_certs/live/example.com/privkey.pem \
--fullchain-file /etc/ssl/shared_certs/live/example.com/fullchain.pem \
--reloadcmd "systemctl reload nginx" # 根据你的服务修改
注意:你可能需要先为每个域名创建子目录:
sudo mkdir -p /etc/ssl/shared_certs/live/example.com/
sudo chown root:ssl-users /etc/ssl/shared_certs/live/example.com/
sudo chmod 750 /etc/ssl/shared_certs/live/example.com/
第四步:设置证书文件权限
进入证书目录
cd /etc/ssl/shared_certs/live/example.com/
设置文件所有者为 root,所属组为 ssl-users
sudo chown root:ssl-users *.pem
设置权限:所有者可读写 (6),组成员可读 (4),其他人无权限 (0)
sudo chmod 640 *.pem
验证权限设置
ls -la
应该看到类似这样的输出:
-rw-r----- 1 root ssl-users 1234 cert.pem
-rw-r----- 1 root ssl-users 5678 privkey.pem
-rw-r----- 1 root ssl-users 9012 fullchain.pem
第五步:创建便捷的符号链接(可选但推荐)
为了让配置更灵活,可以创建标准化的符号链接:
在共享目录中创建标准化的证书文件名
cd /etc/ssl/shared_certs/live/example.com/
sudo ln -sf fullchain.pem cert.pem
sudo ln -sf privkey.pem key.pem
这样,服务配置可以直接引用:
ssl_certificate: /etc/ssl/shared_certs/live/example.com/cert.pem
ssl_certificate_key: /etc/ssl/shared_certs/live/example.com/key.pem
第六步:验证配置
1. 验证组成员权限
切换到某个 ssl-users 组成员(如 www-data)并尝试读取证书
sudo -u www-data cat /etc/ssl/shared_certs/live/example.com/fullchain.pem
如果没有权限错误,表示配置成功
2. 验证非组成员无法访问
创建一个非组成员用户
sudo useradd testuser
尝试读取证书
sudo -u testuser cat /etc/ssl/shared_certs/live/example.com/fullchain.pem
这应该会显示 "Permission denied"
3. 验证 acme.sh 的安装信息
acme.sh --info -d example.com
确认输出中显示了正确的安装路径
第七步:在 Web 服务器中配置使用
Nginx 配置示例:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/shared_certs/live/example.com/fullchain.pem;
ssl_certificate_key /etc/ssl/shared_certs/live/example.com/privkey.pem;
# ... 其他配置 ...}
Apache 配置示例:
ServerName example.com
SSLEngine on
SSLCertificateFile /etc/ssl/shared_certs/live/example.com/cert.pem
SSLCertificateKeyFile /etc/ssl/shared_certs/live/example.com/privkey.pem
SSLCertificateChainFile /etc/ssl/shared_certs/live/example.com/fullchain.pem
# ... 其他配置 ...第八步:扩展到多个域名
对于多个域名,重复类似步骤即可:
1. 为第二个域名创建目录
sudo mkdir -p /etc/ssl/shared_certs/live/another-domain.com/
sudo chown root:ssl-users /etc/ssl/shared_certs/live/another-domain.com/
sudo chmod 750 /etc/ssl/shared_certs/live/another-domain.com/
2. 申请并安装第二个证书
acme.sh --issue -d another-domain.com --dns dns_cf
acme.sh --install-cert -d another-domain.com \
--cert-file /etc/ssl/shared_certs/live/another-domain.com/cert.pem \
--key-file /etc/ssl/shared_certs/live/another-domain.com/privkey.pem \
--fullchain-file /etc/ssl/shared_certs/live/another-domain.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
自动化脚本(可选)
创建安装脚本简化操作:
!/bin/bash
install_cert_shared.sh
DOMAIN=$1
CERT_DIR="/etc/ssl/shared_certs/live/$DOMAIN"
创建目录
sudo mkdir -p "$CERT_DIR"
sudo chown root:ssl-users "$CERT_DIR"
sudo chmod 750 "$CERT_DIR"
申请证书
acme.sh --issue -d "$DOMAIN" --dns dns_cf
安装证书
acme.sh --install-cert -d "$DOMAIN" \
--cert-file "$CERT_DIR/cert.pem" \
--key-file "$CERT_DIR/privkey.pem" \
--fullchain-file "$CERT_DIR/fullchain.pem" \
--reloadcmd "systemctl reload nginx"
设置文件权限
sudo chown root:ssl-users "$CERT_DIR"/*.pem
sudo chmod 640 "$CERT_DIR"/*.pem
权限问题排错
如果遇到权限问题,检查:
1. 检查目录和文件权限
ls -la /etc/ssl/shared_certs/
ls -la /etc/ssl/shared_certs/live/example.com/
2. 检查用户所属组
groups www-data
应该能看到 ssl-users
3. 检查 SELinux 或 AppArmor(如果启用)
SELinux
ls -Z /etc/ssl/shared_certs/
如果有问题,可以调整上下文
sudo chcon -R -t httpd_sys_content_t /etc/ssl/shared_certs/
4. 重新加载用户组(如果刚添加用户到组)
注意:用户需要重新登录才能使新的组生效
对于服务用户,可能需要重启服务
sudo systemctl restart nginx
这个方案B提供了细粒度的权限控制,只有
"ssl-users" 组的成员才能访问证书文件,既保证了安全,又实现了多用户共享。