Debian OpenSSL CA 根证书与 Apache HTTPS 配置
1. 服务介绍
本篇在 Debian 上创建实验 CA 根证书,使用 CA 为 Apache 网站签发服务器证书,再启用 HTTPS、HTTP 到 HTTPS 重定向和 WordPress/Web 站点。CA 负责签发与验证证书,Apache 负责提供 Web 服务,NFS/MariaDB 等后端按实际拓扑独立部署。
实验目标:
• CA 根证书保存到/csk-rootca/csk-ca.pem。
• 根 CA Subject 使用CSK Global Root CA,服务证书使用*.chinaskills.cn。
• Apache 使用 CA 签发的证书提供 443 HTTPS,并把 HTTP 请求重定向到 HTTPS。
• 客户端导入根 CA 后访问站点不出现信任警告。
• Apache 以受限用户运行,站点根目录使用/webdata,隐藏版本信息。
2. 准备运行环境
• 操作系统:Debian Linux,已安装 OpenSSL、Apache2;生产系统使用受支持版本。
• 权限:root 或 sudo 管理账号;CA 私钥只允许 root 读取。
• 域名:www.chinaskills.cn,服务证书 SAN 必须包含实际访问域名。
• 角色:CA 主机、Apache Web 主机、客户端;CA 与申请者可以是同一台,也可以分离。
• 证书目录:根 CA 公钥路径/csk-rootca/csk-ca.pem;私钥使用独立受限目录。
• 后端:若/webdata来自 StorageSrv NFS,先验证 NFS 挂载;WordPress 数据库可放在独立 MariaDB 主机。
• 网络:TCP 80、443;CA 与申请者之间使用安全传输方式,不直接暴露私钥。
3. 相关知识与注意点
• 根 CA 私钥是信任体系核心。丢失或泄露会影响所有已签发证书;生产环境使用离线根 CA、颁发 CA、加密备份和严格权限。
• 客户端需要信任根 CA 公钥;Apache 需要服务器证书和对应私钥。不要把 CA 私钥复制到 Web 服务器。
• Subject CN 不能替代 SAN。现代浏览器按 SAN 校验域名,证书必须包含www.chinaskills.cn或适用通配符。
•CA.pl依赖 OpenSSL 配置和工作目录;批量环境建议使用明确的 openssl.cnf 和独立 CA 数据目录,避免误用其他 CA 状态文件。
• 证书申请文件 CSR 可以跨主机传递,私钥不应离开申请主机;签名完成后只传回证书和必要的 CA 链。
• Apache TLS 配置修改后先apachectl configtest,再 reload;证书验证同时看 SAN、有效期、Issuer、私钥匹配和客户端信任。
• Apache 版本隐藏只能减少信息泄露,不能替代更新、最小权限、访问控制和安全响应头。
4. 实验步骤
4.1 安装 OpenSSL 和 Apache
apt update apt install -y openssl apache2 systemctl enable --now apache2 openssl version apachectl -v如果需要重做实验 CA,先备份旧目录和 CA 数据库,再清理;不要在生产 CA 上直接执行删除命令:
mv /csk-rootca /csk-rootca.backup.$(date +%F-%H%M%S) 2>/dev/null || true4.2 创建 CA 根证书
创建受限目录:
install -d -o root -g root -m 0700 /csk-rootca install -d -o root -g root -m 0700 /csk-rootca/private使用 Debian OpenSSL 辅助脚本创建 CA:
cd /csk-rootca /usr/lib/ssl/misc/CA.pl -newca交互输入时设置:
Common Name:CSK Global Root CA Country:CN State:China Locality:BeiJing Organization:skills Organizational Unit:Operations DepartmentsCA 会生成数据库、序列号、私钥和根证书。根证书只读分发:
install -m 0644 demoCA/cacert.pem /csk-rootca/csk-ca.pem chmod 0600 demoCA/private/cakey.pem openssl x509 -in /csk-rootca/csk-ca.pem -noout -subject -issuer -dates -fingerprint -sha256原实验 CA 初始化截图:
4.3 生成服务器密钥和 CSR
在 Apache 申请主机生成私钥,私钥不传给 CA:
install -d -o root -g root -m 0750 /etc/apache2/ssl openssl genrsa -out /etc/apache2/ssl/www.chinaskills.cn.key 2048 chmod 0600 /etc/apache2/ssl/www.chinaskills.cn.key创建包含 SAN 的 CSR 配置:
cat >/etc/apache2/ssl/www.chinaskills.cn.cnf <<'EOF' [req] distinguished_name = req_distinguished_name req_extensions = req_ext prompt = no [req_distinguished_name] C = CN ST = China L = BeiJing O = skills OU = Operations Departments CN = www.chinaskills.cn [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = www.chinaskills.cn DNS.2 = *.chinaskills.cn EOF openssl req -new \ -key /etc/apache2/ssl/www.chinaskills.cn.key \ -out /etc/apache2/ssl/www.chinaskills.cn.csr \ -config /etc/apache2/ssl/www.chinaskills.cn.cnf4.4 把 CSR 交给 CA 签名
CA 与申请者同机时,把 CSR 放到 CA 工作目录;分离部署时只传 CSR:
scp /etc/apache2/ssl/www.chinaskills.cn.csr \ root@CA_HOST:/tmp/www.chinaskills.cn.csrCA 端签名:
cd /csk-rootca cp /tmp/www.chinaskills.cn.csr newreq.pem /usr/lib/ssl/misc/CA.pl -sign确认签发者、主题、SAN 和有效期:
openssl x509 -in newcert.pem -noout -subject -issuer -dates -ext subjectAltName install -m 0644 newcert.pem /tmp/www.chinaskills.cn.crt把服务器证书传回 Apache 主机:
scp /tmp/www.chinaskills.cn.crt root@APACHE_HOST:/etc/apache2/ssl/根 CA 公钥分发给客户端:
install -m 0644 /csk-rootca/csk-ca.pem /safe/share/csk-ca.pem4.5 配置 Apache HTTPS 和 HTTP 重定向
启用 SSL 模块和站点:
a2enmod ssl headers rewrite a2ensite default-ssl.conf创建站点配置/etc/apache2/sites-available/www.chinaskills.cn.conf:
<VirtualHost *:80> ServerName www.chinaskills.cn DocumentRoot /webdata Redirect permanent / https://www.chinaskills.cn/ </VirtualHost> <VirtualHost *:443> ServerName www.chinaskills.cn DocumentRoot /webdata SSLEngine on SSLCertificateFile /etc/apache2/ssl/www.chinaskills.cn.crt SSLCertificateKeyFile /etc/apache2/ssl/www.chinaskills.cn.key <Directory /webdata> Options -Indexes AllowOverride None Require all granted </Directory> ServerTokens Prod ServerSignature Off Header always set X-Content-Type-Options nosniff </VirtualHost>启用站点并检查:
a2ensite www.chinaskills.cn.conf apachectl configtest systemctl reload apache2原实验 Apache TLS 和 CA 信任截图:
4.6 配置网站目录和后端
创建站点目录:
install -d -o webuser -g www-data -m 0750 /webdata printf '%s\n' "This is the front page of CSK's website" >/webdata/index.html chown webuser:www-data /webdata/index.html chmod 0640 /webdata/index.html如果/webdata来自 StorageSrv NFS,先确认挂载:
findmnt /webdata showmount -e STORAGE_HOST mount -t nfs STORAGE_HOST:/webdata /webdataWordPress 数据库密码只使用占位符,实际密码通过安全凭据传递:
apt install -y wordpress php libapache2-mod-php php-mysql cp -R /usr/share/wordpress/* /webdata/ chown -R webuser:www-data /webdata/编辑wp-config.php时使用独立数据库账号,不使用 MariaDB root 账号;站点目录和数据库权限分离。
5. 验证结果
5.1 CA 和服务器证书
openssl x509 -in /csk-rootca/csk-ca.pem -noout -subject -issuer -dates openssl x509 -in /etc/apache2/ssl/www.chinaskills.cn.crt -noout -subject -issuer -dates -ext subjectAltName openssl verify -CAfile /csk-rootca/csk-ca.pem /etc/apache2/ssl/www.chinaskills.cn.crt预期:服务器证书 Issuer 为实验 CA,SAN 包含访问域名,验证结果为OK。
5.2 Apache、HTTP 和 HTTPS
apachectl configtest systemctl is-active apache2 ss -lntp | grep -E ':80|:443' curl -I http://www.chinaskills.cn/ curl --cacert /csk-rootca/csk-ca.pem -I https://www.chinaskills.cn/ openssl s_client -connect www.chinaskills.cn:443 \ -servername www.chinaskills.cn \ -CAfile /csk-rootca/csk-ca.pem </dev/null预期:HTTP 返回 301/302 到 HTTPS;带 CA 文件访问 HTTPS 不出现信任错误;Apache 日志无持续 TLS 或权限错误。
5.3 网站、LDAP、Samba 和 VPN
curl --cacert /csk-rootca/csk-ca.pem https://www.chinaskills.cn/ ldapsearch -x -H ldap://LDAP_HOST -b 'dc=chinaskills,dc=cn' '(objectClass=*)' dn smbclient -L //STORAGE_HOST -U user01 systemctl is-active vsftpd systemctl is-active openvpn-server@server ip addr show tun0 ip route客户端继续验证:HTTPS 证书链、LDAP 组认证、Samba 上传下载、FTP Chroot 和 OpenVPN 地址池。
6. 常见问题排查
• **证书验证失败**:检查 CA 文件、Issuer、SAN、有效期、私钥和客户端信任;不要把服务器证书当根 CA。
• **Apache 启动失败**:执行apachectl configtest,检查证书路径、私钥权限、站点语法和 443 端口冲突。
• **HTTP 不跳转 HTTPS**:确认 80 站点绑定、Redirect 指令和站点启用状态。
• **浏览器仍有警告**:确认客户端导入正确 CA、访问域名匹配 SAN、系统时间正确;不要用忽略证书错误代替修复。
• **NFS 网站目录不可访问**:检查挂载、NFS 服务器导出规则、UID/GID 和 Apache 用户权限。
• **LDAP 认证失败**:先用ldapsearch验证连接和 Base DN,再检查 Apache LDAP filter、账号密码和 TLS。
• **Samba 权限异常**:检查目录属主、SGID/sticky bit、smb.conf、Samba 用户数据库和客户端缓存凭据。
• **OpenVPN 连接后内网不通**:检查ip_forward、路由、NAT、FORWARD 规则和地址池冲突。
• **私钥泄露风险**:立即停止继续分发,撤销相关证书并重新签发;私钥只保存在受限目录。