source: trunk/security/classes/Verifica_Certificado.php @ 1174

Revision 1174, 4.2 KB checked in by rafaelraymundo, 15 years ago (diff)

Ticket #558 - Altera nome de diretório seguranca para security.

Line 
1<?php
2require_once('Verifica_Certificado_conf.php');
3require_once('funcoes_auxiliares.php');
4
5class Verifica_Certificado
6{
7        public $msgerro = '';
8        public $revogado = false;
9        public $status = false;
10        public $certificado = '';
11        public $CRL = '';
12        public $erros_ssl = array();
13        public $arquivos_para_deletar = array();
14       
15        public function __construct($parametro1,$parametro2)
16        {       
17                //include('Verifica_Certificado_conf.php');
18                # $parametro1 = array com dados do certificado...
19                # $parametro2 = certificado no formato PEM ...
20                $this->status = false;
21                if(!verificaopenssl())
22                {
23                        $this->msgerro = 'MSG005i - Modulo openssl nao disponivel no PHP.';
24                        return false;
25                }
26                If(!$parametro2)
27                 {
28                        $this->msgerro = 'MSG005 - Certificado nao informado.';
29                        return false;           
30                 }
31                $this->certificado = $parametro2;
32                //Pode existir mais de um local para obter a CRL. Vai tabalhar com o primeiro ....
33                $aux = explode('/',$parametro1['CRLDISTRIBUTIONPOINTS'][0]);
34                $this->CRL = $aux[count($aux)-1];       
35                if(!$this->cmd_openssl_verify($this->certificado))
36                 {
37                        $this->msgerro = 'MSG010 - Erro verificando Expiracao/CAs do certificado.';
38                        return false;           
39                 }
40                if($this->Testa_se_Certificado_Revogado(trim($GLOBALS['CRLs'].$this->CRL),$parametro1['SERIALNUMBER']))
41                 {
42                        $this->msgerro = 'MSG011 - Ocorreu erro validando o certificado.';
43                        return false;           
44                 }               
45                $this->status = true;
46        }
47       
48  public function __destruct()
49  {
50                #Remover arquivos temporarios.....     
51                deleta_arquivos_temporarios(&$this->arquivos_para_deletar);
52  }
53 
54   private function cmd_openssl_verify($ZXZ)
55        {
56                $this->erros_ssl = array();
57                if(!is_file($GLOBALS['CAs']))
58                {
59                        # Se arquivo com cas nao existe, assume certificado invalido..
60                        $this->erros_ssl[]= 'Autoridade certificadora desconhecida.(CA-01)';  //'Arquivo CAs nï¿œo localizado.';
61                        return false;
62                }
63                $arq = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar);
64                if(!$arq)
65                 {
66                        #Nao foi possivel gerar path(nome) para arquivo temporario...
67                        $this->erros_ssl[]= 'Autoridade certificadora desconhecida.(CA-02)';  //'Arquivo CAs nï¿œo localizado.';
68                        return false;
69                 }
70                $ret = grava_arquivo($arq,$this->certificado);
71                $saida = array();
72                $w = exec('openssl verify -CAfile '.$GLOBALS['CAs'].' '.$arq,$saida);
73                deleta_arquivos_temporarios(&$this->arquivos_para_deletar);
74                $this->arquivos_para_deletar = array();
75                //echo 'w= '.$w.'<br>';
76                //echo '<pre>';
77                //print_r($saida);
78                //echo '</pre>';
79                $aux = explode(' ',$w);
80                if($aux[1] != 'OK')   // OK no primeiro item do array significa que o comando executaou OK... mas tem erro no certificado...
81                {
82                        foreach($saida as $item)
83                        {
84                                $aux = explode(':',$item);
85                                if(isset($aux[1]))
86                                {
87                                        $this->erros_ssl[] = trim($aux[1]);
88                                }
89                        }                       
90                        return false;
91                }
92                return true;
93        }
94       
95        private function Testa_se_Certificado_Revogado($pcrl,$serial)
96        {
97                $this->erros_ssl = array();
98                if(!file_exists($pcrl))
99                        {
100                                # Se arquivo com crls nao existe, assume certificado revogado..
101                                $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-01)';  //'Arquivo CRL nao localizado.';
102                                return true;
103                        }       
104                        if(!is_file($pcrl))
105                        {
106                                # Se nao for um arquivo, assume certificado revogado..
107                                $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-01)';  //'Arquivo CRL nao localizado.';
108                                return true;
109                        }
110                $crl = file_get_contents($pcrl,true);
111                $cert_data = Crl_parseASN($crl);
112                # testa se crl expirada....     
113                if(gmdate('YmdHis') >= data_hora($cert_data[1][0][1][4][1]))
114                {
115                        # Se crl expirada, assume certificado revogado..
116                        $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-02)';  //'Arquivo CRL expirado.';
117                        return true;
118                }
119                if (!is_array($cert_data) || ($cert_data[0] == 'UNKNOWN'))
120                {
121                        # Se o primeiro parametro aponta uma crl invalida retorna como certificado revogado...
122                        $this->erros_ssl[]='Couldn\'t verify if certificate was revoked.(CD-03)'; //Arquivo CRL invalido.
123                        return true;
124                }
125                foreach($cert_data[1][0][1][5][1] as $item)
126                {
127                        if($serial === $item[1][0][1])
128                        {
129                        #Certificado esta revogado mesmo !!!!!
130                        $this->erros_ssl[]='REVOKED Certificate.';
131                        $this->revogado = true;
132                        return true;                           
133                        }
134                }
135                return false;
136        }       
137 }     
138?>
Note: See TracBrowser for help on using the repository browser.