Черепаха SVN: время ожидания первоначального подключения
У меня проблема при подключении Tortoise SVN к моему серверу SVN. При первом подключении время ожидания истекло (SVN зависает около 20 секунд), а вторая (автоматическая) попытка работает мгновенно. Т.е. каждое обновление, фиксация, запись занимает много времени и сводит всех с ума...
То же действие SVN от клиента командной строки Linux работает мгновенно. Доступ через веб-браузер также работает без каких-либо задержек.
Настройка SVN выглядит следующим образом: на сервере SVN работает CentOS 7, Apache 2.4.6 и mod_dav_svn 1.7.14. Доступ через SSL настроен. Аутентификация выполняется через LDAP на Windows Server 2012 R2. Клиент (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>
Журнал Apache (ssl_error_log) запускается следующим образом при инициировании активности SVN:
[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) - Apache прерывает соединение чуть позже, когда включен модуль reqtimeout (я отключил его в этом сценарии). Примерно через 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, со второй ничего не регистрируется
Для меня, похоже, Tortoise SVN запускает соединение либо без учетных данных, либо без использования https (?), Что приводит к тайм-ауту. Второе соединение, похоже, использует https, но с неверными учетными данными, и, наконец, Tortoise подключается с использованием правильных учетных данных, и аутентификация проходит успешно.
Есть идеи? Что происходит между вторым 14 и вторым 36 и как я могу предотвратить это?;-)
Спасибо Флориан
Обновление: я нашел решение (хотя я не совсем уверен, в чем причина...): Каждый раз, когда я запускаю Tortoise SVN (или клиент командной строки Windows svn), я замечал активность на брандмауэре: контроллер домена пытался связаться с несколькими серверами, например, egcroot-servers.net, которые являются серверами VERISIGN для проверки SSL-сертификата или для поиска новых корневых сертификатов и т. д. (?). Это было заблокировано брандмауэром, поэтому DC не торопился с просмотром списка альтернативных серверов.
Мы используем самозаверяющие сертификаты, поэтому моей первой попыткой было внедрить наш сертификат CA в систему управления сертификатами Windows с помощью групповой политики. Это сработало (по крайней мере SVN не жаловался на неизвестный CA после удаления всей информации об аутентификации). Тем не менее, 20-секундная задержка все еще существует (и DC все еще пытается связаться с Verisign).
В конце концов я попробовал локальную опцию конфигурации SVN "ssl-author-files" для статической передачи сертификата CA и вуаля: задержка прошла!
Т.е. это приводит к 20 секундной задержке:
svn list myrepo
и это не
svn list --config-option servers:global:ssl-authority-files=C:\temp\mycertificate.crt myrepo
Все еще немного грустно, что этот обходной путь требует настройки на каждом клиенте, но, по крайней мере, это решение...
Я не уверен, что делает Windows при проверке сертификата, может быть, она проверяет аннулирование или что-то в этом роде и ждет тайм-аута (потому что она не может связаться с Verisign и друзьями). Без понятия.
2 ответа
Основываясь на ответе trapperjohn:
если вы находитесь в ограниченной среде и не имеете доступа к внешним (даже не самоподписанным) центрам сертификации (а доступ к SVN через HTTPS медленный), вы можете указать их в C:\Users\<user>\AppData\Roaming\Subversion\servers
файл следующим образом:
ssl-authority-files = C:\<some path>\<intermediate CA>.pem;C:\<some path>\<root CA>.pem
Обратите внимание, что вам нужно указать как промежуточный, так и корневой ЦС (если есть промежуточный ЦС). (Для получения сертификатов в формате PEM можно использовать Firefox.)
Проблема: после вызова SVN из командной строки на сервере с межсетевым экраном ничего не видно в течение 15 секунд, после чего программа завершает работу со следующей ошибкой:
svn: E170013: невозможно подключиться к хранилищу по URL-адресу 'SVN.REPOSITORY.REDACTED'
svn: E730054: Ошибка выполнения контекста: существующее соединение было принудительно закрыто удаленным хостом.
Расследование: Интернет-исследование вышеуказанных ошибок не выявило никакой соответствующей информации.
В процессе Tracing (procmon) была обнаружена попытка подключения к серверу Akamai (облачные службы) после рукопожатия SSL/TLS с сервером SVN. Имя хоста для сервера не было показано в трассировке процесса. Обратный поиск 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 (2 записи в кеше DNS).
Средство захвата пакетов (MMA) показало попытку подключения к имени хоста ctldl.windowsupdate.com после рукопожатия SSL/TLS с сервером SVN.
Windows Crypto API пытался подключиться к Центру обновления Windows, чтобы получить информацию об отзыве сертификатов (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 (не проверено)
faultserver.ru/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.