source: branches/2.2/security/vercert.php @ 3232

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

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

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
117require_once('classes/CertificadoB.php');
118require_once('classes/Verifica_Certificado.php');
119include('classes/Verifica_Certificado_conf.php');
120
121  # Transforma o certificado do formato PEM para o formato DER ...
122  function troca_espaco_por_mais($pem_data)
123  {
124    $begin = "CERTIFICATE-----";
125    $end   = "-----END";
126    $aux = substr($pem_data, strpos($pem_data, $begin)+strlen($begin));
127    $aux = substr($aux, 0, strpos($aux, $end));
128    $aux = strtr($aux,' ','+');
129    $aux = '-----BEGIN CERTIFICATE-----'.$aux.'-----END CERTIFICATE-----';
130    return $aux;
131  }
132
133$cert =str_replace(chr(0x0A).chr(0x0A),chr(0x0A),$_REQUEST['certificado']);
134$cert = troca_espaco_por_mais($cert);
135
136$c = new certificadoB();
137$c->certificado($cert);
138
139if (!$c->apresentado)
140{
141   echo '2'.chr(0x0D).chr(0x0A).'Certificado não foi apresentado.';
142   exit();
143}
144
145if (!$c->dados['CPF'])
146{
147   echo '2'.chr(0x0D).chr(0x0A).'Não foi possível obter o CPF do certificado apresentado.';
148   exit();
149}
150
151$b = new Verifica_Certificado($c->dados,$cert);
152
153// Testa se Certificado OK.
154if(!$b->status)
155{
156   $msg = '3'.chr(0x0D).chr(0x0A).$b->msgerro;
157
158   foreach($b->erros_ssl  as $linha)
159   {
160        $msg .= "\n" . $linha;
161   }
162
163   echo $msg;
164   exit();
165}
166
167if ( (!empty($GLOBALS['phpgw_info']['server']['ldap_master_host'])) &&
168                    (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_dn'])) &&
169                    (!empty($GLOBALS['phpgw_info']['server']['ldap_master_root_pw'])) )
170        {
171                $ds = $GLOBALS['phpgw']->common->ldapConnect($GLOBALS['phpgw_info']['server']['ldap_master_host'],
172                        $GLOBALS['phpgw_info']['server']['ldap_master_root_dn'],
173                        $GLOBALS['phpgw_info']['server']['ldap_master_root_pw']);
174        }
175else
176        {
177                $ds = $GLOBALS['phpgw']->common->ldapConnect();
178        }
179
180if (!$ds)
181     {
182        echo '8'.chr(0x0D).chr(0x0A).'Não foi possível obter dados do usuario para login.';
183        exit();
184     }
185     
186    $filtro = 'uid='. item_para_uid($c->dados);
187    $atributos = array();
188    //$atributos[] = 'phpgwaccountexpires';
189    $atributos[] = 'phpgwlastpasswdchange';
190
191    if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
192                {
193                    $atributos[] = $GLOBALS['phpgw_info']['server']['atributoexpiracao'];
194                }
195
196     $atributos[] = "usercertificate";
197     $atributos[] = "phpgwaccountstatus";
198     $atributos[] = "cryptpassword";
199     $atributos[] = "uid";
200
201    $sr=ldap_search($ds, $GLOBALS['phpgw_info']['server']['ldap_context'],$filtro,$atributos);
202
203    // Pega resultado ....
204    $info = ldap_get_entries($ds, $sr);
205
206    // Tem de achar só uma entrada.....ao menos uma....
207    if($info["count"]!=1)
208    {
209        echo '4'.chr(0x0D).chr(0x0A).'Dados inválidos no diretório de usuários';
210        ldap_close($ds);
211        exit();
212    }
213
214// A conta expresso tem de estar ativa....
215if($info[0]['phpgwaccountstatus'][0]!='A')
216    {
217        echo '5'.chr(0x0D).chr(0x0A).'Conta do usuario nao esta ativa no Expresso.';
218        ldap_close($ds);
219        exit();
220    }
221
222if($info[0]["cryptpassword"][0] && $info[0]["usercertificate"][0] && $cert == $info[0]["usercertificate"][0] )
223    {
224        echo '0'.chr(0x0D).chr(0x0A).$info[0]["uid"][0].chr(0x0D).chr(0x0A).$info[0]["cryptpassword"][0];
225    }
226else
227    {
228        if(!$info[0]["usercertificate"][0] || $cert != $info[0]["usercertificate"][0])
229                {
230                        $user_info = array();
231                        $aux1 = $info[0]["dn"];
232                        $user_info['usercertificate'] = $cert;
233                        if(isset($GLOBALS['phpgw_info']['server']['atributoexpiracao']))
234                                {
235                                        if(substr($info[0][$GLOBALS['phpgw_info']['server']['atributoexpiracao']][0],-1,1)=="Z")
236                                                {
237                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '19800101000000Z';
238                                                }
239                                        else
240                                                {
241                                                        $user_info[$GLOBALS['phpgw_info']['server']['atributoexpiracao']] = '0';
242                                                }
243                                }
244                        else
245                                {
246                                        $user_info['phpgwlastpasswdchange'] = '0';
247                                }
248
249                        if(!ldap_modify($ds,$aux1,$user_info))
250                            {
251                                echo '7'.chr(0x0D).chr(0x0A).'Ocorreu um erro no acolhimento do certificado.',$aux1;
252                            }
253                        else
254                            {
255                                echo '6'.chr(0x0D).chr(0x0A).'Seu Certificado foi cadastrado. Sua senha foi expirada. Altere sua senha para concluir o processo.';
256                            }
257                }
258        else
259                {
260                        echo '6'.chr(0x0D).chr(0x0A).'Sua senha foi expirada. Altere sua senha para acessar o Expresso usando certificado digital.';
261                }
262    }
263ldap_close($ds);
264?>
Note: See TracBrowser for help on using the repository browser.