如何找出服务器上安装的SSL证书? (使用PHP)

问题描述:

如何找出网站是在SSL上还是不在SSL上?我正在为一个WP插件进行实时事务处理,插件检查该站点(安装了哪个插件)使用SSL或不使用&我必须在结帐页面上显示一条警告消息,如果该站点是不在SSL上。如何找出服务器上安装的SSL证书? (使用PHP)

+0

我想这个问题是相关http://*.com/questions/4503135/php-get-site-url-protocol-http-vs-https – 2012-04-05 11:42:25

+0

这基本上是如何通过HTTPS协议查询脚本,如果脚本被HTTPS请求,则$ _SERVER ['HTTPS']被设置并且等于'on'。但我试图弄清楚SSL是否安装在网站正在运行的服务器上。我发现php脚本http://uniapple.net/blog/?p=539#comment-2705和我测试,但不知道它在所有方面的作用?谢谢 – 2012-04-05 12:38:20

您可以检查$_SERVER['HTTPS']变量。

如果是HTTPS请求,则将设置超全局$ _SERVER数组中的“HTTPS”值并将其设置为“on”。如果它不是HTTPS请求,它将不会被设置。

因此,为了测试是否是在PHP中的HTTPS请求,你可以这样做:

if(isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') { 
     ... 
    } 

或者,也可以将其设置为常数,如果你需要知道,如果它是一个HTTPS请求,多次在你的代码一样所以:

define('IS_HTTPS_REQUEST', isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on'); 
+0

@ Lex,这基本上是如何通过脚本查询脚本HTTPS协议,如果脚本被HTTPS请求,则$ _SERVER ['HTTPS']被设置并且等于'on'。但我试图弄清楚SSL是否安装在网站正在运行的服务器上。我发现php脚本http://uniapple.net/blog/?p=539#comment-2705和我测试,但不知道它在所有方面的作用?谢谢 – 2012-04-05 12:34:24

+0

您所指的代码是使用卷曲,可能无法使用在共享主机检查这个http://*.com/questions/9852937/php-curl-proxy-not-work-with-godaddy-shared-hosting,和代码我给你可以使用当你插件安装,并开始响应请求,你可以要求wordpress给ssl url,并显示警告,如果ssl不存在,并且如果请求没有ssl(使用上面的代码检查),你的插件将不会工作显示错误消息 – 2012-04-05 12:39:40

function is_exist_ssl($domain){ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "https://".$domain); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_HEADER, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_exec($ch); 

if(!curl_error($ch)){ 
$info = curl_getinfo($ch); 
if($info['http_code'] == 200){ 
return true; 
} 
return false; 
}else{ 
return false; 
} 
} 

用法:

$domain = 'uniapple.net'; 

if(is_exist_ssl($domain)){ 
echo "SSL is enabled!"; 
}else{ 
echo "No SSL"; 
} 

//usage :: 
if(!isset($_SERVER['REDIRECT_HTTPS']) || $_SERVER['REDIRECT_HTTPS'] != 'on'){ 
if(is_exist_ssl($domain)){ 
header('location : https://'.$domain); 
} 
} 

this question中描述的此问题有多种解决方案。 如果您使用的是Apache Httpd,并且您可以缩小某个前缀的路径,则可以在Location指令中使用SSLRequireSSL。或者,您可以在PHP中检查$_SERVER['HTTPS'],如果它已定义(它可能取决于Web服务器,但通常是)。

更重要的是,不要太在意检查您所服务的页面是否通过HTTPS提供服务。客户端负责检查,因为到达服务器时,已经太晚了:它可能已经被MITM攻击者拦截(甚至可能通过HTTPS发出请求,即使真正的客户端也是如此不)。我在this answer中对此问题做了更长时间的解释。从用户界面的角度来看,您应该明确指出用户将进入“安全”部分,由他们来检查后续请求是否通过HTTPS。

检查您的服务器确实是通过HTTPS运行并不一定是坏事,但从安全角度来看,这并没有多大帮助。真正重要的是,所有到那个安全部分的链接必须使用https://(并且一定不要依靠自动URL重写来这样做)。

由于这个问题很老,而且答案有点过时,所以我以为我会插话!

我看到你问了一个WordPress插件。 WordPress有一个is_ssl()函数来检查一个页面是否从WordPress 2.6开始使用SSL。