summaryrefslogtreecommitdiffstats
path: root/functions/crl.php
blob: af934da9952f4b046fcfa9e0c11629504f41db80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
// Copyright (C) 2015 Remy van Elst

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.

// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

function crl_verify($raw_cert_data, $verbose=true) {
    global $random_blurp;
    $cert_data = openssl_x509_parse($raw_cert_data);
    $cert_serial_nm = strtoupper(bcdechex($cert_data['serialNumber']));   
    $crl_uris = [];
    $crl_uri = explode("\nFull Name:\n ", $cert_data['extensions']['crlDistributionPoints']);
    foreach ($crl_uri as $key => $uri) {
        if (!empty($uri) ) {
            $uri = explode("URI:", $uri);
            foreach ($uri as $key => $crluri) {
                if (!empty($crluri) ) {
                    $crl_uris[] = preg_replace('/\s+/', '', $crluri);
                }
            }
        }
    }
    foreach ($crl_uris as $key => $uri) {
        if (!empty($uri)) {
            if (0 === strpos($uri, 'http')) {
                $fp = fopen ("/tmp/" . $random_blurp .  "." . $key . ".crl", 'w+');
                $ch = curl_init(($uri));
                curl_setopt($ch, CURLOPT_TIMEOUT, 5);
                curl_setopt($ch, CURLOPT_FILE, $fp);
                curl_setopt($ch, CURLOPT_FAILONERROR, true);
                curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                if(curl_exec($ch) === false)
                {
                    echo '<pre>Curl error: ' . htmlspecialchars(curl_error($ch)) ."</pre>";
                }
                curl_close($ch);
                if(stat("/tmp/" . $random_blurp .  "." . escapeshellcmd($key) . ".crl")['size'] < 10 ) {
                    return false;
                } 
                $crl_text = shell_exec("openssl crl -noout -text -inform der -in /tmp/" . $random_blurp .  "." . escapeshellcmd($key) . ".crl 2>&1");

                $crl_last_update = shell_exec("openssl crl -noout -lastupdate -inform der -in /tmp/" . $random_blurp .  "." . escapeshellcmd($key) . ".crl");

                $crl_next_update = shell_exec("openssl crl -noout -nextupdate -inform der -in /tmp/" . $random_blurp .  "." . escapeshellcmd($key) . ".crl");

                unlink("/tmp/" . $random_blurp .  "." . escapeshellcmd($key) . ".crl");

                if ( strpos($crl_text, "unable to load CRL") === 0 ) {
                    if ( $verbose ) {
                        $result = "<span class='text-danger glyphicon glyphicon-exclamation-sign'></span> - <span class='text-danger'>CRL invalid. (" . $uri . ")</span><br><pre> " . htmlspecialchars($crl_text) . "</pre>";
                        return $result;
                    } else {
                        $result = "<span class='text-danger glyphicon glyphicon-remove'></span>";
                        return $result;
                    }
                }

                $crl_info = explode("Revoked Certificates:", $crl_text)[0];

                $crl_certificates = explode("Revoked Certificates:", $crl_text)[1];

                $crl_certificates = explode("Serial Number:", $crl_certificates); 
                $revcert = array('bla' => "die bla");
                foreach ($crl_certificates as $key => $revoked_certificate) {
                    if (!empty($revoked_certificate)) {
                        $revcert[str_replace(" ", "", explode("\n", $revoked_certificate)[0])] = str_replace("        Revocation Date: ", "", explode("\n", $revoked_certificate)[1]);
                    }
                }
                if( array_key_exists($cert_serial_nm, $revcert) ) {
                    if ( $verbose ) {
                        $result = "<span class='text-danger glyphicon glyphicon-exclamation-sign'></span> - <span class='text-danger'>REVOKED on " . $revcert[$cert_serial_nm] . ". " . $uri . "</span><br><pre>        " . $crl_last_update . "        " . $crl_next_update . "</pre>";
                    } else {
                        $result = "<span class='text-danger glyphicon glyphicon-remove'></span>";
                    }
                } else {
                    if ( $verbose ) {
                        $result = "<span class='text-success glyphicon glyphicon-ok-sign'></span> <span class='text-success'> - " . $uri . "</span><br><pre>        " . $crl_last_update . "        " . $crl_next_update . "</pre>";
                    } else {
                        $result = "<span class='text-success glyphicon glyphicon-ok'></span>";
                    }
                }
                return $result;
            }
        }
    }
}

?>