我设法在 Win 上设置了 SVN(通过 SSL)服务器和 TortoiseSVN 客户端。
我为测试项目制作了一个 Post-Commit Hook。Post-Commit 将更新 Web 目录,以便 PHP 中的应用程序可以使用最新版本执行。
通过 shell 完成时一切都正常。唯一的问题是,当我在 Win 中通过客户端提交更改时,更改已提交,但 HOOK 会抛出错误
post-commit hook failed (exit code 1) with output:
Error validating server certificate for 'https://SERVER_IP:443':
- The certificate is not issued by a trusted authority. Use the
fingerprint to validate the certificate manually!
- The certificate hostname does not match.
Certificate information:
- Hostname: DEVSRVR
- Valid: from Fri, 28 Jan 2011 09:22:45 GMT until Sat, 28 Jan 2012 09:22:45 GMT
- Issuer: PHP, SS, SS, SRB
- Fingerprint: 5f:d0:50:d6:dd:a6:d4:64:a5:ac:3a:4b:7c:7d:33:e3:75:dd:23:9f
(R)eject, accept (t)emporarily or accept (p)ermanently? svn: OPTIONS of 'https://SERVER_IP/svn/myproject/trunk': Server certificate verification failed: certificate issued for a different hostname, issuer is not trusted (https://SERVER_IP)
答案1
这是 SVN 使用不受信任的证书时的默认行为。请查看“使用 Subversion 进行版本控制“。
如果客户端收到服务器证书,则需要验证它是否信任该证书:服务器是否确实是它所声称的那个服务器?OpenSSL 库通过检查服务器证书的签名者或认证机构 (CA) 来执行此操作。如果 OpenSSL 无法自动信任 CA,或者发生其他问题(例如证书过期或主机名不匹配),Subversion 命令行客户端将询问您是否要信任该服务器证书。
这个对话框看起来很熟悉;它本质上和你可能在 Web 浏览器(它只是另一个 HTTP 客户端,如 Subversion)中看到的问题相同。如果你选择 (p)ermanent 选项,服务器证书将缓存在你的私有运行时 auth/ 区域中,就像缓存你的用户名和密码一样(请参阅“客户端凭据缓存”一节)。如果缓存了,Subversion 将在以后的协商中自动信任此证书。
看起来解决方案是手动运行它并让它永久接受证书或ssl-trust-default-ca
在配置中将其设置为 true。
许多 OpenSSL 安装还具有一组预定义的“默认”CA,这些 CA 几乎受到普遍信任。要使 Subversion 客户端自动信任这些标准颁发机构,请将 ssl-trust-default-ca 变量设置为 true。
答案2
正如@runlevel6 所说,您必须接受运行钩子的同一用户的证书。
如果由于某种原因您有权编辑钩子但无权以此用户身份运行命令,请尝试将钩子中的 svn 命令临时更改为:
echo "p" | svn command_that_shows_the_error
如果钩子中没有明确的 svn 命令,请使用以下命令:
echo "p" | svn info http://repositoryurl
然后运行一次,让它永久接受证书。我不得不这样做一次,因为 cron 作业删除了身份验证缓存,但它成功了。