Php check if ssl certificate is valid

Is is possible to get the details like if a domain (say www.example.com) is HTTPS ready?

I need to validate some URLs, whether they have SSL certificate or not. I know, by using $_SERVER['HTTPS'] we can check our server details. but how can I achieve the same for other domains.

Any help would be much appreciated.

asked Dec 29, 2014 at 12:43

Krishna MohanKrishna Mohan

1,4833 gold badges22 silver badges28 bronze badges

6

Finally, I've ended up with the following my code:

$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;

If HTTPS is enabled for a domain, var_dump($var) gives the output as shown:

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

If it doesn't exist it returns NULL.

I've checked a few domains. It seems to be working fine. I hope it will help someone.

Php check if ssl certificate is valid

answered Dec 30, 2014 at 13:24

Krishna MohanKrishna Mohan

1,4833 gold badges22 silver badges28 bronze badges

1

This function will not only check if the domain has a SSL certificate, but also confirms, if the certificate matches the requested domain.

The most important part is the function openssl_x509_parse which parses the certificate and returns all the details as array.

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;
}

answered Dec 30, 2016 at 15:22

Php check if ssl certificate is valid

PhilippPhilipp

8,9965 gold badges56 silver badges65 bronze badges

4

Here is a different solution that I found somewhere on github (cannot find the repo again...)

It's a similar approach to the accepted answer, but uses fsockopen to test, if we can establish a SSL connection on port 443. If the connection is refused then the domain does not have a ssl certificate.

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') );

answered Dec 30, 2016 at 13:40

Php check if ssl certificate is valid

PhilippPhilipp

8,9965 gold badges56 silver badges65 bronze badges

2

There's no way to check if the certificate is secure or not using PHP alone without API (green padlock)

But you can use this, which use a API: https://github.com/spatie/ssl-certificate

Php check if ssl certificate is valid

cs95

345k85 gold badges636 silver badges684 bronze badges

answered Aug 5, 2019 at 22:49

How do I know if my SSL certificate is valid?

Chrome has made it simple for any site visitor to get certificate information with just a few clicks: Click the padlock icon in the address bar for the website. Click on Certificate (Valid) in the pop-up. Check the Valid from dates to validate the SSL certificate is current.

What is SSL certificate in PHP?

A Secure Socket Layer (SSL) certificate encrypts the connection between the customer and your web server. The information is rendered unreadable by all third parties (identity thieves and hackers). The core purpose of an SSL certification would be to safeguard server-client communication.

How do you check if https is enabled in Linux?

(Use netstat -t -l -p -n if you just want the port number, in which case you'll see *:443 instead of *:https ). This tells you that there's a socket listening on port 443.