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

时间:2015-03-06 22:49:18

标签: http ssl https scripting

我想构建一个可以判断某个网站是否使用https的脚本。

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

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

2 个答案:

答案 0 :(得分:2)

理论上,您需要事先知道是否应该使用HTTPS。通过这种方式,我的意思是用户有一部分判断期望对某些站点使用HTTPS。在现实世界中,当您走进银行并走进咖啡店时,您通常会有不同的安全期望。你通常不愿意向酒吧后面的人提供同样的细节,就像你对银行家一样。这同样适用于网络。

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

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

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

  

有什么方法可以通过编程方式确定这一点?我尝试访问我自己的域名,我知道没有https,但服务器仍然给了我200个代码。

如果您的域名没有有效证书,则证书验证失败,您根本无法获得任何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。如果这不是您正在使用的,请在其他实现中查找类似的选项,并且不要忽略浏览器警告。

答案 1 :(得分:0)

在Windows上,您可以使用free Basic Edition of HttpWatch及其automation interface编写一个访问您要测试的网站的程序。

Entry类上的Error property将允许您检测HTTP连接失败的情况。