【问题标题】:HTTPS using TLS/SSL client not working使用 TLS/SSL 客户端的 HTTPS 不起作用
【发布时间】: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 部分。

标签: ssl https proxy socks


【解决方案1】:

您确定这两种情况下的请求相同吗?例如。第一行对于有效的 HTTP 请求不正确。如果直接连接,请求行应该是 POST /pubs/m_login HTTP/1.0 而不是 POST https://www.somehost.com/pubs/m_login HTTP/1.0

不幸的是,SOCKS 服务器不会帮助您转储请求,因为 TLS 连接是安全的。 SOCKS 服务器提供了一个不透明的隧道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多