使用PHP检查SSL连接:拦截警告或手动处理各种场景

使用PHP检查SSL连接:拦截警告或手动处理各种场景,php,security,ssl,curl,https,Php,Security,Ssl,Curl,Https,如果存在数字证书,我想获得域的数字证书的详细信息 我想建造一些类似的东西 要获取数字证书的详细信息,我使用以下代码: $cacert = $this->getParameter('kernel.root_dir') . '/../src/AppBundle/Resources/public/security/cacert.pem'; $host = 'www.mywebsite.it'; $contextOptions = [ 'http' =&

如果存在数字证书,我想获得域的数字证书的详细信息

我想建造一些类似的东西

要获取数字证书的详细信息,我使用以下代码:

    $cacert = $this->getParameter('kernel.root_dir') . '/../src/AppBundle/Resources/public/security/cacert.pem';

    $host = 'www.mywebsite.it';

    $contextOptions = [
        'http' => [
            'ignore_errors' => true
        ],
        'ssl' => [
            'verify_peer' => false,
            'cafile' => $cacert,
            //'peer_name' => $host,
            'ciphers' => 'HIGH',
            'disable_compression' => true,
            'capture_peer_cert' => true,
            'capture_peer_cert_chain' => true
        ],
    ];

    $context = stream_context_create($contextOptions);

    $domain = preg_replace('/(http:\/\/)|(https:\/\/)/', '', $host);
    $socket = stream_socket_client(
        'ssl://' . $domain . ':443',
        $errno,
        $errstr,
        30,
        STREAM_CLIENT_CONNECT,
        $context
        );

    if (!$socket) {
        echo "$errstr ($errno)<br />\n";
    }

    $params = stream_context_get_params($socket);

    $cert_resource = $params['options']['ssl']['peer_certificate'];
    $cert = openssl_x509_parse($cert_resource);

    dump($cert);die;
$cacert=$this->getParameter('kernel.root\u dir')。//src/AppBundle/Resources/public/security/cacert.pem';
$host='www.mywebsite.it';
$contextOptions=[
“http'=>[
“忽略错误”=>true
],
“ssl”=>[
“验证对等方”=>false,
“cafile”=>$cacert,
//“peer_name”=>$host,
“密码”=>“高”,
“禁用压缩”=>true,
“捕获对等证书”=>true,
“捕获对等证书链”=>true
],
];
$context=stream\u context\u create($contextOptions);
$domain=preg\u replace('/(http:\/\/)|(https:\/\/)/,'','$host);
$socket=stream\u socket\u客户端(
“ssl://”。$domain.':443',
$errno,
$errstr,
30,
流\u客户端\u连接,
$context
);
如果(!$socket){
回显“$errstr($errno)
\n”; } $params=stream\u context\u get\u params($socket); $cert_resource=$params['options']['ssl']['peer_certificate']; $cert=openssl\u x509\u parse($cert\u资源); 转储($cert);死亡
此代码取自

我想要实现的是一个脚本,它可以像谷歌Chrome SSL证书检查器一样工作,因此我想知道一个网站是否安全,如果是,安全程度如何。可以找到有关谷歌浏览器安全指标的详细信息

问题/问题

1)
stream\u socket\u client()。那么,我如何拦截
警告
s以了解发生了什么?
自定义错误处理程序是否是建议的唯一解决方案,以及

从上面的代码可以看出,我还将
http
ignore\u errors
属性设置为
false
,但这似乎不起作用(参见下面的第2点)。有人提出了这一可能的解决办法

2) 我的域没有数字证书,但我的服务器有一个,因此,当我尝试获取证书时,出现以下错误:

警告:流\u套接字\u客户端():对等证书 CN='ssl.my.server.com'与预期不匹配 CN='www.mydomain.it's'

因此,我无法获取证书详细信息,因为连接在我获取它们之前就停止了。如何获取证书的详细信息?这个连接是否安全?与绿色铬条的区别仅仅是因为证书所针对的域与所调用的域不同吗?但这个连接是否安全

3) 我试图获取没有证书的域的证书详细信息(服务器也没有证书),但收到以下警告:

警告:流\u套接字\u客户端():无法连接到 ssl://www.non-secure-domain.com:443 (操作超时)

这个错误是否足以说明域根本没有数字证书?这个错误和我在第2点得到的错误之间的区别是什么

4) 最后一个问题:由于也可以通过
cURL
连接到远程主机,我应该使用
cURL
还是使用
stream\u socket\u client()
?对于我的用例(获取数字证书详细信息),两者之间的区别是什么

谢谢你的建议:)