【发布时间】:2014-04-23 05:54:10
【问题描述】:
根据 RFC 2818,第 2 节: http://www.ietf.org/rfc/rfc2818.txt
"从概念上讲,HTTP/TLS 非常简单。只需使用 HTTP over TLS 就像您在 TCP 上使用 HTTP 一样。”
我有一个应用程序通过 TLS/SSL 客户端连接到端口 443 上的 Web 服务器。连接后,TLS 客户端会发送一个 HTTP 标头和相关的 HTTP 负载(都包含在 TLS/SSL 客户端的应用负载中)。
POST https://www.somehost.com/pubs/m_login HTTP/1.0
内容类型:application/x-www-form-urlencoded
主持人:www.somehost.com
用户代理:NativeHost
内容长度:50用户名=user%40example.com&password=密码
我收到来自服务器的 200 响应,表明它收到了我的请求。但是,HTTP 响应正文包含实际的服务器应用程序响应,这表示失败。
HTTP/1.1 200 正常
日期:格林威治标准时间 2014 年 3 月 18 日星期二 02:47:43
服务器:Apache/2.2.24 (FreeBSD) mod_fastcgi/2.4.6 mod_ssl/2.2.24 OpenSSL/0.9.8e DAV/2 mod_perl/2.0.8 Perl/v5.12.5
缓存控制:无缓存,max-age=0
编译指示:no-cache0
内容长度:118
设置 Cookie:bcdb_session=cd12abe27a5c55e3a076763329cc0cd31e246751;路径=/;过期=星期二,2014 年 4 月 1 日 02:47:43 GMT; HttpOnly
变化:接受编码
连接:关闭
内容类型:文本/xml;字符集=UTF-8
not_logged_in 错误
当我使用支持 HTTPS 的客户端并发送发送请求标头和正文时,我得到了成功的响应(http 200 响应和响应正文都表明成功)。
HTTP/1.1 200 正常
日期:格林威治标准时间 2014 年 3 月 18 日星期二 03:04:22
服务器:Apache/2.2.24 (FreeBSD) mod_fastcgi/2.4.6 mod_ssl/2.2.24 OpenSSL/0.9.8e DAV/2 mod_perl/2.0.8 Perl/v5.12.5
缓存控制:无缓存,max-age=0
编译指示:no-cache0
内容长度:84
设置 Cookie:bcdb_session=9c0e22a54d7fc28dbd19b748c287d1b25166d78c;路径=/;过期=星期二,2014 年 4 月 1 日 03:04:22 GMT; HttpOnly
变化:接受编码
连接:关闭
内容类型:文本/xml;字符集=UTF-8
正常状态>
我已尝试捕获两种场景的网络数据并进行比较。我可以捕获 HTTPS 客户端,因为它支持 HTTP 代理(并且我使用 Fiddler)。 SSL/TLS 客户端不能使用 HTTP 代理解决方案,但它支持 SOCKS 代理。
两个问题:
1) 知道为什么使用 HTTPS 客户端和 TLS/SSL 客户端可能会产生不同的结果吗?
2) 有人可以推荐一个 SOCKS 代理来使用,它可以提供与 Fiddler 类似的请求/响应数据访问权限吗?
谢谢, 迈克
【问题讨论】:
-
请显示实际的请求和响应。失败实际上说明了什么?有些服务器确实使用成功响应代码(如 2xx)而不是更合适的 4xx/5xx 响应代码来发送错误消息。你得到一个有效的 HTTP 响应这一事实意味着 TLS 部分工作正常。
-
同一个 IP 后面可能有多个 HTTPS 服务器。一个客户端可能使用 SNI(服务器名称指示)来指示所需的主机名,从而获取其证书和服务器数据。但是,如果您的客户端在没有 SNI 的情况下连接,它可能会获得另一个证书(不需要)并将连接到另一个虚拟服务器。
-
感谢您查看我的问题。我已经更新了原始帖子以包含请求以及使用 HTTPS 客户端时得到的工作响应和使用 TLS 客户端时得到的错误响应。
-
解决这个问题的方法是在 POST 命令中保留协议方案和主机名,只包含相关的 Url 部分。