Ciao Moreno,
sto combattendo con l'autenticazione al Web Service di Sogei tramite CNS, ma ho provato a d usare diverse soluzioni ma con scarsi risultati.
Usando la proxy class generata importando il wsdl come "Service Reference", ho dapprima modificato l'App.config creando un "CustomBinding" che mi permettesse di includere il certificato nella request:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="FseSettings" type="SendCDAtoFSESiciliaClient.FseSettings, SendCDAtoFSESiciliaClient"/>
</configSections>
<FseSettings configSource="FseSettings.config" />
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpsBinding>
<binding name="comunicazioneMetadatiBinding" messageEncoding="Mtom" />
</basicHttpsBinding>
<customBinding>
<binding name="comunicazioneMetadatiBindingCustom" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
<transactionFlow />
<security authenticationMode="CertificateOverTransport"/>
<textMessageEncoding messageVersion="Soap11" />
<httpsTransport requireClientCertificate="True" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="https://fseservicetest.sanita.finanze.it/FseInsServicesWeb/services/fseComunicazioneMetadati"
binding="customBinding" bindingConfiguration="comunicazioneMetadatiBindingCustom"
contract="FseServiceReference.comunicazioneMetadatiPT" name="fseComunicazioneMetadati" />
</client>
</system.serviceModel>
</configuration>
Poi creo il client e la richiesta ed invio al Web Service:
L'invio della richiesta mi genera l'eccezione "System.Security.Cryptography.CryptographicException: 'Keyset non esistente." . Sembra che non nel momento in cui deve firmare la SOAP usando la chiave privata della smart-card, non riesca a leggere la chiave privata della smart-card. Il certificato della smart-card comunque viene però correttamente associato al client. Mi sa che non che non riesc a caricare le API della smart-card (ho installato IDProtect che è quello indicato da Sogei per le CNS-TS), infatti non mi si apre il pop-up di IDProtect in cui mi chiede di inserire il PIN della smart-card.
In altri post come questo:
https://social.msdn.microsoft.com/Forums/it-IT/e69c20cd-2731-46af-860e-58d23b71b5e0/soap-client-mutual-authentication-client-certificate?forum=wcfwfit ho letto che altri avevano rilevato questo problema di chiave privata non trovata e sembra che avessero abbandonato la strada del WCF con wsdl caricato come "Service Reference" e avessero usato invece l'oggetto "SoapHttpClientProtocol", quindi caricando il wsdl come "Web Reference".
Come secondo tentativo ho provato la strada del "HttpClient", creando una richiesta MTOM completamente a mano.
Nel momento in cui invio la richiesta, mi si apre il pop-up di "IDProtect" dove mi chiede il PIN della smart card, quindi richiama correttamente le API della smart-card. Poi la richiesta viene inviata, ma il Web Service di Sogei mi ritorna l'errore genrico HTTP 500 - "Internal Server Error".
Ho analizzato cosa invio con Fiddler, e la chiamata mi sembra identica a quella che invio usando il WCF (stessi header, stessa struttura dell MTOM, etc). Boh non so più cosa provare.
Pensavo di prendere anch'io la strada del "SoapHttpClientProtocol" anche se non ho molta dimestichezza.
In una rarissima nota della documentazione Sogei riguardante questa integrazione riportano questo:
"NOTE SU ALCUNE TIPOLOGIE DI CLIENT
Per creare un WSclient .NET con autenticazione preventiva si deve usare l’oggetto SoapHttpClientProtocol sul quale si deve però assolutamente fare un override del metodo GetWebRequest dove viene forzata appunto l’autenticazione, perché di default non è prevista dalla classe SoapHttpClientProtocol."
Cosa ne pensi?
Modificato da filcat il 10 ottobre 2019 14:39 -