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