Как я могу проверить, включен ли сервер ssl или нет?

Кто-нибудь из вас знает, если и если да, то как я могу проверить с кодом приложения, если сервер включен или нет?

Ответ 1

"Легче просить прощения, чем разрешение"

Например, чтобы прочитать 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.

Ответ 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

не уверен на предпочитаемом вами языке, но здесь он находится в С#

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

Обратите внимание, что этот заголовок является обычным, но я думаю, что вы поняли эту идею. Я видел фолк просто запрос запроса для "https", и, кроме того, он выглядит грязным, вероятно, приемлемым, зависит от вашей модели безопасности.

Или вы спрашиваете, доступно ли это вообще?

I

Ответ 4

Вам нужно указать, с каким протоколом вы работаете: есть версии SSL для HTTP, IMAP, POP и т.д.

Предполагая, что вы заинтересованы в HTTPS, вы можете проверить, что-то слушает порт 443 на сервере и отходит оттуда...

Ответ 5

Если вы используете PHP или ASP-код на сервере, короткий ответ - вы этого не делаете. Вы можете попытаться сделать соединение сокета с IP-адресом, отличным от ssl, и посмотреть, получаете ли вы сертификат ssl и перечисляете его общее имя и субъектАльтернативные имена, но в целом простой ответ заключается в том, что вы этого не делаете. Частая (неправильная) конфигурация apache заключается в прослушивании на порту 443 без SSL-сертификата, поэтому возможность подключения не гарантирует, что там есть SSL. Невозможность подключения может означать, что ваше приложение не имеет сетевых привилегий. Поскольку настройка SSL - это боль, вы знаете, есть ли у вас SSL или нет, и это решение конфигурации. Это как интересно, сколько у вас детей - вы должны знать.

Ответ 6

Это С# unit test для выполнения обнаружения без необходимости в правильном 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);
        }
    }