Я создаю свой собственный сервер CalDAV, используя библиотеку jsDAV (форк JavaScript библиотеки SabreDAV). Теперь я могу обслуживать свои календари по прямому URL-адресу календаря (поэтому у меня настроены серверные части, как серверная часть аутентификации, так и серверная часть календаря).
Я хочу иметь возможность использовать автоматическое обнаружение служб в приложениях iOS/OS X. Итак, если я настрою учетную запись CalDAV на своем Mac или iPad, я хочу просто ввести имя своего сервера, имя пользователя/пароль и не вводить какие-либо URL-адреса или что-то в этом роде.
Для этого я обслуживаю /.well-known/caldav
адрес , который должен перенаправить клиента в корень моего сервера CalDAV а>
Итак, если у меня есть корень моего сервера DAV, помещенный в /dav/
, я сейчас делаю 302 в URL-адрес /dav/
из /.well-known/caldav
.
Далее, вот типичный сеанс автообнаружения iOS с точки зрения моего сервера. Сервер доступен по HTTPS (все сертификаты действительны, самоподписанных нет), HTTP отключен.
PROPFIND /.well-known/caldav HTTP/1.1 302 39 "-" "iOS/7.1.1 (11D201) accountsd/1.0"
PROPFIND /dav/ HTTP/1.1 401 - "-" "iOS/7.1.1 (11D201) accountsd/1.0"
PROPFIND /dav/ HTTP/1.1" 207 - "-" "iOS/7.1.1 (11D201) accountsd/1.0"
Первый запрос — это описанная выше служба автообнаружения. Здесь все в порядке, сервер отвечает 302 на /dav/.
Вторая строка — это первый запрос к /dav/
без заголовков аутентификации. Я отвечаю с заголовком 'WWW-Authenticate': 'Basic realm="jsDAV"
.
Третья строка — правильно аутентифицированный DAV-запрос (я вижу его в журналах серверной части аутентификации и журналах отладки jsDAV). Вот что у меня есть:
<?xml version="1.0" encoding="UTF-8"?>
<A:propfind xmlns:A="DAV:">
<A:prop>
<A:current-user-principal/>
<A:principal-URL/>
<A:resourcetype/>
</A:prop>
</A:propfind>
И вот что я отправил обратно:
<?xml version="1.0" encoding="utf-8"?>
<d:multistatus
xmlns:d="DAV:"
xmlns:a="http://ajax.org/2005/aml"
xmlns:cal="urn:ietf:params:xml:ns:caldav"
xmlns:cs="http://calendarserver.org/ns/"
xmlns:dav="urn:DAV">
<d:response>
<d:href>/dav/</d:href>
<d:propstat>
<d:prop>
<d:current-user-principal>
<d:href>/dav/principals/me/</d:href>
</d:current-user-principal>
<d:resourcetype>
<d:collection/>
</d:resourcetype>
</d:prop>
<d:status>HTTP/1.1 200 OK</d:status>
</d:propstat>
</d:response>
</d:multistatus>
После этого (с моей точки зрения удачного) обмена iOS сообщил мне, что не может установить безопасное соединение с моим сервером и предлагает попробовать небезопасное.
Что здесь не так? Почему iOS считает, что мой сервер неисправен?