我在将 Tortoise SVN 连接到我的 SVN 服务器时遇到了问题。第一次连接似乎超时(SVN 挂起约 20 秒),第二次(自动)尝试立即成功。也就是说,每次更新、提交、记录都需要很长时间,这让每个人都抓狂不已……
Linux 命令行客户端的相同 SVN 操作可立即执行。通过 Web 浏览器访问也没有任何延迟。
SVN 设置如下:SVN 服务器运行 CentOS 7、Apache 2.4.6 和 mod_dav_svn 1.7.14。配置了通过 SSL 进行访问。身份验证通过 Windows Server 2012 R2 上的 LDAP 完成。客户端(Windows 7 x64)运行 Tortoise 1.7.15 (x64)。
这是相关的 Apache 配置(已混淆...):
# Reduce LDAP cache to 30 seconds
LDAPCacheTTL 30
LDAPOpCacheTTL 30
<Location /svn>
DAV svn
SVNParentPath /var/svnrepo
SVNListParentPath on
AuthName "My Repository"
AuthType basic
AuthBasicProvider ldap
AuthLDAPURL "ldap://dc.mydomain.local/OU=Group of Users,OU=MyOU,DC=MyDomain,DC=local?sAMAccountName?sub?(objectClass=*)" NONE
AuthLDAPBindDN "CN=ServiceUser,OU=Group of Users,OU=MyOU,DC=MyDomain,DC=local"
AuthLDAPBindPassword "VERYSECRETPASSWORD"
# Require ldap group via Microsoft rule "LDAP_MATCHING_RULE_IN_CHAIN"
Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=SVN-Group,OU=Group of DomainLocalGroups,OU=MyOU,DC=MyDomain,DC=local
</Location>
启动 SVN 活动时,Apache 日志(ssl_error_log)如下:
[Wed Aug 26 07:48:14.560025 2015] [ssl:info] [pid 2310] [client 192.168.1.155:49316] AH01964: Connection to child 0 established (server svnserver.mydomain.local:443)
[Wed Aug 26 07:48:14.560563 2015] [ssl:debug] [pid 2310] ssl_engine_kernel.c(1878): [client 192.168.1.155:49316] AH02043: SSL virtual host for servername svnserver.mydomain.local found
现在 SVN 似乎挂了(时间戳为 14 秒)——当启用模块 reqtimeout 时,Apache 稍后会终止连接(我在此情况下禁用了它)。大约 20 秒后(时间戳为 36 秒),活动继续:
[Wed Aug 26 07:48:36.102214 2015] [ssl:debug] [pid 2310] ssl_engine_kernel.c(224): [client 192.168.1.155:49316] AH02034: Subsequent (No.2) HTTPS request received for child 0 (server svnserver.mydomain.local:443)
[Wed Aug 26 07:48:36.102267 2015] [authz_core:debug] [pid 2310] mod_authz_core.c(809): [client 192.168.1.155:49316] AH01626: authorization result of Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=SVN-Group,OU=Group of DomainLocalGroups,OU=MyOU,DC=MyDomain,DC=local: denied (no authenticated user yet)
[Wed Aug 26 07:48:36.102275 2015] [authz_core:debug] [pid 2310] mod_authz_core.c(809): [client 192.168.1.155:49316] AH01626: authorization result of <RequireAny>: denied (no authenticated user yet)
[Wed Aug 26 07:48:36.102334 2015] [authnz_ldap:debug] [pid 2310] mod_authnz_ldap.c(501): [client 192.168.1.155:49316] AH01691: auth_ldap authenticate: using URL ldap://dc.mydomain.local/OU=Group of Users,OU=MyOU,DC=MyDomain,DC=local?sAMAccountName?sub?(objectClass=*)
[Wed Aug 26 07:48:36.147960 2015] [ldap:debug] [pid 2310] util_ldap.c(372): AH01278: LDAP: Setting referrals to On.
[Wed Aug 26 07:48:36.154921 2015] [authnz_ldap:debug] [pid 2310] mod_authnz_ldap.c(593): [client 192.168.1.155:49316] AH01697: auth_ldap authenticate: accepting john.doe
ssl_access_log 和 ssl_request_log 从第 36 秒开始,从第 14 秒开始没有任何记录
对我来说,Tortoise SVN 似乎在没有凭据的情况下启动连接,或者没有使用 https (?),这会导致超时。第二个连接似乎使用了 https,但凭据错误,最后 Tortoise 使用正确的凭据进行连接,身份验证成功。
有什么想法吗?第 14 秒和第 36 秒之间发生了什么?我该如何防止它发生?;-)
谢谢,Florian
更新:我找到了一个解决方案(虽然我不太清楚原因是什么...):每次启动 Tortoise SVN(或 Windows svn 命令行客户端)时,我都会注意到防火墙上的活动:域控制器正在尝试访问多个服务器,例如 root-servers.net,它们似乎是 VERISIGN 服务器,用于检查 SSL 证书或查找新的根证书等(?)。这被防火墙阻止,因此 DC 需要花时间查看其备选服务器列表。
我们使用的是自签名证书,因此我首先尝试通过组策略将我们的 CA 证书注入 Windows 的证书管理中。这很有效(至少在删除所有身份验证信息后,SVN 没有抱怨未知 CA)。然而,20 秒的延迟仍然存在(并且 DC 仍在尝试联系 Verisign)。
最后,我尝试了本地 SVN 配置选项“ssl-authority-files”来静态传递 CA 证书,结果:延迟消失了!
即这会导致 20 秒的延迟:
svn list myrepo
这不是
svn list --config-option servers:global:ssl-authority-files=C:\temp\mycertificate.crt myrepo
这个解决方法需要在每个客户端上进行配置,这仍然有点令人遗憾,但至少它是一个解决方案......
我不确定 Windows 在验证证书时在做什么,也许它正在检查吊销或其他东西并等待超时(因为它无法联系 Verisign 和朋友)。不知道。
答案1
问题:在防火墙服务器上的命令行上调用 SVN 后,15 秒内没有任何可见的反应,然后程序退出并出现以下错误:
svn: E170013: 无法连接到 URL 为“SVN.REPOSITORY.REDACTED”的存储库
svn:E730054:运行上下文错误:远程主机强制关闭现有连接。
调查:对上述错误进行互联网研究并未发现任何相关信息。
进程跟踪 (procmon) 显示在与 SVN 服务器进行 SSL/TLS 握手后尝试连接 Akamai(云服务)服务器。进程跟踪中未显示服务器的主机名。反向 DNS 查找显示 a184-51-112-88.deploy.static.akamaitechnologies.com 或 a184-51-112-80.deploy.static.akamaitechnologies.com 为主机名,IP 为 184.51.112.88 或 184.51.112.80(DNS 缓存中有 2 个条目)。
数据包捕获工具 (MMA) 显示,与 SVN 服务器进行 SSL/TLS 握手后,尝试连接主机名 ctldl.windowsupdate.com。
Windows Crypto API 尝试连接到 Windows Update 以检索证书吊销信息(CRL - 证书吊销列表)。CRL 检索的默认超时时间为 15 秒。服务器上的身份验证超时时间为 10 秒;由于 15 大于 10,因此此操作失败。
解决:互联网研究发现了以下内容:(另见底部图片)
解决方案 1:减少 CRL 超时组策略 -> 计算机配置 ->Windows 设置 -> 安全设置 -> 公钥策略 -> 证书路径验证设置 -> 网络检索 - 参见下图。
https://subversion.open.collab.net/ds/viewMessage.do?dsForumId=4&dsMessageId=470698
support.microsoft.com/en-us/kb/2625048
blogs.technet.com/b/exchange/archive/2010/05/14/3409948.aspx
解决方案 2:为 CRL 流量打开防火墙
support.microsoft.com/en-us/kb/2677070
解决方案 3:SVN 命令行标志(未经测试)
serverfault.com/questions/716845/tortoise-svn-initial-connect-timeout - 备用 svn 命令行标志解决方案。
附加信息:调试此问题特别困难。SVN 1.8 禁用了对 Neon HTTP RA(存储库访问)库的支持,转而使用 Serf 库,该库删除了客户端调试日志记录。[1] 此外,返回的 SVN 错误代码与 svn_error_codes.h 中给出的字符串不匹配 [2] 而且,SVN 错误代码无法轻松映射回其 ENUM 标签,此例中 SVN 错误代码 E170013 映射到 SVN_ERR_RA_CANNOT_CREATE_SESSION。
- stackoverflow.com/questions/8416989/is-it-possible-to-get-svn-client-debug-output
- people.apache.org/~brane/svndocs/capi/svn__error__codes_8h.html#ac8784565366c15a28d456c4997963660a044e5248bb3a652768e5eb3105d6f28f
- code.google.com/archive/p/serf/issues/172
建议的 SVN 更改:
为所有操作启用命令的详细程度
将错误 ENUM 名称添加到 stderr
为 Serf Library 调试日志添加配置标志。
答案2
根据trapperjohn的回答:
如果您处于受限环境中,无法访问外部(甚至是非自签名)CA(并且通过 https 访问 SVN 时访问速度很慢),则可以在文件中指定它们,C:\Users\<user>\AppData\Roaming\Subversion\servers
如下所示:
ssl-authority-files = C:\<some path>\<intermediate CA>.pem;C:\<some path>\<root CA>.pem
请注意,您需要指定中间 CA 和根 CA(如果有中间 CA)。(要获取 PEM 格式的证书,可以使用 Firefox。)