Leitora SafeSign de e-CPF no Linux
Gostaria de relatar aqui minhas experiências primárias com utilização de certificado digital no Debian. Como sempre no Brasil, essa é uma exigência do nosso maravilhoso Governo que cobra da população e das empresas sem fornecer condições necessários nível europeu de prestações de contas. Pois bem, desabafado a indignação vamos ao que interessa.
Entendendo o funcionamento
Ao plugar o dispositivo na porta USB, o kernel Linux do Debian já reconheceu o dispositivo, dmesg mostra o algo assim aqui:
# dmesg
[12477.084422] usb 1-1: new full-speed USB device number 13 using xhci_hcd
[12477.253618] usb 1-1: New USB device found, idVendor=08e6, idProduct=3437
[12477.253622] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12477.253626] usb 1-1: Product: USB SmartCard Reader
[12477.253628] usb 1-1: Manufacturer: Gemalto
[12477.253630] usb 1-1: SerialNumber: ABA0D442
Veja que o módulo do kernel que gerencia o dispositivo é o xhci_hcd, pois bem este é o básico, a primeira parte do funcionamento é o kernel ser capaz de gerenciar o dispositivo.
Reconhecido o dispositivo, o próximo passo é instalar o daemon que fornecerá a interface de comunicação com a leitora, no caso o software do daemon que fará a comunicação com a leitora é o pcscd (Personal Computers with Smart Cards Daemon).
Fazendo o daemon conversar com a leitora, programas adicionais como o Firefox, utilizarão bibliotecas padrões para se comunicar com o daemon.
Como root, instale os pacotes necessários:
# apt-get install libgempc430 opensc libccid pcscd
O daemon pcscd deve gerenciar o dispositivo, mas a propósito de diagnóstico, vamos para o daemon e executar o comando em modo debug, se tudo der certo este passo não será necessário, então se você não quer debugar nada pode pular este passo.
Ainda como root, parar o daemon:
# service pcscd stop
Execute-o em primeiro plano com o debug ativo (sem a leitora):
# pcscd -f -d
Deve surgir na tela algo parecido com isto:
00000000 debuglog.c:292:DebugLogSetLevel() debug level=debug
00000329 configfile.l:283:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000075 configfile.l:355:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000131 configfile.l:317:DBGetReaderListDir() Skipping non regular file: ..
00000030 configfile.l:317:DBGetReaderListDir() Skipping non regular file: .
00000038 pcscdaemon.c:569:main() pcsc-lite 1.8.13 daemon ready.
00003546 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000252 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000232 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1BCF, PID: 0x0005, path: /dev/bus/usb/001/002
00000213 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000241 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x04F2, PID: 0xB40A, path: /dev/bus/usb/001/003
00000213 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x04F2, PID: 0xB40A, path: /dev/bus/usb/001/003
00000204 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000209 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x058F, PID: 0x6366, path: /dev/bus/usb/001/004
00000259 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/002/001
Agora plugue a leitora, se deu tudo certo algo assim deve surgir na tela:
00001000 ccid_usb.c:595:OpenUSBByName() Found Vendor/Product: 08E6/3437 (Gemalto PC Twin Reader)
00000007 ccid_usb.c:597:OpenUSBByName() Using USB bus/device: 1/15
00002564 ccid_usb.c:1125:get_data_rates() declared: 12903 bps
00000017 ccid_usb.c:1125:get_data_rates() declared: 25806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 51613 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 103226 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 206452 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 412903 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 825806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 154839 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 258065 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 17204 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 34409 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 68817 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 137634 bps
00000014 ccid_usb.c:1125:get_data_rates() declared: 275269 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 550538 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 172043 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 12403 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 24806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 49612 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 99225 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 198450 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 396899 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 74419 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 124031 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 86022 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 38710 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 64516 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 10323 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 20645 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 41290 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 82581 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 165161 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 30968 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 18750 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 37500 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 75000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 150000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 300000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 600000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 112500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 187500 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 12500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 25000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 50000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 100000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 200000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 400000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 125000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 56250 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 93750 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 62500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 28125 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 46875 bps
00004937 commands.c:997:CmdEscapeCheck error on byte 10
00000016 ccid.c:215:set_gemalto_firmware_features() GET_FIRMWARE_FEATURES failed: 612, len=0
00000011 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFB3, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00000006 readerfactory.c:355:RFAddReader() Using the reader polling thread
00000402 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFAE, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00000011 ifdhandler.c:463:IFDHGetCapabilities() Reader supports 1 slot(s)
00000819 ifdhandler.c:1139:IFDHPowerICC() action: PowerUp, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00062462 eventhandler.c:289:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000058 Card ATR: 3B 7D 18 00 02 80 57 59 50 53 49 44 30 33 83 7F 90 00
05001033 ifdhandler.c:1139:IFDHPowerICC() action: PowerDown, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00011637 eventhandler.c:478:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED
Em um outro terminal execute o comando que vai se comunicar com a leitora:
# opensc-tool --list-readers
Se deu tudo certo ele vai relatar a leitora, como pode ser visto abaixo:
# Detected readers (pcsc)
Nr. Card Features Name
0 Yes Gemalto PC Twin Reader (ABA0D442) 00 00
O daemon deve executar junto com o sistema, então estes passos de debug não são necessários executar toda vez, em teoria é só plugar a leitora e tocar a vida depois disto.
Vamos instalar o software do SafeSign para o Debian:
# wget http://loja.certificadodigital.com.br/Serasa/UPLOAD/Downloads/591.zip
# unzip 591.zip
# dpkg -i Debian\ 5.0.5/i386/SafeSignIdentityClient-3.0.43-admin.i386.deb
Este software instala o programa de gerenciamento do token, o tokenadmin, e as bibliotecas de comunicação com a leitora que iremos utilizar para configurar o Firefox.
Através do tokenadmin você consegue visualizar da mesma forma que em outros sistemas operacionais o seu certificado, o estado etc, bem legalzinho.
# dmesg
[12477.084422] usb 1-1: new full-speed USB device number 13 using xhci_hcd
[12477.253618] usb 1-1: New USB device found, idVendor=08e6, idProduct=3437
[12477.253622] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12477.253626] usb 1-1: Product: USB SmartCard Reader
[12477.253628] usb 1-1: Manufacturer: Gemalto
[12477.253630] usb 1-1: SerialNumber: ABA0D442
Veja que o módulo do kernel que gerencia o dispositivo é o xhci_hcd, pois bem este é o básico, a primeira parte do funcionamento é o kernel ser capaz de gerenciar o dispositivo.
Reconhecido o dispositivo, o próximo passo é instalar o daemon que fornecerá a interface de comunicação com a leitora, no caso o software do daemon que fará a comunicação com a leitora é o pcscd (Personal Computers with Smart Cards Daemon).
Fazendo o daemon conversar com a leitora, programas adicionais como o Firefox, utilizarão bibliotecas padrões para se comunicar com o daemon.
Efetuando Instalação (Debian)
Como o Debian é a distribuição mãe (do meu coração rsrs), vou focar nela, mas com certeza servirá de referência para outras distribuições.Como root, instale os pacotes necessários:
# apt-get install libgempc430 opensc libccid pcscd
O daemon pcscd deve gerenciar o dispositivo, mas a propósito de diagnóstico, vamos para o daemon e executar o comando em modo debug, se tudo der certo este passo não será necessário, então se você não quer debugar nada pode pular este passo.
Ainda como root, parar o daemon:
# service pcscd stop
Execute-o em primeiro plano com o debug ativo (sem a leitora):
# pcscd -f -d
Deve surgir na tela algo parecido com isto:
00000000 debuglog.c:292:DebugLogSetLevel() debug level=debug
00000329 configfile.l:283:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000075 configfile.l:355:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000131 configfile.l:317:DBGetReaderListDir() Skipping non regular file: ..
00000030 configfile.l:317:DBGetReaderListDir() Skipping non regular file: .
00000038 pcscdaemon.c:569:main() pcsc-lite 1.8.13 daemon ready.
00003546 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000252 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000232 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1BCF, PID: 0x0005, path: /dev/bus/usb/001/002
00000213 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000241 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x04F2, PID: 0xB40A, path: /dev/bus/usb/001/003
00000213 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x04F2, PID: 0xB40A, path: /dev/bus/usb/001/003
00000204 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0002, path: /dev/bus/usb/001/001
00000209 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x058F, PID: 0x6366, path: /dev/bus/usb/001/004
00000259 hotplug_libudev.c:296:get_driver() Looking for a driver for VID: 0x1D6B, PID: 0x0003, path: /dev/bus/usb/002/001
Agora plugue a leitora, se deu tudo certo algo assim deve surgir na tela:
00001000 ccid_usb.c:595:OpenUSBByName() Found Vendor/Product: 08E6/3437 (Gemalto PC Twin Reader)
00000007 ccid_usb.c:597:OpenUSBByName() Using USB bus/device: 1/15
00002564 ccid_usb.c:1125:get_data_rates() declared: 12903 bps
00000017 ccid_usb.c:1125:get_data_rates() declared: 25806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 51613 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 103226 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 206452 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 412903 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 825806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 154839 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 258065 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 17204 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 34409 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 68817 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 137634 bps
00000014 ccid_usb.c:1125:get_data_rates() declared: 275269 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 550538 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 172043 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 12403 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 24806 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 49612 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 99225 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 198450 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 396899 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 74419 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 124031 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 86022 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 38710 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 64516 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 10323 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 20645 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 41290 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 82581 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 165161 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 30968 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 18750 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 37500 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 75000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 150000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 300000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 600000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 112500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 187500 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 12500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 25000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 50000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 100000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 200000 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 400000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 125000 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 56250 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 93750 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 62500 bps
00000005 ccid_usb.c:1125:get_data_rates() declared: 28125 bps
00000006 ccid_usb.c:1125:get_data_rates() declared: 46875 bps
00004937 commands.c:997:CmdEscapeCheck error on byte 10
00000016 ccid.c:215:set_gemalto_firmware_features() GET_FIRMWARE_FEATURES failed: 612, len=0
00000011 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFB3, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00000006 readerfactory.c:355:RFAddReader() Using the reader polling thread
00000402 ifdhandler.c:375:IFDHGetCapabilities() tag: 0xFAE, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00000011 ifdhandler.c:463:IFDHGetCapabilities() Reader supports 1 slot(s)
00000819 ifdhandler.c:1139:IFDHPowerICC() action: PowerUp, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00062462 eventhandler.c:289:EHStatusHandlerThread() powerState: POWER_STATE_POWERED
00000058 Card ATR: 3B 7D 18 00 02 80 57 59 50 53 49 44 30 33 83 7F 90 00
05001033 ifdhandler.c:1139:IFDHPowerICC() action: PowerDown, usb:08e6/3437:libudev:0:/dev/bus/usb/001/015 (lun: 0)
00011637 eventhandler.c:478:EHStatusHandlerThread() powerState: POWER_STATE_UNPOWERED
Em um outro terminal execute o comando que vai se comunicar com a leitora:
# opensc-tool --list-readers
Se deu tudo certo ele vai relatar a leitora, como pode ser visto abaixo:
# Detected readers (pcsc)
Nr. Card Features Name
0 Yes Gemalto PC Twin Reader (ABA0D442) 00 00
O daemon deve executar junto com o sistema, então estes passos de debug não são necessários executar toda vez, em teoria é só plugar a leitora e tocar a vida depois disto.
Vamos instalar o software do SafeSign para o Debian:
# wget http://loja.certificadodigital.com.br/Serasa/UPLOAD/Downloads/591.zip
# unzip 591.zip
# dpkg -i Debian\ 5.0.5/i386/SafeSignIdentityClient-3.0.43-admin.i386.deb
Este software instala o programa de gerenciamento do token, o tokenadmin, e as bibliotecas de comunicação com a leitora que iremos utilizar para configurar o Firefox.
Através do tokenadmin você consegue visualizar da mesma forma que em outros sistemas operacionais o seu certificado, o estado etc, bem legalzinho.
Carvalho ! Ótimo artigo , talvez deslumbre meu , mas foi um esforço e tanto , obrigado .
Sacioz...)))
.
:q