Как проверить, имеет ли домен сертификат SSL или нет?

Возможно ли получить данные, например, если домен (скажем, www.example.com ) готов HTTPS?

Мне нужно проверить некоторые URL-адреса, имеют ли они сертификат SSL или нет. Я знаю, используя $_SERVER['HTTPS'] мы можем проверить данные нашего сервера. но как я могу достичь того же для других доменов.

Любая помощь приветствуется.

Эта функция не только проверит, имеет ли домен сертификат SSL, но также подтверждает, соответствует ли сертификат запрашиваемому домену.

Наиболее важной частью является функция openssl_x509_parse которая анализирует сертификат и возвращает все детали как массив.

 function has_ssl( $domain ) { $res = false; $stream = @stream_context_create( array( 'ssl' => array( 'capture_peer_cert' => true ) ) ); $socket = @stream_socket_client( 'ssl://' . $domain . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $stream ); // If we got a ssl certificate we check here, if the certificate domain // matches the website domain. if ( $socket ) { $cont = stream_context_get_params( $socket ); $cert_ressource = $cont['options']['ssl']['peer_certificate']; $cert = openssl_x509_parse( $cert_ressource ); // Expected name has format "/CN=*.yourdomain.com" $namepart = explode( '=', $cert['name'] ); // We want to correctly confirm the certificate even // for subdomains like "www.yourdomain.com" if ( count( $namepart ) == 2 ) { $cert_domain = trim( $namepart[1], '*. ' ); $check_domain = substr( $domain, -strlen( $cert_domain ) ); $res = ($cert_domain == $check_domain); } } return $res; } 

Наконец, у меня появился следующий код:

 $stream = stream_context_create (array("ssl" => array("capture_peer_cert" => true))); $read = fopen("https://www.example.com", "rb", false, $stream); $cont = stream_context_get_params($read); $var = ($cont["options"]["ssl"]["peer_certificate"]); $result = (!is_null($var)) ? true : false; 

Если HTTPS включен для домена, var_dump($var) дает результат, как показано:

 resource(4) of type (OpenSSL X.509) 

Если он не существует, он возвращает NULL .

Я проверил несколько доменов. Кажется, он работает нормально. Надеюсь, это поможет кому-то.

Вот другое решение, которое я нашел где-то на github (не могу снова найти репо …)

Это аналогичный подход к принятому ответу, но использует fsockopen для тестирования, если мы можем установить SSL-соединение на порт 443. Если соединение отказывается, то домен не имеет сертификата ssl.

 function has_ssl( $domain ) { $ssl_check = @fsockopen( 'ssl://' . $domain, 443, $errno, $errstr, 30 ); $res = !! $ssl_check; if ( $ssl_check ) { fclose( $ssl_check ); } return $res; } // Test it: print_r( has_ssl('google.com') );