http - 如何以编程方式测试网站是否使用 HTTPS?

标签 http ssl https scripting

我想构建某种脚本来判断网站是否使用 https。

以编程方式确定这一点的方法是什么?我尝试访问我自己的一个域,我知道该域没有 https,但服务器仍然给了我一个 200 代码(至少根据我使用的 Chrome 扩展)。

是否有某种我可以捕获的错误,或者其他一些在站点之间保持一致的信息?

最佳答案

理论上,您应该提前知道是否应该使用 HTTPS。我的意思是,用户有部分判断期望对某些网站使用 HTTPS。在现实世界中,当您走进银行和走进咖啡店时,通常会有不同的安全期望。您通常不愿意向酒吧后面的人提供与银行家相同的详细信息。这同样适用于网络。

也就是说,您确实可以测试是否可以与某个网站建立 HTTPS 连接。问题是无法建立此连接可能意味着以下几件事:

  • 该网站根本不支持 HTTPS,
  • 出现临时连接问题,
  • 有攻击者阻止您建立该连接。

许多网站会尝试通过重定向将您从 HTTP 升级到 HTTPS,以使用户知道 HTTPS 可用,并希望让他们在下次访问该网站时期待它。有些网站甚至会使用 HTTP 严格传输安全 (HSTS) 来强制您在下次访问该网站时记住该升级。如果您可以假设您的第一次连接没有受到影响,那么这是一个合理的折衷方案。

What is a way of programmatically determining this? I tried visiting one of my own domains that I know does not have https, but the server still gave me a 200 code.

如果您的域没有有效的证书,则证书验证应该会失败,并且您根本无法获得任何 HTTP 状态代码作为响应。

我猜测您使用的脚本不会执行任何证书验证,并且这些域可能指向共享托管环境,其中具有相同 IP 地址的其他服务启用了 HTTPS。

您至少应该确保您的脚本正确验证证书:

  • 您应该能够验证该证书是否真实、由您信任的 CA 颁发且及时有效。 (这通常在 RFC 3820 和 RFC 5820 中指定)
  • 您应该能够验证它对于您要查找的主机名是否有效。 (这通常在 RFC 2818 和 RFC 6125 中指定。)

并非所有 SSL/TLS 库都默认启用此功能(尤其是第二点)。

我不确定您的脚本使用什么或您提到的扩展程序的用途。例如,如果您使用的是 curl,请确保您没有使用 -k--insecure,并且您使用的是wget,请确保您没有使用--no-check-certificate。如果您使用 libcurl,则应确保您是 using the VERIFYPEER and VERIFYHOST properly 。如果这不是您正在使用的,请在其他实现中查找类似的选项,并且不要忽略浏览器警告。

关于http - 如何以编程方式测试网站是否使用 HTTPS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28909015/

相关文章:

facebook-graph-api - Facebook : HTTPS is required for all Redirect URIs

http - TCP 是同一主机中 Go 程序之间通信的最佳方法吗?

html - 我可以让浏览器选择 UTF-8 来查看源代码吗?

php - 阅读受密码保护的页面

php - SSL_ERROR_PROTOCOL_VERSION_ALERT : Peer reports incompatible or unsupported protocol version

http - 哪些浏览器支持 "//"而不是 "http://"和 "https://"?

asp.net-mvc - 在 ASP.NET MVC 中使用 SSL 操作过滤器重定向循环

java - 如何使用 Apache HTTP 客户端获取像 "http://ньюбаланс.рф"这样的西里尔域名?

javascript - Imbrication promise 上传文件 angularJS

ruby - 在 Ruby 中从 N 和 e 创建 PEM 格式的证书