问题 如何检查服务器是否启用了ssl


你是否有人知道,如果是这样,我如何用我的应用程序代码检查服务器是否启用了ssl?


1847
2017-11-28 12:30


起源

你能提供一些信息吗?关于你写这个的环境? - Tom Haigh
你不能。服务器没有ssl,网站也没有。 - Kuzgun


答案:


“请求宽恕比允许更容易”

例如,阅读 stackoverflow.com 通过SSL,不要问是否 stackoverflow.com 支持它,就这样做。在Python中:

>>> import urllib2
>>> urllib2.urlopen('https://stackoverflow.com')
Traceback (most recent call last):
...
urllib2.URLError: <urlopen error (10060, 'Operation timed out')>
>>> html = urllib2.urlopen('http://stackoverflow.com').read()
>>> len(html)
146271
>>> 

它表明了这一点 stackoverflow.com 不支持SSL(2008)。


更新:  stackoverflow.com 现在支持https。


8
2017-11-28 14:05





您没有指定编程语言,但可以从命令行执行此操作。

bash-3.2$ echo ^D | telnet www.google.com https
Trying 66.102.11.104...
Connected to www.l.google.com.
Escape character is '^]'.
Connection closed by foreign host.
bash-3.2$ echo ^D | telnet www.stackoverflow.com https
Trying 69.59.196.211...
telnet: connect to address 69.59.196.211: Connection refused
telnet: Unable to connect to remote host

你去...谷歌,StackOverflow没有。


5
2017-09-08 08:49





不确定您的偏好语言,但这里是在c#

public bool IsSecureConnection()
{
    return HttpContext.Current.Request.IsSecureConnection || 
           HttpContext.Current.Request.Headers["HTTP_X_SSL_REQUEST"].Equals("1");
}

请注意这个标题是自定义的,但我认为你明白了。我见过民间只是查询“https”的请求,除了看起来很脏,它可能是合理可接受的,取决于你的安全模型。

或者你在问它是否完全可用?

一世


2
2017-11-28 12:33



Thx dove,我认为这是在服务器端,我想在客户端知道如何知道服务器是否接受SSL连接。 (如果我能以某种方式)。我想我可以通过一些异常处理来实现,如果我尝试使用ssl enable连接到服务器并且我得到异常,那么服务器(可能)没有启用ssl。但我可以用其他方式做到吗? - Bruno Costa


您需要指定您正在使用的协议 - 有HTTP版本的HTTP,IMAP,POP等。

假设它是您感兴趣的HTTPS,您可以检查是否有东西在服务器上的端口443上侦听并从那里开始......


0
2017-11-28 12:42



是的,我也想过,但我认为服务的端口取决于服务器的配置,对吗?顺便说一下,我正在使用https和smtp,抱歉。我的偏好语言是C#,但我接受任何语言作为答案,如果我有一个:P。谢谢你们两个;) - Bruno Costa
是的,端口确实依赖于配置 - 但如果你只是尝试使用HTTPS的随机站点,那将是在443端口。如果它 - genehack


如果您在服务器上运行PHP或ASP代码,那么简短的答案就是您没有。您可以尝试与非ssl IP地址建立套接字连接,并查看您是否获得了ssl证书,并枚举其Common Name和SubjectAlternativeNames,但一般来说,简单的答案是您不这样做。 apache的频繁(错误)配置是在没有SSL证书的情况下侦听端口443,因此能够建立连接并不能保证在那里存在SSL。无法建立连接可能意味着您的应用程序没有网络权限。因为设置SSL很麻烦,你知道你是否有SSL,这是一个配置决定。这就像想知道你有多少孩子 - 你应该知道。


0
2018-03-12 10:03





这是一个C#单元测试,无需在正确的HTTPContext上执行检测:

    [TestMethod]
    public void DetectSslSupport()
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.someinsecuresite.com");
        try
        {
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                //some sites like stackoverflow will perform a service side redirect to the http site before the browser/request can throw an errror.
                Assert.IsTrue(response.ResponseUri.Scheme == "https");
            }
        }
        catch (WebException)//"The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel."}
        {
            Assert.IsTrue(false);
        }
    }

0
2017-07-12 00:36