Autenticazione SOAP con Smartcard TS-CNS (Tessera Sanitaria) - Fascicolo Sanitario Elettronico

Salve Ragazzi, voglio sottoporvi un questio “bello duro”. Praticamente ho la necessità di collegarmi ad alcuni WS del Fascicolo Sanitario Elettronico e voglio farlo tramite TS-CNS usando l’apposito lettore di SmartCard, ma brancolo nel buio non avendolo mai fatto.

A qualcuno di voi è mai capitato di dover implementare qualcosa del genere? Ho due principali problemi:

1- Come faccio ad accedere ed usare il certificato presente sulla carta? Devo recuperarlo tramite il browser (che lo rileva) oppure in altro modo?
2- Una volta recuperato il cercificato, come lo utilizzo nella chiamata ai WS (in generale come si usa con il protocollo SOAP)?

Se riuscite a darmi una mano, ve ne sarei veramente grato, cercando sul web si trova molto poco e c’è tanta confusione sull’argomento. Grazie

1 Mi Piace

Buongiorno!
Io lo faccio su Linux con browser Firefox. Posso descrivere i vari passi per Ubuntu 20.04 e le TS sia di vecchio tipo, con contatti, sia quelle nuove con accesso contactless.

Ci sono in ogni caso alcuni “ma”.

  1. non sono passato a Ubuntu 22.04 perche’ c’era un’incompatibilita’ con i lettori smartcard e Firefox, adesso non ricordo tutti i dettagli, per cui quello che prima funzionava adesso non funziona piu’. Forse la questione e’ stata nel frattempo risolta, non lo so.
  2. Le TS sono di tipi diversi che dipendono dalla Regione e dall’anno d fabbricazione. Le prime, dal 2014, erano semplici da interfacciare le ultime sono piu’ complicate.
  3. Qualche mese fa, per curiosita’, ho provato ad accedere con la mia TS ai FSE di tutte le regioni italiane. Nulla di grave, a parte la mia rispondono “non sei registrato nei nostri database”. L’importante e’ che funzioni la procedura di accesso con la carta e PIN e successivo riconoscimento. In circa meta’ delle Regioni la mia TS non ha funzionato! Nelle altre i livelli sono diversissimi, e non vale la semplice relazione nel Nord funziona, nel Sud no. Alcune Regioni del Nord sono all’eta’ della pietra informatica, in alcune del Sud l’identificazione funziona bene.

Con le limitazioni di cui sopra, se interessa posso descrivere la mia procedura di installazione TS. Se il SO in oggetto e’ o Windows o Apple non saprei cosa consigliare.

Ciao, se puoi spiegarmi i tuoi passaggi te ne sarei grato. Grazie

Innanzitutto occorre tenere sempre presente che tutti i sistemi e metodi di identificazione via smart card sono “piu’ o meno” compatibili. Ci sono purtroppo numerose variazioni di tecnologia e implementazione che vanno risolte caso per caso.
In ambiente Linux i riferimenti principale online per la tecnologia e diversi tool sono i seguenti. Ad es possono servire a verificare che il lettore sia visto dal SO.

I passi principali di installazione della Tessera Sanitaria sono

  1. installazione driver del lettore di smartcard. Ev. verifica con i tool a comando.

  2. installazione middleware per la smartcard, scaricabile da
    https://sistemats1.sanita.finanze.it/portale/elenco-driver-cittadini-modalita-accesso

  3. Entrare in Firefox, scegliere i comandi Modifica - Preferenze - Avanzate; Selezionare il tab Certificati
    Premere tasto Dispositivi di sicurezza. Caricare il modulo “opensc-pkcs11.so” da
    /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so

Ora non ricordo se i manuali di installazione venivano caricati con i comandi di installazione della TS oppure si trovavano a link particolari. Ho fatto rapide ricerche e identificato questi due, da Regione Sardegna e da Trentino Alto Adige. Anche altre Regioni hanno i loro, occorre verificare sui loro siti dedicati alla TS.
http://download.istella.it/user/514876a8247819585d000002/originals/ef50392f/document_5253e61f49cd409e5900005e.pdf

Da alcuni mesi causa incertezze sul futuro della TS, oggi stesso e’ uscita la notizia che mancano i chip (o sono troppo costosi), uso la CIE che va benissimo.

Un’ultima considerazione. In Ubuntu/Firefox ci sono incompatibilita’ tra i moduli di sicurezza della TS e della CIE nello stesso browser Firefox. Se funziona uno, perlopiu’ non funziona l’altro. Anche qui niente certezza del tipo o va o non va, ma invece un “a volte va”. Per semplificarmi la vita ho definito un nuovo utente che uso solo per l’accesso con TS, mentre sul mio account principale vado con CIE. E’ giusto un backup di emergenza.

1 Mi Piace

Tornando alla domanda principale, il certificato privato sulla carta NON e’ accessibile in chiaro. Le operazioni crittografiche avvengono sulla carta tramite i driver e il SW che ho descritto, ma il certificato come tale non e’ leggibile.
Se quello che serve e’ il certificato pubblico, quello e’ accessibile con i comandi di OpenSC e non e’ necessario installare il resto.

1 Mi Piace

Grazie mille per l’aiuto. Sono riuscito ad ottenere il certificato e fare tutto quello che serve nella webapplication che sto scrivendo. Ora rimane il problema di capire come fare l’autenticazione ad un WSDL SOAP con SSL. Sai aiutarmi? Grazie.

Sinceramente non saprei. Pero’ i tool di OpenSC in Linux fanno parecchio. Ci sono diversi package con funzioni in parte sovrapposte, ma uno studio approfondito dei vari comandi aiuta. Si capisce anche meglio la logica delle carte con chip.
Resta un grosso “ma”. Le carte continuano a evolversi e gli sviluppatori di OpenSC sono costretti a inseguire una realta’ spesso non documentata, o solo parzialmente, e sono tutti volontari. Piu’ o meno dentro la materia, ma non pagati per questo lavoro. Il risultato e’ il meglio realizzabile nel mondo reale.

1 Mi Piace

ho affrontato un paio di mesi fa lo stesso problema, io ho fatto una implementazione in c#
Dall’wsdl ottieni i codici dei client con il comando apposito, questi li devi configurare specificando il tipo di comportamento e poi passare il certificato.
Ad esempio per la comunicazione dei metadati :

private comunicazioneMetadatiPTClient PrepareClientComunicazione()
{
comunicazioneMetadatiPTClient client = new comunicazioneMetadatiPTClient(EndPoints.EndPoint[SOAP.COMUNICAZIONE_METADATI].BasicHttpBinding, EndPoints.EndPoint[SOAP.COMUNICAZIONE_METADATI].EndpointAddress);
client.Endpoint.EndpointBehaviors.Add(new BasicAuthenticationBehavior(Credentials));
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None, RevocationMode = X509RevocationMode.NoCheck };
if (Credentials.Authorization == Credentials.AuthorizationMode.CNS) client.ClientCredentials.ClientCertificate.Certificate = Certificato.LoadFromSmartCard(Credentials);
return client;
}

Certificato.LoadFromSmartCard(Credentials) è la funzione che ti restituisce il certificato di tipo X509Certificate2
*Mentre per quanto riguarda il binding : *
EndPoints.EndPoint[SOAP.COMUNICAZIONE_METADATI].BasicHttpBinding
*Deve essere settato in questo modo : *

BasicHttpBinding binding = new BasicHttpBinding();
** binding.Security.Mode = BasicHttpSecurityMode.Transport;**
** binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;**
** return binding;**

Ciao, io onestamente non ho capito la procedura. Praticamente lato WEB, come faccio ad accedere alla TS-CNS? Devo usare qualche standard condiviso dai browser? C’è una libreria specifica javascript che devo usare? Onestamente sono 8 giorni che in 2 persone lavoriamo su questa cosa ed onestamente non ne veniamo a capo. A questo punto ogni piccolo suggerimento e/o condivisione può fare tutta la differenza del mondo. Grazie

Avevo capito che l’accesso alla smartcard eri riuscito già a farlo.
Per via web intendi lato client?
Non dovresti avere comunque una parte server che si occupa di sapere cosa inviare?
In teoria dovrebbe essere quella parte che poi fa la comunicazione agli end point dell’FSE.
Veramente non so se sia possibile accedere alla smartcard via javascript che viene eseguito dal browser, se c’è un modo dovrebbe essere quello che viene invocato quando si clicca sul pulsante per l’accesso al fascicolo sanitario elettronico via cns.
Personalmente ho risolto creando un programmino server che gira sulla macchina dove c’è fisicamente collegata la smartcard ed usa lo store dei certificati di windows per leggere il certificato.

Sto effettuando le prove per l’esito di una comunicazione di un referto di radiologia in ambiente di test,
chiamando https://fseservicetest.sanita.finanze.it/FseInsServicesWeb/services/fseEsitoCaricamentoDocumento
inviando la seguente richiesta :
<soapenv:Envelope
xmlns:soapenv=“http://schemas.xmlsoap.org/soap/envelope/
xmlns:com=“http://esitocaricamentodocumento.xsd.fse.ini.finanze.it” >
soapenv:Header/
soapenv:Body
com:EsitoCaricamentoDocumentoRichiesta
com:IdentificativoUtente(mio CF abilitato per l’accesso al sito di test)</com:IdentificativoUtente>
com:IdentificativoOrganizzazione150</com:IdentificativoOrganizzazione>
com:StrutturaUtente201123456</com:StrutturaUtente>
com:DataRicercaDA20221003120000</com:DataRicercaDA>
com:DataRicercaA20221003161541</com:DataRicercaA>
com:RuoloUtenteDRS</com:RuoloUtente>
</com:EsitoCaricamentoDocumentoRichiesta>
</soapenv:Body>
</soapenv:Envelope>

ottengo la seguente risposta :

<?xml version='1.0' ?>

<env:Envelope
xmlns:env=‘http://schemas.xmlsoap.org/soap/envelope/’>
env:Body
env:Fault
env:Client
Internal Error
</env:Fault>
</env:Body>
</env:Envelope>
Cortesemente qualcuno mi può aiutare.
Grazie