Configuração do Ubuntu 16.04 para acesso com cartão ao Banrisul

Este artigo tem o objetivo de apresentar workarounds para possíveis problemas de compatibilidade do leitor de cartões Vasco com novas distribuições do Ubuntu, além da instalação dos pacotes e extensões necessários para o funcionamento do Internet Banking do Banrisul no Linux.

[ Hits: 9.832 ]

Por: Eduardo Mozart de Oliveira em 18/01/2019 | Blog: http://www.eduardomozartdeoliveira.wordpress.com/


Introdução



O Banrisul é, orgulhosamente, o banco dos gaúchos. Orgulhosamente, ele não usa o Warsaw como módulo de segurança, porém, usa Java e um leitor de cartão Vasco DigitalPass 905, leitor que possuí relatos de incompatibilidade à partir do Ubuntu 13.10 [2][7].

Este artigo tem o objetivo de apresentar workarounds para possíveis problemas de compatibilidade do leitor de cartões Vasco com novas distribuições do Ubuntu, além da instalação dos pacotes e extensões necessários para o funcionamento do Internet Banking do Banrisul no Linux.

Instalação do complemento Banrisul

Alguns sites utilizam a tecnologia Java para realizar a autenticação através de certificados digitais, como o Banrisul e órgãos governamentais (TRT, TJRS, entre outros).

Devido a recente política de fim de suporte a plugins NPAPI, adotada pela Google Chrome a partir da versão 45 do navegador (e seguida posteriormente por outros navegadores, como o Mozilla Firefox), o Java tornou-se incompatível com novas versões dos principais navegadores do mercado.

Como alternativa ao fim de suporte a plugins NPAPI, alguns órgãos (como o TRT) adotaram o uso de versões portáteis do navegador Mozilla Firefox (navegador PJe, no caso do TRT), na qual utilizam uma versão anterior do navegador que ainda possuía compatibilidade com o plugin Java. Porém, outra solução (mais elegante) adotada pelo CJST e pelo Banrisul que, para não ter que converter suas aplicações Java para outras linguagens, é adicionar um processo executado em segundo plano que escuta (listen) requisições em uma porta específica (caso do Shodo, do CJST) ou através da instalação de uma extensão do navegador (caso do Banrisul). De fato, o acesso a alguns recursos em páginas Web, como leitor de impressão digital e de cartões, não é suportada nativamente por todos os navegadores, sendo necessário o uso de extensões.

Felizmente, o listener do Banrisul suporta o OpenJDK, disponível nos repositórios do Ubuntu 16.04. Caso você não possua o OpenJDK (ou o Java) instalados, você pode instalar o OpenJDK através do comando:

sudo apt-get update && sudo apt-get install default-jre

Após a instalação do Java, é necessário instalar o listener do Banrisul. Ele pode ser obtido em: http://www.banrisul.com/firefox.

No rodapé da página, na seção "Links Relacionados Ordenados", clique em "Complemento Chrome e Firefox para Linux" para baixar o pacote DEB.
Após a instalação do pacote DEB, abra o Terminal (Alt + T), altere o diretório para o local que o pacote DEB foi baixado e execute o comando dpkg para realizar a (re)instalação do pacote.

sudo dpkg -i ~/Downloads/ComplementoBanrisul_Linux_122.deb

Instalação da extensão nos navegadores Mozilla Firefox e Google Chrome

Após a instalação do listener do Banrisul, é necessário instalar as extensões para os navegadores Mozilla Firefox e Google Chrome, que realizarão a comunicação com o listener durante o acesso ao Internet Banking com o leitor de cartões. Caso você possua ambos os navegadores, será necessário instalá-lo individualmente em cada navegador para acessar o Internet Banking através dos dois navegadores.

Após a instalação do Java, é necessário instalar o listener do Banrisul. Ele pode ser obtido em: http://www.banrisul.com/firefox.
No rodapé da página, na seção "Links Relacionados Ordenados", clique em "Extensão Banrisul Internet Banking (exclusivo para Google Chrome)" para baixar a extensão para Google Chrome. Abrirá a Chrome Web Store com a página da extensão do Banrisul para Google Chrome. Clique no botão "Usar no Chrome" para realizar a instalação da extensão.
Para realizar a instalação da extensão para o Mozilla Firefox, clique em "Extensão Banrisul Internet Banking (exclusivo para Mozilla Firefox)". O Mozilla Firefox abrirá uma segunda aba, perguntando se você deseja instalar a extensão de fonte desconhecida. Clique em "Permitir" para realizar a instalação.

Instalação do suporte a Leitor de Cartões no Linux

Segundo o Manual de Instalação de leitoras smartCard do Banrisul [3], para que o leitor de cartões seja reconhecido no Linux, é necessário instalar o pacote pcscd. Para que o leitor de cartões Vasco DigitalPass 905 seja reconhecido no Linux, é necessário instalar a biblioteca libccid, que provê drivers para leitoras de cartões CCID. O procedimento varia de acordo com cada distribuição. Além do Ubuntu, o manual possuí o procedimento para outras distribuições.

No Ubuntu, os pacotes estão disponível nos repositórios oficiais e podem ser instalado através do seguinte comando:

sudo apt-get update && sudo apt-get install pcscd libccid

É recomendado instalar o pacote libpcsclite1, que permite outros aplicativos acessarem o leitor de cartões através da API PCSC-Lite. [3][4]

sudo apt-get update && sudo apt-get install libpcsclite1 libpcsclite-dev

Outras ferramentas opcionais para diagnosticar possíveis problemas de detecção do leitor de cartões e do cartão em si são os pacotes pcsc-tools e o opensc. [4] O pcsc-tool disponibiliza o comando pcsc_scan, que exibe no terminal quando um cartão é inserido ou removido do leitor, e o pacote opensc disponibiliza o utilitário opensc-tool [5], que lista os objetos presentes no cartão (certificado digital).

sudo apt-get update && sudo apt-get install pcsc-tool opensc

O Banrisul usa o padrão internacional para acesso ao cartão inteligente (PC/SC) [3], porém, alguns aplicativos usam o padrão germânico para comunicação com o leitor de cartão inteligente, que é implementada pela biblioteca OpenCT [6]. Para instalar a biblioteca OpenCT, instale o pacote openct, que também acompanha o utilitário openct-tool:

sudo apt-get update && sudo apt-get install openct

Workaround caso o leitor de cartão esteja sendo desconectado após a reinicialização

A leitoria de cartão Vasco DigitalPass 905 possuí dois leds indicativos: um verde e um vermelho, conforme a imagem abaixo.
O led verde (Power) indica que o leitor está conectado a porta USB do computador, e o vermelho indica operações de leitura ao cartão. Após a instalação dos pacotes necessários para que o leitor fosse reconhecido pelo Ubuntu, o Internet Banking reconheceu o cartão e entrou normalmente. Porém, após a reinicialização do computador, o leitor de cartões acendia ambas as luzes (quando o cartão estava inserido) e logo apagava todas as luzes após a exibição da tela de logon.

Ao parar o serviço pcscd (que identifica a conexão de leitores de cartões e realiza a instalação do leitor) e iniciá-lo em modo foreground (para exibir as informações no console), recebia a seguinte mensagem:

sudo service stop pcscd sudo pcscd -f
00000000 ccid_usb.c:786:ReadUSB() read failed (1/2): -7 LIBUSB_ERROR_TIMEOUT
05000798 ccid_usb.c:747:WriteUSB() write failed (1/2): -7 LIBUSB_ERROR_TIMEOUT
05000403 ccid_usb.c:747:WriteUSB() write failed (1/2): -7 LIBUSB_ERROR_TIMEOUT
00000027 ifdhandler.c:158:CreateChannelByNameOrChannel() failed
00000021 readerfactory.c:1020:RFInitializeReader() Open Port 0x200000 Failed (usb:1a44/0001:libudev:0:/dev/bus/usb/002/006)
00000009 readerfactory.c:312:RFAddReader() VASCO DP905v1.1 init failed.
00000126 hotplug_libudev.c:391:HPAddDevice() Failed adding USB device: VASCO DP905v1.1


Ao executar o comando "lsusb", pude verificar que o leitor de cartões era reconhecido:

lsusb -t
Bus 008 Device 014: ID 1a44:0001 VASCO Data Security International Digipass 905 SmartCard Reader

Há diversos relatos de problemas específicos com o leitor da Vasco a partir do Ubuntu 13.10. [2][7]. Quando você pluga um leitor de cartão Vasco DP905v1.1 antes que o pcscd inicie e aguarda uns instantes, o led de 'power' verde no dispositivo desliga, indicando que o dispositivo está em modo de baixa energia. Quando isso acontece, devido a um problema específico deste modelo de leitor de cartões, é impossível reviver o leitor de cartão sem desconectar e reconectar o bus USB [7] (ou o dispositivo).

A forma mais óbvia de resolver o problema é desconectar o leitor de cartão da porta USB, reconectá-lo novamente e reiniciar o daemon pcscd [2][7]. Porém, este processo não é intuitivo para o usuário iniciante, além de não ser prático no dia-a-dia realizar este procedimento todas ás vezes que reiniciar/desligar o computador e querer usar o leitor.

Pesquisando na internet, pude encontrar no Ask Ubuntu um script que permite desconectar apenas o leitor de cartão Vasco do bus USB (através da identificação do fabricante e dispositivo) e reconectá-lo após 0.5 segundos. [1] Ele deve ser executado logo após o login do usuário. Para tanto, é necessário adicioná-lo ao PAM. O PAM (Pluggable Authentication Modules) determina como a autenticação, autorização e alteração de senha são tratados no sistema, assim como permite a configuração de ações adicionais a serem tomadas quando sessões de usuário são iniciadas.

Em um ambiente corporativo Active Directory, é possível adicionar o script abaixo ao script de logon "logon_root.sh" do c-i-d (Closed in Directory), de forma a executá-lo toda vez que um usuário realizar login no computador da rede. Você encontra o c-i-d e seu manual em: https://sourceforge.net/projects/c-i-d/.

Porém, para usuários que não estão em uma rede corporativa ou não usam o c-i-d, é necessário adicionar o script manualmente ao PAM. Abra o Terminal (Alt + T) e crie o arquivo usbreset.bash em /usr/local/sbin com os seguintes comandos:

sudo nano /usr/local/sbin/usbreset.bash

#!/bin/bash

set -euo pipefail
IFS=$'
	'

VENDOR="045e"
PRODUCT="0719"

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done

Para salvar o arquivo, pressione a combinação de teclas Ctrl + o e Enter. Você também pode criar o arquivo através do gedit, caso prefira editá-lo através da interface gráfica.

Dê permissão de execução para o arquivo através do comando:

sudo chmod +x /usr/local/sbin/usbreset.bash

Agora, precisamos editar o arquivo /etc/pam.d/common-session e adicione o script usbreset.bash:

sudo nano /etc/pam.d/common-session

session [default=1]                     pam_permit.so
session requisite                       pam_deny.so
session required                        pam_permit.so
session optional                        pam_umask.so
session [success=7 default=ignore]      pam_succeed_if.so quiet uid < 10000
session required        pam_mkhomedir.so silent skel=/etc/skel/ umask=0077
session optional        pam_winbind.so
session [success=4 default=ignore]      pam_succeed_if.so quiet service != login service !~ ssh* service !~ gd$
session optional        pam_mount.so
session optional        pam_exec.so debug quiet /usr/share/cid/scripts/usbreset.bash
session optional        pam_mount.so
session required        pam_unix.so
session optional        pam_systemd.so

Alguns usuários também relatam problemas com o leitor devido a ele desconectar após um certo período de inatividade. Para impedir que o computador desligue o dispositivo para economizar energia, crie o arquivo usb-power.rules em /etc/udev/rules.d com o conteúdo:

sudo nano /etc/udev/rules.d/usb-power.rules

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="1a44", ATTR{idProduct}=="0001", TEST=="power/control", ATTR{power/control}="on"

Alguns usuários também relataram problemas de falhas de segmentação (ocorre quando um programa tenta aceder [ler ou gravar] a um endereço na memória RAM que está reservado para outro programa) ao conectar o leitor de cartões devido ao driver pn533. Para instruir o kernel a carregar o driver libpcsd-lite, desabilite os drivers pn533 e libnfc adicionando-os a blacklist com os comandos [2]:

# echo "install nfc /bin/false" >> /etc/modprobe.d/blacklist.conf # echo "install pn533 /bin/false" >> /etc/modprobe.d/blacklist.conf

Agora, reinicie o computador e verifique se o leitor de cartões é identificado normalmente ao acessar o Internet Banking do Banrisul.

Você também pode abrir uma janela do Terminal (Alt + T) para verificar se tudo está funcionando normalmente [5]:

sudo opensc-tool -a
Exibe o status do cartão (ATR).

sudo opensc-tool -s 00:A4:04:00:07:A0:00:00:00:04:80:02:00
Exibe a MasterCard.

Referências

1. How do you reset a USB device from the command line?. Ask Ubuntu. - Acesso em: 12 jan. 2018.

2. Smartcard reader Vasco DP905 does not work anymore after upgrade to Ubuntu 13.10. Ask Ubuntu. - Acesso em: 12 jan. 2018.

3. Manual de Instalação de Leitoras SmartCard. Banrisul. - Acesso em: 12 jan. 2018.

4. Como instalar o leitor de smart card do Banrisul no Ubuntu 11.04. Meira da Rocha. - Acesso em: 12 jan. 2018.

5. How to install the DIGIPASS 905 on Ubuntu?. VASCO Data Security International, Inc. - Acesso em: 12 jan. 2018.

6. OpenCT. Gentoo Wiki. - Acesso em: 12 jan. 2018.

7. Bug #1366747 "libudev1 seems to cause a segfault in pcscd when a Vasco DP905v1.1 smart card reader is inserted before pcscd is started". Ubuntu Bugs. - Acesso em: 12 jan. 2018.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Solução para Ubuntu sem som

Instalação e Configuração do Zabbix 3 e Agentes (Linux/Windows)

Como resolver problemas com o pkg-config

Desfragmentando partições NTFS no Linux

Instalação do Driver ATI Radeon XPRESS 200 no Ubuntu 16.04

Leitura recomendada

Crise de distro!

Comandos básicos do Linux

Visualizando informações sobre o sistema

Instalando o Gentoo Linux através do live-cd do Ubuntu

Tipos de permissões especiais GNU/Linux

  
Comentários
[1] Comentário enviado por fabio em 18/01/2019 - 11:31h

Boa Eduardo, como sempre, mais um trabalho com excelente didática e nível de detalhamento.

[2] Comentário enviado por eduardomozart em 30/01/2019 - 16:16h

Gostaria de realizar uma correção no script "usbreset.sh" publicado no artigo de minha autoria.

No script, os valores VENDOR e PRODUCT estão incorretas. Elas são:

VENDOR="045e"
PRODUCT="0719"

Quando deveriam ser:

VENDOR="1a44"
PRODUCT="0001"

Também é necessário realizar uma pequena correção no caminho do script usbreset.bash no arquivo /etc/pam.d/common-session.

Ele está apontando para /usr/share/cid/scripts/usbreset.bash, quando deveria estar apontando para /usr/share/sbin/usbreset.bash.

Att.
Eduardo Mozart de Oliveira


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts