我正在使用 jsDAV 库(SabreDAV 库的 JavaScript 分支)构建自己的 CalDAV 服务器。现在我可以通过直接日历 url 提供我的日历(所以我已经设置了我的后端,包括身份验证后端和日历后端)。
我希望能够在 iOS/OS X 应用程序中使用自动服务发现。所以,如果我在我的 Mac 或 iPad 上设置了 CalDAV 帐户,我希望我只输入我的服务器名称、用户名/密码而不输入任何 URL 左右。
为此,我提供的/.well-known/caldav
地址必须将客户端重定向到我的 CalDAV 服务器的根目录
所以,如果我已经将我的 DAV 服务器根放在/dav/
我现在正在做 302 到/dav/
url 从/.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 认为我的服务器坏了?