【问题标题】:How can I check if a server has ssl enable or not如何检查服务器是否启用了 ssl
【发布时间】:2008-11-28 12:30:19
【问题描述】:

你们有谁知道,如果有的话,我如何使用我的应用程序代码检查服务器是否启用了 ssl?

【问题讨论】:

  • 您能提供一些信息吗?关于你写这篇文章的环境?
  • 你不能。服务器没有 ssl,网站有。
  • @Kuzgun 这完全是错误的!服务器可以支持非 HTTP 协议在任意端口上的 SSL/TLS 连接不一定要使用它来保护 HTTP 连接。

标签: ssl


【解决方案1】:

"It's easier to ask forgiveness than permission"

比如通过SSL读取stackoverflow.com,不要问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。

【讨论】:

    【解决方案2】:

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

    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
    

    你去吧……Google 有,StackOverflow 没有。

    【讨论】:

      【解决方案3】:

      这是一个 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);
              }
          }
      

      【讨论】:

        【解决方案4】:

        不确定您喜欢的语言,但这里是 c#

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

        请注意这个标题是自定义的,但我想你明白了。我见过人们简单地查询“https”请求,除了看起来很脏之外,它可能还可以接受,这取决于您的安全模型。

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

        【讨论】:

        • 谢谢鸽子,我认为这是在服务器端,我想在客户端知道如何知道服务器是否接受 SSL 连接。 (如果我能以某种方式)。我想我可以通过一些异常处理来做到这一点,如果我尝试使用 ssl enable 连接到服务器并且我得到一个异常,那么服务器(可能)没有启用 ssl。但是我可以用其他方式吗?
        【解决方案5】:

        11 年后...

        我最终来到这里,因为我有同样的问题(在终端内)。

        我想最简单的解决方案是使用s_client of openssl

        openssl s_client -quiet -connect google.com:443
        

        如果这返回退出状态 0(使用 echo "$?" 检查),则主机支持给定端口上的 SSL/TLS(此处为 443)。

        【讨论】:

        • 只有在端口支持 SSL 并且 openssl 能够验证服务器证书时才会返回 0。如果不关心服务器证书是否有效,只关心是否有SSL服务器监听,在上面的命令行中添加2&gt;&amp;1 | grep -q '^depth'。我很乐意学习一种更优雅的方法。
        • “SSL 服务器”是什么意思?可以处理 SSL 握手并返回证书的服务器?
        【解决方案6】:

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

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

        【讨论】:

        • 是的,我也想过,但是我认为服务的端口取决于服务器的配置,对吗?顺便说一句,我正在使用 https 和 smtp,抱歉。我的首选语言是 C#,但我接受任何语言作为答案,如果我有一个:P。谢谢你们;)
        • 是的,端口确实取决于配置——但如果你只是尝试使用 HTTPS 的随机站点,那将在端口 443 上。如果它
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          在表单中给定输入文件http.parsed 的批量 SSL/TLS 测试

          10.31.11.5:443
          10.31.11.25:443
          10.31.11.37:55000
          10.31.11.116:80
          

          使用 GNU 并行

          parallel -j10 'curl -k https://{} 1> /dev/null 2> /dev/null && echo https://{}' :::: http.parsed
          

          我们得到输出

          https://10.31.11.5:443
          https://10.31.11.25:443
          https://10.31.11.37:55000
          

          【讨论】:

            猜你喜欢
            • 2011-11-12
            • 2014-08-22
            • 2016-04-24
            • 1970-01-01
            • 1970-01-01
            • 2011-01-19
            • 1970-01-01
            相关资源
            最近更新 更多