Muito bem, finalmente chegou a hora de compilar nossa aplicação e instalar ela em um cartão Físico. Para tanto é necessário um cartão Java Card de Desenvolvimento também conhecido por Engineering Sample e um leitor de SmartCards de contato padrão PC/SC.
Essa sem dúvidas será a parte mais chata de todo processo, digo isso pois existem algumas variáveis importantes a serem observadas.
É um Java Card 2.1 ou 2.1.1 ou 2.2 ou 2.2.1 ou 2.2.2?
Lembrem-se que no artigo o qual eu instruo a configurar o ambiente, eu recomendei que fosse baixada a versão do JCDK (Java Card Development Kit) 2.2.2, pois o plug-in do Simulador para Eclipse necessita do JCDK2.2.2.
Pois bem, caso você possua um cartão Java Card 2.2.1, o que for compilado com o JCDK 2.2.2 não irá funcionar nesse cartão. Ou seja você terá que baixar o JCDK2.2.1 e configurar a variável de ambiente "JC_HOME" para apontar para o JCDK221.
É um cartão GlobalPlatform 2.0.1 ou 2.1 ou 2.1.1 ou 2.2?
A maioria dos cartões utilizam a especificação 2.1.1. Porém cartões da Oberthur Cosmos utilizam a especificação 2.0.1.
Qual versão de Secure Channel Protocol ele utiliza, versão 1 ou 2 ou 3?
Cartões como Oberthur Cosmos e Gemxpresso utilizam a versão 1, enquanto cartões com JCOP's da NXP utilizam a versão 2. Porém isso não é uma regra.
Qual é a chave 3DES utilizada no Secure Channel Protocol?
Se for um cartão Java Card de Desenvolvimento, muito provavelmente será a chave padrão Visa Open Platform que consiste de 1 a 3 chaves no seguinte padrão:
0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 0x48 0x49 0x4A 0x4B 0x4C 0x4D 0x4E 0x4F
Caso eu não saiba, como eu descubro isso?
Pergunte para o fabricante do qual você comprou o cartão, ou verifique no Manual (Datasheet) do seu cartão.
Nesse tutorial eu usarei como Base o cartão JCOP 2.4.1 de 80Kb da NXP.
- Java Card 2.2.2
- GlobalPlatform 2.1.1
- Secure Channel Protocol 2
- 3 Chaves 3DES padrão Visa Open Platform
Ferramenta Necessária :
Compilando um .CAP
Abra seu Eclipse e carregue o Projeto do artigo anterior e vamos descobrir onde o Eclipse salva nosso projeto. Para isso vá no menu "File > Switch Workspace > Other..." e verifique o caminho na qual sua Aplicação se encontra.
Vá até o diretório "seu_workspace\JCApplets" e crie um arquivo "build.bat" utilizando o Bloco de Notas.
Edite o build.bat e adicione os seguintes comandos abaixo:
Após isso ele configura o classpath e os parâmetros de compilação a ser passada para o compilador javac.
Depois o diretório "bin" é previamente limpo e todos os arquivos ".exp" (Export Files) copiados para dentro da mesma. Export Files são como arquivos Headers ".h" da Linguagem C e serve para se linkar as classes e métodos utilizado da API Java Card pelo nosso Applet.
O aplicativo "converter" fornecido pelo JCDK lê o scipt contido no arquivo "JCHelloWorld.opt" e converte o arquivo compilado pelo javac para o arquivo ".cap" que será instalado no cartão.
Agora vá até o diretório "seu_workspace\JCApplets\src\jchellorworld" crie o arquivo "JCHelloWorld.opt".
E adicione os seguinte comandos abaixo:
Na linha 3 definimos o AID do nosso Applet, também conhecido como "Module" no caso o mesmo que o Eclipse gerou para nós.
Na linha 4 informamos o package da nossa aplicação "jchellorworld".
Na linha 5 definimos o RID do Package, também conhecido como "Load File".
Agora execute o "build.bat" e o resultado esperado deve ser similar a figura abaixo:
Muito bem, se chegou até aqui compilou com sucesso um ".cap" que nada mais é que o Applet que será carregado e executado no cartão.
Agora vá até o diretório "seu_workspace\JCApplets\bin\jchellorworld\javacard" e copie o arquivo "jchellorworld.cap" para dentro da pasta "C:\GPShell-X.Y.Z".
Uma rápida olhada na pasta do GPShell e podemos notar vários arquivos de texto contendo vários scripts para diversos cartões.
Crie um arquivo de nome "InstallMyHello.txt" e adicione os seguintes comandos:
Na linha 4 Estabilizamos um contexto com a Camada PC/SC.
Na linha 5 Abrimos um canal de comunicação com o Leitor/Gravador.
Na linha 6 Selecionamos o Card Manager do Cartão.
Na linha 7 Realizamos o Mutual Authenticate (Open Secure Channel Protocol).
Nas linhas 8 e 9 Apagamos versões anteriores do Applet que estamos instalando.
Na linha 10 Instalamos e Tornamos o Applet Selecionavel.
Nas linhas 11 a 13 Listamos os Applets disponíveis como Card Manager e nosso próprio Applet.
Agora abra um Prompt de Comando e vá até o diretório do seu GPShell.
Digite o comando "GPShell < InstallMyHello.txt" vários APDU's serão trocados e no final certifique-se que o Applet foi instalado corretamente conforme a figura abaixo:
Finalmente, execute o GPShell simplesmente digitando "GPShell" no Prompt de Comando e vamos interagir com nosso Applet no cartão digitando os Seguintes comandos:
Na linha 2 estabilizamos um contexto com a camada PC/SC do Windows.
Na linha 3 conecta-mos com o cartão na Leitora.
Na linha 4 selecionamos o nosso Applet através do AID dele.
Na linha 5 enviamos o APDU de teste que nada mais é que o mesmo que usamos no artigo anterior para testar nosso Applet no JCWDE.
Se tudo ocorrer bem você deverá ter um resultado similar ao abaixo:
Com isso concluo a série de 3 Artigos ao qual levou você desde a parte em se adquirir as ferramentas todas Open Source, configuração do ambiente de desenvolvimento, desenvolvimento e teste no Simulador e por fim a compilação, deploy e teste em um cartão Físico.
Algumas ressalvas importantes, caso tenha dúvidas em qual spec Java Card, spec Global Platform, versão do Secure Channel Protocol, chave de sessão 3DES, etc. Do cartão que você tem em mãos, não tente pois os cartões possuem dispositivos de segurança que travam o mesmo após algumas (geralmente 10) tentativas de se estabelecer um Mutual Authentication sem sucesso, e uma vez travado é irreversível.
Tentar Instalar um Applet compilado no JCDK 2.2.2 em um cartão spec Java Card 2.2.1 resultará em um erro na hora da carga do Applet para o cartão.
Sim, seu SIM Card GSM no seu Celular ou seu Cartão de Débito/Crédito Bancário provavelmente são Java Cards (mas não com certeza), porém com certeza possuem mecanismos a mais de segurança, portanto não tentem estabelecer um canal seguro com eles.
Existe um plugin para Eclipse desenvolvida inicialmente pela IBM, agora distribuída pela NXP chamada de JCOP Tools é uma excelente (e cheia de Bugs também) ferramenta pois faz tudo o que descrevi nesses 3 artigos em um ambiente amigável e integrado ao Eclipse.
Porém para adquiri-la é necessário requerê-la junto a NXP e é uma verdadeira burocracia para consegui-la.
Caso você esteja interessado em adquirir cartões de Desenvolvimento Java Card você pode tentar através dessas empresa:
http://www.vivendi.inf.br/ - (Peça por JCOP21)
http://www.sonsun.com.br/ - (Peça por Kit Java Card)
Caso tenha tido dificuldades, baixe o projeto dos artigos por aqui.(link)
Um grande abraço a todos, até a próxima!
Abra seu Eclipse e carregue o Projeto do artigo anterior e vamos descobrir onde o Eclipse salva nosso projeto. Para isso vá no menu "File > Switch Workspace > Other..." e verifique o caminho na qual sua Aplicação se encontra.
Vá até o diretório "seu_workspace\JCApplets" e crie um arquivo "build.bat" utilizando o Bloco de Notas.
Edite o build.bat e adicione os seguintes comandos abaixo:
@ECHO OFF if "%OS%" == "Windows_NT" setlocal if not "%JAVA_HOME%" == "" goto check_tool echo Please set the JAVA_HOME environment variable. goto end :check_tool if not "%JC_HOME%" == "" goto doit echo Please set the JC_HOME environment variable. goto end :doit set JC_PATH=.;%CL_DIR%;%JC_HOME%\lib\api.jar set JCFLAGS=-g -d .\bin -source 1.2 -target 1.2 -classpath "%JC_PATH%" if exist bin del /s /q bin if not exist bin mkdir bin xcopy /s /y %JC_HOME%\api_export_files\*.* bin\ %JAVA_HOME%\bin\javac %JCFLAGS% src\jchellorworld\*.java cd bin call %JC_HOME%\bin\converter -config ..\src\jchellorworld\JCHelloWorld.opt :end if "%OS%" == "Windows_NT" endlocal pauseEsse arquivo é responsável pela compilação propriamente dita, ele verifica a presença das variáveis de ambiente "JAVA_HOME" e "JC_HOME".
Após isso ele configura o classpath e os parâmetros de compilação a ser passada para o compilador javac.
Depois o diretório "bin" é previamente limpo e todos os arquivos ".exp" (Export Files) copiados para dentro da mesma. Export Files são como arquivos Headers ".h" da Linguagem C e serve para se linkar as classes e métodos utilizado da API Java Card pelo nosso Applet.
O aplicativo "converter" fornecido pelo JCDK lê o scipt contido no arquivo "JCHelloWorld.opt" e converte o arquivo compilado pelo javac para o arquivo ".cap" que será instalado no cartão.
Agora vá até o diretório "seu_workspace\JCApplets\src\jchellorworld" crie o arquivo "JCHelloWorld.opt".
E adicione os seguinte comandos abaixo:
-out EXP JCA CAP -exportpath . -applet 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x00 jchellorworld.JCHelloWorld jchellorworld 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00 1.0Na linha 1 informamos que deverá ser gerado os arquivos ".exp", ".jca" e ".cap".
Na linha 3 definimos o AID do nosso Applet, também conhecido como "Module" no caso o mesmo que o Eclipse gerou para nós.
Na linha 4 informamos o package da nossa aplicação "jchellorworld".
Na linha 5 definimos o RID do Package, também conhecido como "Load File".
Agora execute o "build.bat" e o resultado esperado deve ser similar a figura abaixo:
Muito bem, se chegou até aqui compilou com sucesso um ".cap" que nada mais é que o Applet que será carregado e executado no cartão.
Agora vá até o diretório "seu_workspace\JCApplets\bin\jchellorworld\javacard" e copie o arquivo "jchellorworld.cap" para dentro da pasta "C:\GPShell-X.Y.Z".
Uma rápida olhada na pasta do GPShell e podemos notar vários arquivos de texto contendo vários scripts para diversos cartões.
Crie um arquivo de nome "InstallMyHello.txt" e adicione os seguintes comandos:
mode_211 enable_trace enable_timer establish_context card_connect select -AID a000000003000000 open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel delete -AID 0102030405060708090000 delete -AID 01020304050607080900 install -file jchellorworld.cap -nvDataLimit 2000 -instParam 00 -priv 2 get_status -element 10 get_status -element 20 get_status -element 40 card_disconnect release_contextNa linha 1 Definimos que usaremos o GlobalPlatform spec 2.1.1.
Na linha 4 Estabilizamos um contexto com a Camada PC/SC.
Na linha 5 Abrimos um canal de comunicação com o Leitor/Gravador.
Na linha 6 Selecionamos o Card Manager do Cartão.
Na linha 7 Realizamos o Mutual Authenticate (Open Secure Channel Protocol).
Nas linhas 8 e 9 Apagamos versões anteriores do Applet que estamos instalando.
Na linha 10 Instalamos e Tornamos o Applet Selecionavel.
Nas linhas 11 a 13 Listamos os Applets disponíveis como Card Manager e nosso próprio Applet.
Agora abra um Prompt de Comando e vá até o diretório do seu GPShell.
Digite o comando "GPShell < InstallMyHello.txt" vários APDU's serão trocados e no final certifique-se que o Applet foi instalado corretamente conforme a figura abaixo:
Finalmente, execute o GPShell simplesmente digitando "GPShell" no Prompt de Comando e vamos interagir com nosso Applet no cartão digitando os Seguintes comandos:
enable_trace establish_context card_connect select -AID 0102030405060708090000 send_apdu -sc 0 -APDU 00000000060A0B0C0D0E0FNa linha 1 habilitamos o Trace de APDU.
Na linha 2 estabilizamos um contexto com a camada PC/SC do Windows.
Na linha 3 conecta-mos com o cartão na Leitora.
Na linha 4 selecionamos o nosso Applet através do AID dele.
Na linha 5 enviamos o APDU de teste que nada mais é que o mesmo que usamos no artigo anterior para testar nosso Applet no JCWDE.
Se tudo ocorrer bem você deverá ter um resultado similar ao abaixo:
Com isso concluo a série de 3 Artigos ao qual levou você desde a parte em se adquirir as ferramentas todas Open Source, configuração do ambiente de desenvolvimento, desenvolvimento e teste no Simulador e por fim a compilação, deploy e teste em um cartão Físico.
Algumas ressalvas importantes, caso tenha dúvidas em qual spec Java Card, spec Global Platform, versão do Secure Channel Protocol, chave de sessão 3DES, etc. Do cartão que você tem em mãos, não tente pois os cartões possuem dispositivos de segurança que travam o mesmo após algumas (geralmente 10) tentativas de se estabelecer um Mutual Authentication sem sucesso, e uma vez travado é irreversível.
Tentar Instalar um Applet compilado no JCDK 2.2.2 em um cartão spec Java Card 2.2.1 resultará em um erro na hora da carga do Applet para o cartão.
Sim, seu SIM Card GSM no seu Celular ou seu Cartão de Débito/Crédito Bancário provavelmente são Java Cards (mas não com certeza), porém com certeza possuem mecanismos a mais de segurança, portanto não tentem estabelecer um canal seguro com eles.
Existe um plugin para Eclipse desenvolvida inicialmente pela IBM, agora distribuída pela NXP chamada de JCOP Tools é uma excelente (e cheia de Bugs também) ferramenta pois faz tudo o que descrevi nesses 3 artigos em um ambiente amigável e integrado ao Eclipse.
Porém para adquiri-la é necessário requerê-la junto a NXP e é uma verdadeira burocracia para consegui-la.
Caso você esteja interessado em adquirir cartões de Desenvolvimento Java Card você pode tentar através dessas empresa:
http://www.vivendi.inf.br/ - (Peça por JCOP21)
http://www.sonsun.com.br/ - (Peça por Kit Java Card)
Caso tenha tido dificuldades, baixe o projeto dos artigos por aqui.(link)
Um grande abraço a todos, até a próxima!
Olá Ricardo,
ResponderExcluirMuito interessante o seu tutorial, porém eu não consigo me conectar ao cartão. Ao mandar um select para a aplicação card manager, surge o seguinte erro:
mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
Command --> 00A4040008A000000003000000
Wrapped command --> 00A4040008A000000003000000
Response <-- 6A82
select_application() returns 0x80216A82 (6A82: The application to be selected could not be found.)
O arquivo que uso para tentar listar as aplicações do cartão é um modelo tirado dos exemplos que vem com o gpshell:
mode_211
enable_trace
establish_context
card_connect
select -AID a000000003000000
open_sc -security 1 -keyind 0 -keyver 0 -mac_key 404142434445464748494a4b4c4d4e4f -enc_key 404142434445464748494a4b4c4d4e4f // Open secure channel
get_status -element 10
card_disconnect
release_context
Qualquer ajuda seria bem vinda.
Obrigado,
Bruno Gomes
Complementando o comentário anterior, eu uso o leitor de cartão ACS-ACR38-U e um cartão NXP JCOP 21, ambos adquiridos da empresa sonsun.
ResponderExcluirAbs,
Bruno
Olá Bruno,
ResponderExcluirEsse problema está ocorrendo pq o cartão não foi pré-personalizado adequadamente.
Nesse caso você terá que entrar em contato com a SonSun para que eles efetuem a correta inicialização do Cartão.
Me passa um e-mail caso tenha problemas.
Abraços.
Olá Ricardo,
ResponderExcluirEstou passando pelo mesmo problemas que o Bruno,
Não existe uma forma de eu mesmo inicializar esta pré-personalização do cartão?
O que é necessário para este processo? algum hardware exclusivo ou coisa do tipo?
Olá Lúcio,
ResponderExcluirPara realizar esse processo é necessário uma chave secreta e o Manual do Chip.
O processo de pré-personalização consiste em configurar e inicializar diversos parametros do Chip, como velocidade de transmissão, máquina virtual, chaves criptograficas, global platform, etc.
Porem tanto a chave bem como o manual só é fornecida através de NDA (Non-Disclosure Agreements) pela fabricante do chip.
A pré-personalização é um processo obrigatório pela empresa que o comercializa.
Infelizmente só ela poderá lhe ajudar nesse caso.
Abraços.
Ola trabalho em uma Gráfica onde personalizamos cartoes para algumas empresas com bandeiras master e visa, estamos perdendo contratos pois so trabalhamos com tarja magnetica e hoje o padrao EMV esta sendo adotado, gostaria de saber como comprar o material necessario para implementaçao dessa tecnologia e os custos obrigado.
ResponderExcluirConsulte com as empresas que estão migrando para o padrão EMV, sobre como se certificar na Visa/Master Card para emissão de cartões EMV.
ExcluirOla ricardo voce possui algum software para que eu possa gravar Os dados diretamente no chip com a gemalto acr38 ... ?!
ResponderExcluirSe for um Applet como já havia dito utilize o GPShell, ser dados a ser gravados como Numeros ou Strings, isso vai depender de cartão para Cartão, caso seja um Java Card vc mesmo deverá desenvolver um programa para ser gravado no cartão, caso seja outro tipo de cartão vc deverá estudar o protocolo utilizado pelo cartão.
ResponderExcluirricardo vc tem algum email para que possa te enviar o projeto que quero gravar ?!
ResponderExcluirthiagomaniacosccs@gmail.com
ExcluirUm correção Ricardo,
ResponderExcluirSó consegui testar com sucesso quando inclui o 7F também no final do comando:
send_apdu -sc 0 -APDU 00000000060A0B0C0D0E0F7F
Alguém conhece algum site que vende o hardware necessário para iniciar os estudos em smart car precisa ser o pacote completo, mas sim os cartões que estou com dificuldade para encontrar. Se alguém puder indicar algum site agradeço.
ResponderExcluirBoa noite , gostaria de saber onde consigo compra o cartão com chip acho q o nome é jcop21 virgem , alguém pode me informar estou localizado no centro de são Paulo.
ResponderExcluirOlá Ricardo! Eu preciso de um profissional que faça essa instalação de um aplicativo java card no SIM card. Você tem interesse em conhecer o projeto ou tem alguma indicação de profissional que entende bem essa tecnologia para me indicar? Eu moro em Belo Horizonte.
ResponderExcluirthiagomaniacosccs@gmail.com quem trampa na gravaçao chama
ResponderExcluir