source: trunk/seguranca/vercert.php @ 1035

Revision 1035, 6.3 KB checked in by rafaelraymundo, 15 years ago (diff)

Ticket #558 - Adicionada funcionalidade de assinatura e criptografia de e-mails.

Line 
1<?php
2function item_para_uid($dados_do_certificado)
3        {
4/*
5// Exemplo do Array $dados_do_certificado padrao ICP-BRASIL
6// O conteudo do array pode variar conforme a AC emissora.
7Array
8(
9    [SERIALNUMBER] => 2009031816232802
10    [EMISSOR_CAMINHO_COMPLETO] => Array
11        (
12            [C] => BR
13            [O] => ICP-Brasil
14            [OU] => CSPB-1
15            [CN] => HOMAutoridade Certificadora do SERPRO Final v2
16        )
17
18    [EMISSOR] => HOMAutoridade Certificadora do SERPRO Final v2
19    [INICIO_VALIDADE] => 20090318205216
20    [FIM_VALIDADE] => 20120317205216
21    [EXPIRADO] =>
22    [SUBJECT] => Array
23        (
24            [C] => BR
25            [O] => ICP-Brasil
26            [OU] => Pessoa Fisica A3
27            [CN] => CESAR VIANNA
28        )
29
30    [NOME] => CESAR VIANNA
31    [AUTHORITYKEYIDENTIFIER] => AE34F397BB05B1AA6CC3FD6C4F0E9129BBB61BE2
32    [KEYUSAGE] => Array
33        (
34            [digitalSignature] => 1
35            [nonRepudiation] => 1
36            [keyEncipherment] => 1
37        )
38
39    [EXTKEYUSAGE] => Array
40        (
41            [clientAuth] => 1.3.6.1.5.5.7.3.2
42            [emailProtection] => 1.3.6.1.5.5.7.3.4
43        )
44
45    [CA] =>
46    [CRLDISTRIBUTIONPOINTS] => Array
47        (
48            [0] => http://ccdhom.serpro.gov.br/lcr/serproacfv2.crl
49            [1] => http://ccdhom.serpro.gov.br/lcr/serproacfv3.crl
50            [2] => http://ccdhom.serpro.gov.br/lcr/serproacfv4.crl
51        )
52
53    [2.16.76.1.3.6] => Array
54        (
55            [CADINSS] => 000000000000
56        )
57
58    [CADINSS] => 000000000000
59    [2.16.76.1.3.5] => Array
60        (
61            [TITULO] => 000000000000
62            [ZONA] => 000
63            [SECAO] => 0000
64            [TITULO_CIDADE_UF] =>
65        )
66
67    [TITULO] => 000000000000
68    [ZONA] => 000
69    [SECAO] => 0000
70    [TITULO_CIDADE_UF] =>
71    [2.16.76.1.3.1] => Array
72        (
73            [NASCIMENTO] => 19081981
74            [CPF] => 12345678902
75            [NIS] => 12345678901
76            [RG] => 000201075150953
77            [ORGAOUF] => SSPRS
78        )
79
80    [NASCIMENTO] => 19081981
81    [CPF] =>  12345678902
82    [NIS] => 12345678901
83    [RG] => 000201075150953
84    [ORGAOUF] => SSPRS
85    [EMAIL] => cesar.vianna@pr.planalto.gov.br
86)
87*/     
88       
89                // Retorna o CPF para usar como uid.
90                return $dados_do_certificado['2.16.76.1.3.1']['CPF'];
91        }
92       
93       
94$GLOBALS['phpgw_info']['flags'] = array(
95                'disable_Template_class' => True,
96                'login'                  => True,
97                'currentapp'             => 'login',
98                'noheader'               => True
99        );
100
101if(!$_REQUEST['certificado'])
102{
103   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
104   exit();
105}
106
107if(file_exists('../header.inc.php'))
108        {
109                include('../header.inc.php');
110        }
111else
112        {
113                echo '1'.chr(0x0D).chr(0x0A).'Arquivo header.inc.php n&atilde;o foi localizado.';
114                exit();   
115        }
116   
117$ldap_context = $GLOBALS['phpgw_info']['server']['ldap_context'];
118$ldap_servidor = $GLOBALS['phpgw_info']['server']['ldap_host'];
119$ldap_dn = $GLOBALS['phpgw_info']['server']['ldap_root_dn'];
120$ldap_passwd = $GLOBALS['phpgw_info']['server']['ldap_root_pw'];
121
122require_once('classes/CertificadoB.php');
123require_once('classes/Verifica_Certificado.php');
124include('classes/Verifica_Certificado_conf.php');
125
126  # Transforma o certificado do formato PEM para o formato DER ...
127  function troca_espaco_por_mais($pem_data)
128  {
129    $begin = "CERTIFICATE-----";
130    $end   = "-----END";
131    $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));   
132    $aux = substr($aux, 0, strpos($aux, $end));
133    $aux = strtr($aux,' ','+');
134    $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----';
135    return $aux;
136   }
137 
138
139$cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']);
140$cert = troca_espaco_por_mais($cert);
141
142$c = new certificadoB();
143$c->certificado($cert);
144
145if (!$c->apresentado)
146{
147   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
148   exit();
149}
150
151if (!$c->dados['CPF'])
152{
153   echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.';
154   exit();
155}
156
157$b = new Verifica_Certificado($c->dados,$cert);
158
159// Testa se Certificado OK.
160if(!$b->status)
161{
162   $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro;
163
164   foreach($b->erros_ssl  as $linha)
165   {
166        $msg .= "\n" . $linha;
167   }
168
169   echo $msg;
170   exit();   
171}
172
173    $cc=ldap_connect($ldap_servidor);
174
175    //  bind ..
176    $sr=ldap_bind($cc,$ldap_dn,$ldap_passwd); 
177
178    $filtro = 'uid='. item_para_uid($c->dados);
179
180    // Pesquisa CPF no RHDS/LDAP
181    $sr=ldap_search($cc, $ldap_context,$filtro); 
182
183    // Pega resultado ....
184    $info = ldap_get_entries($cc, $sr);
185 
186    // Tem de achar só uma entrada.....ao menos uma....
187    if($info["count"]!=1)
188    {
189        echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários';       
190        ldap_close($cc);
191        exit();
192    }
193
194// A conta expresso tem de estar ativa....
195if($info[0]['phpgwaccountstatus'][0]!='A')
196    {
197        echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.';
198        ldap_close($cc);
199        exit();
200    }
201
202if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] )
203    {
204        echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0];
205        //echo '0' . "\n" . $info[0]["uid"][0] . "\n" . $info[0]["cryptpassword"][0];
206    }
207else
208    {
209        if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0])
210                {
211                        $user_info = array();
212                        $aux1 = $info[0]["dn"];
213                        $user_info['usercertificate'] = $cert;
214                         if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
215                                {
216                                        if(substr($ldap_info['atributoexpiracao'],-1,1)=="Z")
217                                                {
218                                                        ###quando a data de expiracao estah no formato yyyymmddhhmmssZ
219                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z';
220                                                }
221                                        else
222                                                {
223                                                        ###Outro atributo ldap que, assim como o phpgwaccounttype, tambem contem hora em formato unix
224                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0';
225                                                }
226                                }
227                        else
228                                {
229                                        $user_info['phpgwaccountexpires'] = '0';
230                                }
231                        ldap_modify($cc,$aux1,$user_info);
232                        echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.';
233                }
234        else
235                {
236                        echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.';
237                }
238    }
239ldap_close($cc);
240?>
Note: See TracBrowser for help on using the repository browser.