Changeset 4933 for trunk/security


Ignore:
Timestamp:
08/16/11 16:36:26 (13 years ago)
Author:
roberto.santosjunior
Message:

Ticket #1820 - Mensagem assinada (usando certificado digital) não abre.r4916

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/security/classes/CertificadoB.php

    r3285 r4933  
    99  public $dados = array();        # Area para armazenar os dados recuperados do certificado. 
    1010  public $apresentado = false;    # Deve ser testado para verificar se no certificado processado foi localizado o CPF 
    11   public $erros_ssl = array();  
    12   public $cert_assinante = '';   
     11  public $erros_ssl = array(); 
     12  public $cert_assinante = ''; 
    1313  public $msg_sem_assinatura = '';  #conteï¿œdo da mensagem sem assinatura, que retorna da funᅵᅵo verify do openssl 
    1414  public $arquivos_para_deletar = array(); 
    15    
     15 
    1616  public function __construct() 
    1717  { 
     
    3232public function __destruct() 
    3333  { 
    34     #Remover arquivos temporarios.....   
     34    #Remover arquivos temporarios..... 
    3535    deleta_arquivos_temporarios($this->arquivos_para_deletar); 
    3636  } 
    3737 
    38 # Recupera dados de um certificado no formato pem  
     38# Recupera dados de um certificado no formato pem 
    3939  function certificado($certificado_pem) 
    40   {              
    41       if (!$certificado_pem)  
     40  { 
     41      if (!$certificado_pem) 
    4242    { 
    4343        $this->apresentado = False; 
     
    4646   $this->dados = recupera_dados_do_ceritificado_digital($certificado_pem); 
    4747   $this->dados_xml = gera_xml_com_dados_do_certificado($this->dados); 
    48      # Certificado foi processado, as informacoes obtidas estao em $this->dados.  
    49   $this->apresentado = true;   
     48     # Certificado foi processado, as informacoes obtidas estao em $this->dados. 
     49  $this->apresentado = true; 
    5050  } 
    5151 
     
    7171 
    7272                $w = exec('openssl rsautl -in ' . $senha_arquivo_temporario . ' -out ' . $senha_criptografada_arquivo_temporario . ' -inkey ' . $cert_arquivo_temporario . ' -certin -pkcs -keyform PEM -encrypt',$saida); 
    73                  
     73 
    7474                if(!file_exists($senha_criptografada_arquivo_temporario)) 
    7575                { 
     
    7979                } 
    8080 
    81                 # Recupera a senha criptada, binario.....                
     81                # Recupera a senha criptada, binario..... 
    8282                $retorno = file_get_contents($senha_criptografada_arquivo_temporario); 
    8383 
     
    9797                if(!is_array($c))       return false; 
    9898                $aux = count($c); 
    99                 if($aux < 1)    return false;            
     99                if($aux < 1)    return false; 
    100100                if(!is_array($h) )      return false; 
    101101                # Tem de verificar todos os certificados que serao utilizados para criptografar a msg.. 
     
    109109                $enc_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar); 
    110110                //echo $enc_arquivo_temporario.'<br>'; 
    111                  
     111 
    112112                // LIMPA ERROS ... Pode ser um problema para outras aplicacoes que usam openssl(fonte de erros unica). 
    113113                while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
     
    118118                { 
    119119                        // Guarda msgs de erro ... 
    120                         while ($erro = openssl_error_string())  
    121                         {  
     120                        while ($erro = openssl_error_string()) 
     121                        { 
    122122                                $this->erros_ssl[] = $erro; 
    123123                        } 
     
    126126                        return false; 
    127127                } 
    128                 # Recupera a msg criptada......          
     128                # Recupera a msg criptada...... 
    129129                $retorno = file_get_contents($enc_arquivo_temporario); 
    130130                deleta_arquivos_temporarios($this->arquivos_para_deletar); 
     
    134134 
    135135 
    136 # Verifica uma msg($m) assinada...  
     136# Verifica uma msg($m) assinada... 
    137137        public function verificar($m) 
    138138        { 
     
    167167                        return false; 
    168168                    } 
    169                 // LIMPA ERROS ... Pode ser um problema para outras aplicacoes que usam openssl(fonte de erros unica). 
     169                $this->erros_ssl = array(); 
    170170                while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
    171                 $this->erros_ssl = array(); 
    172                 $resultado = openssl_pkcs7_verify($m_arquivo_temporario,0, $vrf_cert_arquivo_temporario,array($GLOBALS['CAs']),$GLOBALS['CAs'],$vrf_msg_arquivo_temporario);  
    173                 $retorno = true;  
     171                $resultado = openssl_pkcs7_verify($m_arquivo_temporario,0, $vrf_cert_arquivo_temporario,array($GLOBALS['CAs']),$GLOBALS['CAs'],$vrf_msg_arquivo_temporario); 
    174172                if($resultado === -1) 
    175173                { 
     
    181179                    $retorno = false; 
    182180                } 
     181                if($resultado === False) 
     182                    { 
     183                        while ($erro = openssl_error_string()) 
     184                            { 
     185                                if(substr($erro, 0,20) === 'error:21075075:PKCS7')  
     186                                    { 
     187                                        $this->erros_ssl = array(); 
     188                                        while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
     189                                        $resultado = openssl_pkcs7_verify($m_arquivo_temporario,PKCS7_NOVERIFY, $vrf_cert_arquivo_temporario,array($GLOBALS['CAs']),$GLOBALS['CAs'],$vrf_msg_arquivo_temporario); 
     190                                        break; 
     191                                    } 
     192                                $this->erros_ssl[] = $erro; 
     193                            } 
     194                    } 
     195                $retorno = true; 
    183196 
    184197                if($resultado === False) 
     
    188201                        $retorno = false; 
    189202                        // Guarda msgs de erro ... 
    190                         while ($erro = openssl_error_string())  
    191                         {  
     203                        while ($erro = openssl_error_string()) 
     204                        { 
    192205                                $this->erros_ssl[] = $erro; 
    193206                        } 
    194                         If(file_exists($vrf_msg_arquivo_temporario))   
     207                        If(file_exists($vrf_msg_arquivo_temporario)) 
    195208                                { 
    196209                                        $this->msg_sem_assinatura =  file_get_contents($vrf_msg_arquivo_temporario); 
     
    206219                        { 
    207220                                # Se nao foi possivel obter o certificado retorna com falso ..... 
    208                                 If(file_exists($vrf_msg_arquivo_temporario))   
     221                                If(file_exists($vrf_msg_arquivo_temporario)) 
    209222                                        { 
    210223                                                $this->msg_sem_assinatura =  file_get_contents($vrf_msg_arquivo_temporario); 
     
    235248                { 
    236249                        while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
    237                         # Certificado poderia ter assinado um email??  
     250                        # Certificado poderia ter assinado um email?? 
    238251                        if(!($this->dados['KEYUSAGE']['digitalSignature'])) 
    239252                        { 
    240253                                $this->erros_ssl[] = 'Certificado nao poderia ter sido utilizado para assinar email.'; 
    241                                 while ($erro = openssl_error_string())  
    242                                         {  
     254                                while ($erro = openssl_error_string()) 
     255                                        { 
    243256                                                $this->erros_ssl[] = $erro; 
    244257                                        } 
     
    259272                } 
    260273                deleta_arquivos_temporarios($this->arquivos_para_deletar); 
    261                 $this->arquivos_para_deletar = array();  
     274                $this->arquivos_para_deletar = array(); 
    262275                return $retorno; 
    263         }        
     276        } 
    264277 
    265278        public function extrai_certificado_da_msg_assinada($m) 
     
    311324                                        $retorno = $item; 
    312325                                        break; 
    313                                 }                
     326                                } 
    314327                } 
    315328                deleta_arquivos_temporarios($this->arquivos_para_deletar); 
Note: See TracChangeset for help on using the changeset viewer.