SVN本身不原生支持SSL双向认证,真正起作用的是Apache的mod_ssl模块,通过SSLVerifyClient require强制客户端提供受信任CA签发的证书,并用SSLUserName SSL_CLIENT_S_DN_CN将证书CN映射为SVN用户名,实现强身份绑定与零信任访问控制。

SVN本身不原生支持SSL双向认证(即客户端证书校验),它依赖底层HTTP服务器(如Apache)来实现。真正起作用的是Apache的mod_ssl模块,而非SVN客户端或服务端逻辑。所谓“SVN基于SSL双向认证”,本质是在Apache + mod_dav_svn架构下,强制要求客户端提供并验证受信任CA签发的客户端证书。这能杜绝密码爆破、凭据盗用等常见风险,适用于金融、政务等强合规场景。
一、确认基础环境已就绪
确保以下组件已正确安装并协同工作:
- Apache HTTP Server(启用
mod_ssl、mod_dav、mod_dav_svn) - OpenSSL(用于生成CA、服务端证书、客户端证书)
- Subversion(通过
mod_dav_svn模块暴露为WebDAV资源) - 所有证书使用至少RSA 2048位或ECDSA P-256,禁用SSLv3及TLS 1.0
⚠️ 注意:VisualSVN Server 4.4+ 支持GUI配置双向认证,但底层仍是Apache;自编译部署需手动编辑配置。
二、构建可信证书体系(CA + 服务端 + 客户端)
所有证书必须由同一私有CA签发,不可混用Let’s Encrypt等公有CA(因其不签发客户端证书)。
1. 初始化私有CA
mkdir -p /etc/ssl/private-ca/{certs,crl,newcerts,private}
chmod 700 /etc/ssl/private-ca/private
touch /etc/ssl/private-ca/index.txt
echo 1000 > /etc/ssl/private-ca/serial
openssl genrsa -aes256 -out /etc/ssl/private-ca/private/ca.key 4096
openssl req -x509 -new -nodes -key /etc/ssl/private-ca/private/ca.key \
-sha256 -days 3650 -out /etc/ssl/private-ca/certs/ca.crt2. 签发服务端证书(供Apache使用)
openssl genrsa -out /etc/ssl/private-ca/private/svn-server.key 2048 openssl req -new -key /etc/ssl/private-ca/private/svn-server.key \ -out /etc/ssl/private-ca/certs/svn-server.csr openssl x509 -req -in /etc/ssl/private-ca/certs/svn-server.csr \ -CA /etc/ssl/private-ca/certs/ca.crt -CAkey /etc/ssl/private-ca/private/ca.key \ -CAcreateserial -out /etc/ssl/private-ca/certs/svn-server.crt -days 365 -sha256
3. 签发客户端证书(每人一张,绑定身份)
# 为开发人员alice生成 openssl genrsa -out /etc/ssl/private-ca/private/alice.key 2048 openssl req -new -key /etc/ssl/private-ca/private/alice.key \ -out /etc/ssl/private-ca/certs/alice.csr openssl x509 -req -in /etc/ssl/private-ca/certs/alice.csr \ -CA /etc/ssl/private-ca/certs/ca.crt -CAkey /etc/ssl/private-ca/private/ca.key \ -CAcreateserial -out /etc/ssl/private-ca/certs/alice.crt -days 365 -sha256 # 打包为PFX供Windows用户导入(含私钥+证书+CA) openssl pkcs12 -export -out /tmp/alice.pfx -inkey /etc/ssl/private-ca/private/alice.key \ -in /etc/ssl/private-ca/certs/alice.crt -certfile /etc/ssl/private-ca/certs/ca.crt
三、Apache配置强制双向认证
编辑Apache虚拟主机配置(如 /etc/httpd/conf.d/subversion.conf 或 VisualSVN 的 httpd.conf):
<Location /svn>
DAV svn
SVNParentPath /var/svn
SVNListParentPath on
# 启用SSL及双向认证
SSLEngine on
SSLCertificateFile /etc/ssl/private-ca/certs/svn-server.crt
SSLCertificateKeyFile /etc/ssl/private-ca/private/svn-server.key
SSLCACertificateFile /etc/ssl/private-ca/certs/ca.crt
SSLVerifyClient require
SSLVerifyDepth 2
# 将客户端证书CN映射为SVN用户名(关键!)
SSLUserName SSL_CLIENT_S_DN_CN
Require valid-user
# 可选:限制仅允许特定OU或Email字段的证书
# SSLRequire %{SSL_CLIENT_S_DN_OU} eq "Developers"
</Location>✅ 关键点:
SSLVerifyClient require是开启双向认证的核心指令;SSLUserName SSL_CLIENT_S_DN_CN让Apache把证书中的通用名(CN)自动当作HTTP认证用户名,无需额外配置.htpasswd。
四、客户端部署与验证
Windows(TortoiseSVN / VisualSVN Client)
- 双击
.pfx文件 → 导入到“当前用户 → 个人 → 证书”存储区 - 访问
https://svn.example.com/svn/repo时,浏览器或TortoiseSVN会自动选择该证书 - 若提示“无法验证证书链”,需将
ca.crt导入“受信任的根证书颁发机构”
Linux(命令行svn)
# 配置Subversion使用客户端证书 echo "[global]" >> ~/.subversion/server echo "ssl-client-cert-file = /path/to/alice.pem" >> ~/.subversion/server echo "ssl-client-cert-password = your-p12-password" >> ~/.subversion/server # 注意:.pem需含私钥+证书(可用openssl pkcs12 -in alice.pfx -clcerts -nokeys > alice.pem)
测试连接:
svn list https://svn.example.com/svn/myrepo --non-interactive # 成功返回目录列表即表示双向认证生效
五、运维与安全加固建议
-
证书吊销机制:维护CRL(证书吊销列表),Apache中添加
SSLCARevocationFile /etc/ssl/private-ca/crl.pem - 定期轮换:客户端证书有效期建议设为90–180天,配合自动化签发脚本
-
日志审计:启用Apache
CustomLog记录SSL_CLIENT_S_DN字段,用于追溯操作人 -
禁用密码回退:确保
AuthType None且未配置Basic Auth fallback,杜绝证书失效后降级为密码登录
双向认证不是“开箱即用”的功能,它牺牲了部分易用性,换来的是真实身份强绑定和通道级零信任。只要CA私钥保管得当、客户端证书分发可控,这套防线可有效抵御绝大多数中间人、凭证复用和未授权访问攻击。


















