Changeset 1636


Ignore:
Timestamp:
11/13/09 11:18:18 (9 years ago)
Author:
rafaelraymundo
Message:

Ticket #794 - Corrige o vercert/CertificadoB para "setar" a vrs do ldap qdo acessar usercertificate

Location:
trunk/security
Files:
2 edited

Legend:

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

    r1574 r1636  
    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        { 
    139139                if($m == '') return false; 
    140                 $m_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar); 
     140                if(!$m_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar)) 
     141                    { 
     142                        $this->erros_ssl[] = 'Não foi possível verificar a assinatura gerada. Contate o administrador'; 
     143                        $this->arquivos_para_deletar = array(); 
     144                        return false; 
     145                    } 
    141146                if(!grava_arquivo($m_arquivo_temporario,$m)) 
    142147                { 
    143                         deleta_arquivos_temporarios($this->arquivos_para_deletar); 
    144                         $this->arquivos_para_deletar = array(); 
    145                         return false; 
    146                 } 
    147                 $vrf_cert_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar); 
    148                 $vrf_msg_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar); 
     148                        $this->erros_ssl[] = 'Não foi possível verificar a assinatura gerada. Contate o administrador'; 
     149                        deleta_arquivos_temporarios($this->arquivos_para_deletar); 
     150                        $this->arquivos_para_deletar = array(); 
     151                        return false; 
     152                } 
     153                if(!$vrf_cert_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar)) 
     154                    { 
     155                        $this->erros_ssl[] = 'Não foi possível verificar a assinatura gerada. Contate o administrador'; 
     156                        $this->arquivos_para_deletar = array(); 
     157                        return false; 
     158                    } 
     159                if(!$vrf_msg_arquivo_temporario = gera_nome_arquivo_temporario(&$this->arquivos_para_deletar)) 
     160                    { 
     161                        $this->erros_ssl[] = 'Não foi possível verificar a assinatura gerada. Contate o administrador'; 
     162                        $this->arquivos_para_deletar = array(); 
     163                        return false; 
     164                    } 
    149165                // LIMPA ERROS ... Pode ser um problema para outras aplicacoes que usam openssl(fonte de erros unica). 
    150166                while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
    151167                $this->erros_ssl = array(); 
    152                 $resultado = openssl_pkcs7_verify($m_arquivo_temporario,0, $vrf_cert_arquivo_temporario,array($GLOBALS['CAs']),$GLOBALS['CAs'],$vrf_msg_arquivo_temporario);  
    153                 $retorno = true;  
     168                $resultado = openssl_pkcs7_verify($m_arquivo_temporario,0, $vrf_cert_arquivo_temporario,array($GLOBALS['CAs']),$GLOBALS['CAs'],$vrf_msg_arquivo_temporario); 
     169                $retorno = true; 
    154170                if($resultado === false || $resultado == -1) 
    155171                { 
    156                         # Indica ocorrencia de erro ...  
     172                        # Indica ocorrencia de erro ... 
    157173                        $retorno = false; 
    158174                        // Guarda msgs de erro ... 
    159                         while ($erro = openssl_error_string())  
    160                         {  
     175                        while ($erro = openssl_error_string()) 
     176                        { 
    161177                                $this->erros_ssl[] = $erro; 
    162178                        } 
    163                         If(file_exists($vrf_msg_arquivo_temporario))   
     179                        If(file_exists($vrf_msg_arquivo_temporario)) 
    164180                                { 
    165181                                        $this->msg_sem_assinatura =  file_get_contents($vrf_msg_arquivo_temporario); 
     
    174190                        { 
    175191                                # Se nao foi possivel obter o certificado retorna com falso ..... 
    176                                 If(file_exists($vrf_msg_arquivo_temporario))   
     192                                If(file_exists($vrf_msg_arquivo_temporario)) 
    177193                                        { 
    178194                                                $this->msg_sem_assinatura =  file_get_contents($vrf_msg_arquivo_temporario); 
     
    202218                { 
    203219                        while ($erro = openssl_error_string()); //  Limpa buffer de erros anteriores...... 
    204                         # Certificado poderia ter assinado um email??  
     220                        # Certificado poderia ter assinado um email?? 
    205221                        if(!($this->dados['KEYUSAGE']['digitalSignature'])) 
    206222                        { 
    207223                                $this->erros_ssl[] = 'Certificado nao poderia ter sido utilizado para assinar email.'; 
    208                                 while ($erro = openssl_error_string())  
    209                                         {  
     224                                while ($erro = openssl_error_string()) 
     225                                        { 
    210226                                                $this->erros_ssl[] = $erro; 
    211227                                        } 
     
    226242                } 
    227243                deleta_arquivos_temporarios($this->arquivos_para_deletar); 
    228                 $this->arquivos_para_deletar = array();  
     244                $this->arquivos_para_deletar = array(); 
    229245                return $retorno; 
    230         }        
     246        } 
    231247 
    232248        public function extrai_certificado_da_msg_assinada($m) 
     
    278294                                        $retorno = $item; 
    279295                                        break; 
    280                                 }                
     296                                } 
    281297                } 
    282298                deleta_arquivos_temporarios($this->arquivos_para_deletar); 
  • trunk/security/vercert.php

    r1574 r1636  
    134134    $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----'; 
    135135    return $aux; 
    136    } 
     136  } 
    137137  
    138138 
     
    172172 
    173173    $cc=ldap_connect($ldap_servidor);  
    174  
     174    ldap_set_option($cc, LDAP_OPT_PROTOCOL_VERSION, 3); 
    175175    //  bind .. 
    176176    $sr=ldap_bind($cc,$ldap_dn,$ldap_passwd);   
     
    197197    // Pega resultado .... 
    198198    $info = ldap_get_entries($cc, $sr); 
    199    
     199     
    200200    // Tem de achar só uma entrada.....ao menos uma.... 
    201201    if($info["count"]!=1) 
     
    226226                        $aux1 = $info[0]["dn"]; 
    227227                        $user_info['usercertificate'] = $cert; 
    228                          if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) 
     228                        if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao'])) 
    229229                                { 
    230230                                        if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z") 
    231231                                                { 
    232                                                         ###quando a data de expiracao estah no formato yyyymmddhhmmssZ 
    233232                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z'; 
    234233                                                } 
    235234                                        else 
    236235                                                { 
    237                                                         ###Outro atributo ldap que, assim como o phpgwaccounttype, tambem contem hora em formato unix 
    238236                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0'; 
    239237                                                } 
     
    241239                        else 
    242240                                { 
    243                                         //$user_info['phpgwaccountexpires'] = '0'; 
    244241                                        $user_info['phpgwlastpasswdchange'] = '0'; 
    245242                                } 
    246                         ldap_modify($cc,$aux1,$user_info); 
    247                         echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.'; 
     243                                 
     244                        if(!ldap_modify($cc,$aux1,$user_info)) 
     245                            { 
     246                                echo '6'.chr(0x0D).chr(0x0A).'Ocorreu um erro no acolhimento do certificado.',$aux1; 
     247                            } 
     248                        else 
     249                            { 
     250                                echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.'; 
     251                            } 
    248252                } 
    249253        else 
Note: See TracChangeset for help on using the changeset viewer.