source: branches/2.2/security/classes/Verifica_Certificado.php @ 3232

Revision 3232, 4.3 KB checked in by rafaelraymundo, 14 years ago (diff)

Ticket #1237 - Atualizados componentes de suporte ao uso do Certificado Digital.

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($GLOBALS['CRLs'] != '')
41                 {
42                  if($this->Testa_se_Certificado_Revogado(trim($GLOBALS['CRLs'].$this->CRL),$parametro1['SERIALNUMBER']))
43                   {
44                        $this->msgerro = 'MSG011 - Ocorreu erro validando o certificado.';
45                        return false;
46                   }
47                 }
48                $this->status = true;
49        }
50       
51  public function __destruct()
52  {
53                #Remover arquivos temporarios.....     
54                deleta_arquivos_temporarios(&$this->arquivos_para_deletar);
55  }
56 
57   private function cmd_openssl_verify($ZXZ)
58        {
59                $this->erros_ssl = array();
60                if(!is_file($GLOBALS['CAs']))
61                {
62                        # Se arquivo com cas nao existe, assume certificado invalido..
63                        $this->erros_ssl[]= 'Autoridade certificadora desconhecida.(CA-01)';  //'Arquivo CAs nï¿œo localizado.';
64                        return false;
65                }
66                $arq = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar);
67                if(!$arq)
68                 {
69                        #Nao foi possivel gerar path(nome) para arquivo temporario...
70                        $this->erros_ssl[]= 'Autoridade certificadora desconhecida.(CA-02)';  //'Arquivo CAs nï¿œo localizado.';
71                        return false;
72                 }
73                $ret = grava_arquivo($arq,$this->certificado);
74                $saida = array();
75                $w = exec('openssl verify -CAfile '.$GLOBALS['CAs'].' '.$arq,$saida);
76                deleta_arquivos_temporarios(&$this->arquivos_para_deletar);
77                $this->arquivos_para_deletar = array();
78                //echo 'w= '.$w.'<br>';
79                //echo '<pre>';
80                //print_r($saida);
81                //echo '</pre>';
82                $aux = explode(' ',$w);
83                if($aux[1] != 'OK')   // OK no primeiro item do array significa que o comando executaou OK... mas tem erro no certificado...
84                {
85                        foreach($saida as $item)
86                        {
87                                $aux = explode(':',$item);
88                                if(isset($aux[1]))
89                                {
90                                        $this->erros_ssl[] = trim($aux[1]);
91                                }
92                        }                       
93                        return false;
94                }
95                return true;
96        }
97       
98        private function Testa_se_Certificado_Revogado($pcrl,$serial)
99        {
100                $this->erros_ssl = array();
101                if(!file_exists($pcrl))
102                        {
103                                # Se arquivo com crls nao existe, assume certificado revogado..
104                                $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-01)';  //'Arquivo CRL nao localizado.';
105                                return true;
106                        }       
107                        if(!is_file($pcrl))
108                        {
109                                # Se nao for um arquivo, assume certificado revogado..
110                                $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-01)';  //'Arquivo CRL nao localizado.';
111                                return true;
112                        }
113                $crl = file_get_contents($pcrl,true);
114                $cert_data = Crl_parseASN($crl);
115                # testa se crl expirada....     
116                if(gmdate('YmdHis') >= data_hora($cert_data[1][0][1][4][1]))
117                {
118                        # Se crl expirada, assume certificado revogado..
119                        $this->erros_ssl[]= 'Couldn\'t verify if certificate was revoked.(CD-02)';  //'Arquivo CRL expirado.';
120                        return true;
121                }
122                if (!is_array($cert_data) || ($cert_data[0] == 'UNKNOWN'))
123                {
124                        # Se o primeiro parametro aponta uma crl invalida retorna como certificado revogado...
125                        $this->erros_ssl[]='Couldn\'t verify if certificate was revoked.(CD-03)'; //Arquivo CRL invalido.
126                        return true;
127                }
128                foreach($cert_data[1][0][1][5][1] as $item)
129                {
130                        if($serial === $item[1][0][1])
131                        {
132                        #Certificado esta revogado mesmo !!!!!
133                        $this->erros_ssl[]='REVOKED Certificate.';
134                        $this->revogado = true;
135                        return true;                           
136                        }
137                }
138                return false;
139        }       
140 }     
141?>
Note: See TracBrowser for help on using the repository browser.