amagovpt / autenticacao.gov

Middleware Oficial de Identificação Eletrónica em Portugal - Cartão de Cidadão, da Chave Móvel Digital e Sistema de Certificação de atributos profissionais
https://www.autenticacao.gov.pt
European Union Public License 1.2
168 stars 33 forks source link

SDK em Linux para instalação com flatpak #141

Closed FexaMachado closed 1 year ago

FexaMachado commented 1 year ago

Nos novos ficheiros de instalação Linux para a versão mais recente (3.11.0), que estão no formato .flatpak, as bibliotecas não são criadas na pasta /usr/local/lib/.

Já tentei usar as bibliotecas que vêm da instalação dos pacotes .deb de versões anteriores. No entanto, no meu caso, é necessário a obtenção da morada pelos webservices online que são usados a partir da versão 3.9.0.

Além disto, também tentei instalar a aplicação através do source code, mas no momento da utilização acontece o seguinte erro: pt.gov.cartaodecidadao.PTEID_Exception
  at pt.gov.cartaodecidadao.pteidlibJava_WrapperJNI.PTEID_Address_getCountryCode(Native Method)
  at pt.gov.cartaodecidadao.PTEID_Address.getCountryCode(PTEID_Address.java:54)

De momento ando a utilizar Ubuntu 22 e Ubuntu 18 cujos ficheiros de instalação .deb são para as versões 3.8.1 e 3.1.1 respetivamente.

Se fosse possível, gostaria que disponibilizassem as bibliotecas na pasta /usr/local/lib como têm feito em versões anteriores.

agrr commented 1 year ago

Bom dia,

o pacote Flatpak tem de facto a limitação de que serve como meio de distribuição da aplicação e não do SDK.

Atualmente o que recomendamos aos utilizadores de Linux que pretendam utilizar o SDK é a instalação a partir do código fonte. Deve sempre garantir que o SDK Java que está a utilizar (pteidlibj.jar) foi originado no mesmo build que as bibliotecas nativas que ficam em /usr/local/lib. Para facilitar esta consistência fizemos hoje push de uma alteração (e99942f3ee365b22b883f650997392baf2db8750) para instalar o ficheiro pteidlibj.jar que foi compilado na localização esperada ao executar make install.

Deve atualizar o repositório e reinstalar em Ubuntu 22, Ubuntu 18 não suportamos porque esta distribuição não tem no repositório as dependências externas nas versões que usamos atualmente.

FexaMachado commented 1 year ago

Bom dia,

Depois de atualizar o repositório e executar os passos de compilação e execução como root, o ficheiro pteidlibj.jar não foi para /usr/local/lib/. Independentemente, fui buscá-lo à pasta pteid-mw-pt/_src/eidmw/jar/ e coloquei-o na pasta indicada.

Posteriormente, no momento da utilização da biblioteca ocorreu o mesmo erro que acima indiquei. pt.gov.cartaodecidadao.PTEID_Exception at pt.gov.cartaodecidadao.pteidlibJava_WrapperJNI.PTEID_Address_getCountryCode(Native Method) at pt.gov.cartaodecidadao.PTEID_Address.getCountryCode(PTEID_Address.java:54)

agrr commented 1 year ago

O pteidlibj.jar é instalado em /usr/local/lib/pteid_jni tal como indica o manual: https://amagovpt.github.io/docs.autenticacao.gov/manual_sdk.html#linux

De qualquer forma pode ser carregado de outra localização desde que esteja consistente com as bibliotecas nativas.

Para podermos despistar o que acontece deve ativar o modo debug adicionando estas linhas ao ficheiro $HOME/.config/pteid.conf:

[logging]
log_level=debug

Depois de voltar a executar a leitura de morada, pedimos para partilhar as últimas linhas do ficheiro de log, que deverá estar em $HOME/.PTEID_0.log

FexaMachado commented 1 year ago

Já encontrei o problema, estava na conecção a morada.cartaodecidadao.pt do meu lado.

Para concluir, é possível, simplesmente, copiar estes ficheiros .so e colocá-los nas diversas máquinas dos clientes?

agrr commented 1 year ago

Sim, é possível distribuir esses ficheiros .so junto com a aplicação se adicionar a seguinte pasta de certificados /usr/local/share/certs/ e todo o seu conteúdo e o executável /usr/local/bin/pteiddialogsQTsrv.

Funcionará em máquinas também com Ubuntu 22 desde que tenham instalados os seguintes pacotes dos repositórios: pcscd libcurl4 libopenjp2-7 libpcsclite1 libpng16-16 libqt5gui5 libqt5widgets5 libssl3 libxerces-c3.2 libxml-security-c20 libzip4

FexaMachado commented 1 year ago

Já estive a experimentar numa VM Ubuntu22 instalar o flatpak e copiar os ficheiros previamente gerados, os *.so, certs e o pteiddialogsQTsrv. No entanto, está-me a dar um erro quando a o SDK tenta usar os certificados.

2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/DigicertRoot.der
  2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/CartaodeCidadao003.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/Multicert_Root_01.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/BaltimoreCyberTrustRoot.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/CartaodeCidadao006.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/CartaodeCidadao004.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/Usertrust_RSA_Certification_Authority.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/ECRaizEstado_MC.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/ECRaizEstado002.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/CartaodeCidadao005.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/GlobalChambersignRoot-2008.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: APL_Certifs::foundCertificate: problem with file /usr/local/share/certs/CartaodeCidadao002.der
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - DEBUG: DEBUG: countSODCAs returns 0  
2023-07-17 17:13:47 - 17342|140154712094272 - applayer - ERROR: EidFile_Sod:: Error validating SOD signature. OpenSSL errors:
40F6D34F787F0000:error:10800075:PKCS7 routines:PKCS7_verify:certificate verify error:../crypto/pkcs7/pk7_smime.c:293:Verify error: unable to get local issuer certificate
2023-07-17 17:13:47 - 17342|140154712094272 - eidlib - DEBUG: PTEID_Exception generated from CardPteid.cpp:1477 error code: e1d01c08

É necessário fazer mais alguma coisa depois de copiar os certs para a pasta /usr/local/share/certs/? Já andei a tentar mexer com o openssl, mas sem sucesso.

agrr commented 1 year ago

Esses erros indicam que uma função do SDK encontrou esses ficheiros mas não os consegue abrir ou ler. Deve verificar se o utilizador tem permissão para ler os ficheiros.

Para corrigir as permissões deve funcionar o comando chmod 644 /usr/local/share/certs/*.der

FexaMachado commented 1 year ago

Já conseguiu ler. Agora dá o seguinte erro depois de pedir o PIN da morada.

2023-07-18 10:27:29 - 3889|140020750673472 - applayer - DEBUG: post_json_remoteaddress called for endpoint_url: https://morada.cartaodecidadao.pt/readaddress/sendDHParams
2023-07-18 10:27:29 - 3889|140020750673472 - applayer - ERROR: RemoteAddress call to /sendDHParams failed! Using proxy: 0 curl error code: 77 curl message: Problem with the SSL CA cert (path? access rights?)
2023-07-18 10:27:29 - 3889|140020750673472 - eidlib - DEBUG: PTEID_Exception generated from RemoteAddressRequest.cpp:76 error code: e1d01d59

Já tentei adicionar o cacerts.pem a /usr/local/share/ca-certificates/ e fazer update-ca-certificates, mas sem sucesso.

Obrigado pela ajuda.

agrr commented 1 year ago

Deverá ser um problema idêntico no /usr/local/share/certs/cacerts.pem Também precisa de permissão de leitura que pode ser aplicada com chmod 644 /usr/local/share/certs/cacerts.pem

FexaMachado commented 1 year ago

Já experimentei com essas permissões. Até com chmod 777, mas continua com o mesmo erro.

FexaMachado commented 1 year ago

Para fornecer mais informação, os passos que faço numa nova VM Ubuntu22 são:

apt install flatpak
apt install gnome-software-plugin-flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
reboot

flatpak install pteid-mw-linux.x86_64.flatpak

apt install -y pcscd libcurl4 libcurl4-nss-dev libopenjp2-7 libpcsclite1 libpng16-16 libqt5gui5 libqt5widgets5 libssl3 libxerces-c3.2 libxml-security-c20 libzip4
systemctl enable pcscd.socket
systemctl enable pcscd
# usando os ficheiros que copiei de outra máquina aonde instalei a partir do repositório e a minha aplicação funcionou 
cp -r ./usr_local_bin/* /usr/local/bin/ # pteiddialogsQTsrv
cp -r ./usr_local_lib/* /usr/local/lib/ # ficheiros .so
# crio os symlinks 
ln -s /usr/local/lib/libCMDServices.so.1.0.0 /usr/local/lib/libCMDServices.so 
...
chmod +rx /usr/local/lib/*
ldconfig
mkdir -p /usr/local/share/certs && cp -r ./usr_local_share_certs/* /usr/local/share/certs/ # certs
chmod 644 /usr/local/share/certs/*
reboot

Adicionei o pacote libcurl4-nss-dev ao apt install, porque me dá erro ao carregar as bibliotecas sem ele. E verifico que continua com o mesmo erro que mencionei anteriormente.

agrr commented 1 year ago

Deverá estar instalada a libcurl4 e não a libcurl4-nss-dev nem a libcurl3-nss , sugiro desinstalar estes pacotes se possível. O backend openssl da libcurl é o que nós utilizamos no projeto.

Os 4 primeiros comandos de instalação do pacote flatpak são desnecessários já que a instalação do flatpak fica dentro de um sandbox como tal as bibliotecas incluidas no .flatpak não são acessíveis para outras aplicações.

FexaMachado commented 1 year ago

Quando só instalo a libcurl4 mostra-me o seguinte erro: java.lang.UnsatisfiedLinkError: /usr/local/lib/libpteidlibj.so.2.0.0: libcurl-nss.so.4: cannot open shared object file: No such file or directory

A libcurl4-nss-dev é a que é recomendada, no README do vosso repositório, na instalação através do código-fonte.

agrr commented 1 year ago

Tem razão está errada essa dependência no README, o que usamos nas builds oficiais é sempre libcurl com o backend openssl.

Terá de recompilar o projeto com o pacote libcurl4-openssl-dev instalado em vez do libcurl4-nss-dev.

No sistema de execução (VM) ficará com dependência da libcurl4 ou seja o pacote libcurl4-openssl-dev não é necessário.

FexaMachado commented 1 year ago

Já esta tudo a correr bem.

Envio no zip, os ficheiros usados e um script com os comandos em linux que usei para pôr tudo a funcionar em ubuntu 22.

Agradeço ao @agrr pelo tempo e pela ajuda que têm dado. ubuntu22_AutenticacaoGov_install.zip