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