[PHP]以PHP驗證HTTPS(SSL)證書資訊,Domain是否正確,期限是否過期

MySQL 5.3.0 以上版本方式用。
因為未來需要做自動驗證HTTPS(SSL)證書,所以研究了如何可以查出證書的狀態,製作了以下FUNCTION 可以使用。
網域名稱需要在考證,不保證一定問題,如果有建議也歡迎提出,感謝喔

/**
 * 驗證HTTPS
 * DOMAIN NAME 是否正確
 * 證書時間是否超過
 *  */
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 );
    
    //開始驗證SSL
    if ( $socket ) {
        $cont = stream_context_get_params( $socket );
        $cert_ressource = $cont['options']['ssl']['peer_certificate'];
     
        $cert = openssl_x509_parse( $cert_ressource ); //取得證書內容
        
        //有限期限 如果大於目前時間才繼續
        if($cert['validTo_time_t'] >  time()){
            $namepart = explode( 'CN=', $cert['name'] ); //取出DOMAIN NAME
            if ( count( $namepart ) == 2 ) {
                $cert_domain = str_replace (  '*.', '',$namepart[1]);
                $cert_domain = str_replace (  'www.', '',$cert_domain); //刪掉www.

                $check_domain = substr( $domain, -strlen( $cert_domain ) );
                $res = strpos($cert_domain,$check_domain)!==FALSE?TRUE:FALSE;  //網域名與證書符合
            }
        }
    }

    return $res;
}

使用方式我們搭配上次的文章「如果有HTTPS,則轉向HTTPS」一起使用。

//如果https有通,並且現在不是使用https,並且本次開啟瀏覽器沒有驗證過HTTPS (如果有CANT_USE_HTTPS表示已經錯誤過了,就不再去驗證以下)
if($_SERVER['HTTP_X_FORWARDED_PROTO']!='https'  && !isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'on')){
    if(has_ssl($_SERVER['SERVER_NAME'])){
          $xredir='https://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
          header('Location:'.$xredir);
          exit;
    }
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *