【发布时间】:2014-10-03 04:46:01
【问题描述】:
一些 HTTP 客户端接受此证书,而另一些则不接受。有什么不同?
Java 拒绝它。
((javax.net.ssl.HttpsURLConnection)new java.net.URL("https://www.lucidpress.com")
.openConnection())
.getInputStream()
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: 没有主题 找到与 www.lucidpress.com 匹配的备用 DNS 名称。 在 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 在 sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1715) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:257) 在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:251) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1168) 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) 在 sun.security.ssl.Handshaker.processLoop(Handshaker.java:609) 在 sun.security.ssl.Handshaker.process_record(Handshaker.java:545) 在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:963) 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1208) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1235) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1219) 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:440) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 在 sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139) 在 sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
Python 请求拒绝它。
import requests
requests.get('https://www.lucidpress.com')
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 456, in request
resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 559, in send
r = adapter.send(request, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 382, in send
raise SSLError(e, request=request) requests.exceptions.SSLError: hostname 'www.lucidpress.com' doesn't match either of '*.lucidchart.com', 'lucidchart.com'
cURL 接受它。
$ curl -v https://www.lucidpress.com
- 关于 connect() 到 www.lucidpress.com 端口 443 (#0)
- 正在尝试 54.236.129.63... 已连接
- 成功设置证书验证位置:
- CAfile:无 CApath:/etc/ssl/certs
- SSLv3、TLS 握手、客户端问候 (1):
- SSLv3、TLS 握手、服务器问候 (2):
- SSLv3、TLS 握手、CERT (11):
- SSLv3、TLS 握手、服务器密钥交换 (12):
- SSLv3,TLS 握手,服务器完成 (14):
- SSLv3、TLS 握手、客户端密钥交换 (16):
- SSLv3,TLS 更改密码,客户端问候 (1):
- SSLv3,TLS 握手,完成 (20):
- SSLv3,TLS 更改密码,客户端问候 (1):
- SSLv3,TLS 握手,完成 (20):
- 使用 DHE-RSA-AES256-SHA 的 SSL 连接
- 服务器证书:
- 主题:OU=域控制已验证; CN=*.lucidpress.com
- 开始日期:2014-05-12 16:20:34 GMT
- 有效期:2015-07-09 22:19:45 GMT
- subjectAltName:www.lucidpress.com 匹配
- 发行人:C=US; ST=亚利桑那州; L=斯科茨代尔; O=GoDaddy.com, Inc.;欧=http://certs.godaddy.com/repository/; CN=Go Daddy Secure 证书颁发机构 - G2
- SSL 证书验证正常。
wget 拒绝它。
wget https://www.lucidpress.com
--2014-08-09 19:55:41-- https://www.lucidpress.com/ 正在解析 www.lucidpress.com (www.lucidpress.com)... 107.23.98.6, 54.236.129.63, 54.88.154.168 连接到 www.lucidpress.com (www.lucidpress.com)|107.23.98.6|:443... 已连接。 错误:否 证书主题备用名称与请求的主机名匹配 'www.lucidpress.com'。要不安全地连接到 www.lucidpress.com,请使用 '--no-check-certificate'。
Chrome、FF 和 IE 都接受。
为什么行为不同?
【问题讨论】:
-
“SSLError: hostname 'www.lucidpress.com' 不匹配 '*.lucidchart.com', 'lucidchart.com'” – 看起来像提供的 SSL 证书适用于不同的域……
-
@CBroe,那为什么 cURL 和浏览器会接受呢?
-
尝试验证在这两种情况下都提供了相同的证书。
-
@jww,如果有帮助,我相信
www.lucidchart.com和www.lucidpress.com实际上可能是同一个主机,试图根据主机名提供证书。 -
@Paul - 添加了有关 DNS、SNI 和证书的附加信息。我不敢相信我没有注意到这些名字是不同的......
标签: ssl https ssl-certificate