我正在使用Apache HttpClient 4.5.2来制作CloudKit Web API请求。当我向CloudKit端点URL(https://api.apple-cloudkit.com/[...])发送请求时,出现以下错误:
javax.net.ssl.SSLException: Certificate for <api.apple-cloudkit.com> doesn't match any of the subject alternative names: [*.icloud.com]
我不是SSL的专家,但看起来Apple正在为api.apple-cloudkit.com
提供仅对*.icloud.com
有效的证书。我明白了吗?
或者如果证书是正确的,那么为什么HttpClient会抱怨?
答案 0 :(得分:1)
您使用的库或底层平台似乎不支持Server Name Indication (SNI)。如果没有SNI,你会得到:
$ openssl s_client -connect api.apple-cloudkit.com:443 | openssl x509 -text
...
Subject: CN=*.icloud.com,
但是当使用SNI时,您会获得不同的证书:
$ openssl s_client -connect api.apple-cloudkit.com:443 \
-servername api.apple-cloudkit.com | openssl x509 -text
...
Subject: ...CN=cdn.apple-cloudkit.com
X509v3 Subject Alternative Name:
DNS:api.apple-cloudkit.com, DNS:cdn.apple-cloudkit.com
已知旧版本的Apache HTTPClient库缺少对SNI的支持,因此请确保使用最新版本。