SOAP Client, Mutual Authentication, client certificate...

8/4/2012 5:23:31 PM
Gravatar
Total Posts 13

SOAP Client, Mutual Authentication, client certificate...

Ciao Ugo,

 

Io sto progettando un software per  accedere ad un "web service" del Ministero della Giustizia ( http://www.processotelematico.giustizia.it/pdapublic/ ).  Tale web service utilizza, per l'autenticazione, il meccanismo della "Mutual SSL autentication"  ( http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication ) il quale, a sua volta, richiede che il client esponga un certificato (x509) con chiave privata.

 

 Il mio problema è che la maggior parte dei miei utenti (Avvocati) possiedono un certificato x509 (Carta Nazionale dei Servizi) che, per motivi di sicurezza, ha la chiave privata NON esportabile. Questo non mi consente di estrarre un certificato in formato PKCS #12 (.pfx).

 

 Ho provato ad autenticarmi utilizzando un certificato in formato .cer ed in formato PKCS #7  ma il server mi ha restituito il seguente messaggio di errore: "502 Proxy Error The proxy server received an invalid response from an upstream server The proxy server could not handle the request Error reading from remote server Apache/2.2.3 (Red Hat) Server at Port 443".

 

 Il Ministero della Giustizia, da me interpellato, dice che l'autenticazione deve avvenire tramite l’opportuna sequenza di chiamate al token per mezzo dell’interfaccia PKCS#11. Il Ministero dice anche che Il certificato deve rispettare il profilo del certificato previsto dalla Carta Nazionale dei Servizi (CNS), facendo riferimento all’Appendice 1 del documento rilasciato dal CNIPA: “Linee guida per l’emissione e l’utilizzo della Carta Nazionale dei Servizi”. L’estensione Certificate Policy (2.5.29.32) può essere valorizzata con un Object Identifier (OID) definito dalla CA.

 

A questo punto ho scaricato il Tuo NCryptoki  ed ho provato ad estrarre il certificato direttamente dalla smart-card utilizzando questo codice:  http://wiki.ncryptoki.com/How-to-extract-an-X509Certificate.ashx  Con le tue librerie sono riuscito ad estrarre il certificato (ma non anche la chiave privata).  Ho provato a connettermi utilizzado il certificato estratto dalla smart-card (vedi codice c#) ma il server mi ha restituito lo stesso codice d errore.

 

Io credo di aver capito (correggimi se sbaglio) che questo errore dipende dal fatto che nel certificato manca la chiave privata. In tal senso vedi: http://stackoverflow.com/questions/2901105/cant-connect-to-https-using-x509-client-certificate
 

Potresti, gentilmente, dirmi:
1. Se con le tue librerie esiste un modo per effettuare la "Mutual authentication" lato client senza esporre la chiave privata.
2. Se con le tue librerie esiste un modo per recuperare (dalla Smart Card) la chiave privata NON ESPORTABILE e con essa creare un clone del certificato per autenticarsi?
3. Se, con le tue librerie, è possibile effettuare la "Mutual authentication" lato client in qualche altro modo?
 

Sono graditi frammenti di codice in C#
 

Grazie :-)
Lello Passannanti


 

Questo è il codice che ho usato per l'autenticazione:
**********************************************
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest(string url)
{

Uri uri = new Uri(url);

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
 webRequest.Headers.Add("SOAP:Action");
 webRequest.Headers.Add("X-WASP-User", "psssrl52s19h703u");
 webRequest.KeepAlive = true;
 webRequest.ContentType = "text/xml;charset=\"utf-8\"";
 webRequest.Accept = "text/xml";
 webRequest.Method = "POST";
 webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;

X509Certificate2 SmartCardCertificate = GetSmartCardCertificate();
if (SmartCardCertificate != null)
{
 webRequest.ClientCertificates.Add(SmartCardCertificate);
}

return webRequest;

}

 

8/6/2012 10:25:22 AM
Gravatar
Total Posts 300
Ugo Chirico http://www.ugochirico.com

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao,
L'autenticazione client SSL di un webservice con smartcard e' piuttosto complicata e non si riesce a spiegarla in un post o in una email.
Se vuoi possiamo organizzare un corso di formazione online con la nostra piattaforma di e-learning: http://www.ugochirico.net Fammi sapere...
8/6/2012 1:16:16 PM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Caro Ugo,

 

Quella del corso di formazione online mi sembra una buona idea perchè l'argomento è di carattere generale e potrebbe interessare ad altre persone. Come spunto di discussione ho preparato un progetto in c# 

 

 

Punti salienti di questo progetto sono (vedi codice in calce):

1. Creazione della busta SOAP;

2. Creazione della WebRequest;

3. Invocazione del servizio;

4. Lettura della risposta.

 

Nel progetto ho utilizzato le tue librerie per ottenere il certifcato.

Tutta la documentazione relativa al Processo Civile Telematico (Mutual SSL Authentication) è qui: http://www.processotelematico.giustizia.it/pdapublic/index.jsp?sid=1&id=4&pid=4

Fammi sapere quali sono le modalità di partecipazione al corso di formazione.

  

Cordiali saluti

Lello Passannanti

 

Punti salienti del Progetto:

***********************************************************************

/// <summary>
/// GetServiceNames
/// </summary>
/// <param name="myUrn"></param>
/// <returns></returns>
private static XmlDocument CreateEnvelope()
{
   XmlDocument retVal = new XmlDocument();

string soapenv = String.Format(
@"<soap-env:Envelope xmlns:soap-env=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap-env:Header>
<ws:invocationDomain
   xmlns:ws=""http://www.netserv.it/anag/security""
   soap-env:MustUnderstand=""true""
group=""jpwusers"" role=""JPW"" name=""JPW"">
</ws:invocationDomain>
</soap-env:Header>
<soap-env:Body>                           
<m:getServiceNames xmlns:m=""urn:CONS-SICC-BE"">
</m:getServiceNames>
</soap-env:Body>
</soap-env:Envelope>"
);

retVal.LoadXml(soapenv);
return retVal;
}
 

 

/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest(string url)
{

Uri uri = new Uri(url);

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
   webRequest.Proxy = null;
   webRequest.Headers.Add("SOAP:Action");
   webRequest.KeepAlive = true;
   webRequest.Headers.Add("X-WASP-User", "psssrl52s19h703u");
   webRequest.ContentType = "text/xml;charset=\"utf-8\"";
   webRequest.Accept = "text/xml";
   webRequest.Method = "POST";
   webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
if (certificate != null)
{
   webRequest.ClientCertificates.Add(certificate);
}


return webRequest;
}
 

 

/// <summary>
///  Funzione per accesso asincrono al PolisWeb
/// </summary>
/// <param name="url"></param>
/// <param name="envelope"></param>
/// <returns></returns>
public static XmlDocument ServiceCall(string url, XmlDocument envelope)
{
   XmlDocument resp = new XmlDocument();
try
{
if (NetworkInterface.GetIsNetworkAvailable())
{

if (certificate == null)
{
certificate = GetCertificateFromSmartCard();
}
   HttpWebRequest request = CreateWebRequest(url);

using (Stream stream = request.GetRequestStream())
{
   envelope.Save(stream);
}

IAsyncResult asyncResult = request.BeginGetResponse(null, null);

asyncResult.AsyncWaitHandle.WaitOne();

string soapResult = "";
using (WebResponse webResponse = request.EndGetResponse(asyncResult))
using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
{
  soapResult = rd.ReadToEnd();
}

resp.LoadXml(soapResult);
}
else
{
   MessageBox.Show("La connessione ad internet non è disponibile. \nPrima di riprovare assicurarsi che questo computer sia collegato alla rete.");
}

}
catch (WebException we)
{
if (we.Status == WebExceptionStatus.ProtocolError)
{
  WebResponse webResponse = we.Response;
  StreamReader sr = new StreamReader(webResponse.GetResponseStream());
string error = sr.ReadToEnd();
   MessageBox.Show(error);
}
else
{
   MessageBox.Show(we.ToString());
}

}
catch (Exception ex)
{
   MessageBox.Show(ex.Message);
}

return resp;
}
 

8/7/2012 9:50:17 AM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao Ugo,

 

Nelle istruzioni per l'identificazione il Ministero della Giustizia dice (vedi sopra): L’estensione Certificate Policy (2.5.29.32) può essere valorizzata con un Object Identifier (OID) definito dalla CA".

 

Potresti gentilmente spiegarmi cosa significa? Potresti dirmi se questa operazione puo' essere effettuata con la Tua libreria? (in tal caso sarebbe gradito un esempio in c#).

 

Cordiali saluti

 


 

Lello

8/7/2012 3:02:27 PM
Gravatar
Total Posts 300
Ugo Chirico http://www.ugochirico.com

Re: SOAP Client, Mutual Authentication, client certificate...

La policy di cui parli e' nel certificato preesistente nella card e non puo' essere modificata in alcun modo. Ad ogni modo devo dirti che sei totalmente fuori strada. Ne parliamo dopo le vacanze e nel caso organizzero' un corso di formazione (a pagamento) appositamente per voi.
8/13/2012 4:26:05 PM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Caro Ugo,

 

Non è vero che sono completamente fuori strada. L'errore: 502 (bad gateway) non dipendeva dai certificati ma dal fatto che, per la trasmissione dei dati, il proxy del Ministero della Giustiza utilizzav il protocollo HTTP 1.0 mentre il mio applicativo utilizzava il protocollo HTTP 1.1.

 

Per correggere l'errore 502 (bad gateway) è bastato aggiungere, nella chiamata al servizio, la seguente istruzione (vedi codice). Ora riesco a connettermi correttamente. Spero che questo "post" possa essere utile ad altri.

 

Cordiali saluti

Lello Passannanti


=====================================================


/// <summary>

///

/// </summary>

/// <param name="url"></param>

/// <returns></returns>

public static HttpWebRequest CreateWebRequest(string url)

{

     Uri uri = new Uri(url);

     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);

 
     //Questo risolve l'errore 502 (Bad gateway)

     webRequest.ProtocolVersion = HttpVersion.Version10;

     webRequest.Proxy = null;
     webRequest.Headers.Add("SOAP:Action");

     webRequest.KeepAlive = true;

     webRequest.ContentType = "text/xml;charset=\"utf-8\"";

     webRequest.Accept = "text/xml";

     webRequest.Method = "POST";

     webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;

     if (certificate != null)
     {

          webRequest.ClientCertificates.Add(certificate);

     } 

 

     return webRequest;

}

4/2/2014 9:21:04 AM
Gravatar
Total Posts 3

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao Ugo,

sono interessata al corso di formazione per i seguenti punti:

1. Creazione della busta SOAP;
2. Creazione della WebRequest;
3. Invocazione del servizio;
4. Lettura della risposta.

In linguaggio c#.

Mi puoi indicare i costi e come si svolge?

Grazie

 

Liliana.

6/24/2014 3:27:11 PM
Gravatar
Total Posts 4

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao

sto sviluppando un sistema su processo civile telematico. Attualmente mi trovo mi trovo di fornte ad un errore "401 accesso negato".

Il mio probelma principale è proprio l'autenticazione, inquanto non utilizzo c# e quindi mi blocco al punto:

 

webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
if (certificate != null)
{
webRequest.ClientCertificates.Add(certificate);
}

Noto dal codice ( sopra incollato) che viene aggiunto il certificato ma la mia domanda è:

Come faccio ad aggiungere un certificato (ad esempio da una smart card) che non è possibile esportare ?

P.S.: Ho fatto diverse prove ma l'unica cosa che riesco a tirar fuori configurando apache in modo da effettuare la muta autenticazione è un token di risosta all'autenticazione, sarà questo il parametro necessario?

Ciao e grazie mille in anticipo

6/26/2014 9:19:24 AM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Prova con RemoteCertificateValidationCallback:

 

http://stackoverflow.com/questions/560804/how-do-i-use-webrequest-to-access-an-ssl-encrypted-site-using-https

 

Saluti Lello





 

6/26/2014 10:52:58 AM
Gravatar
Total Posts 4

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao Lello,

intanto grazie tante per la risposta, considera che sono 3 giorni che studio il tuo codice cercando di trasformare il C# in codice PHP.

Attualmente mi trovo bloccato in punto e non so come andare avanti. Ti doco come sto operando magari mi puoi dare una dritta:

1. Ho configurato il mio server apache per l'accesso alla smart card che contiene la mia firma digitale. Il browser mi apre la finestra dove inserisco il PIN e il server mi risponde con un token e il certificato (.pem).

2. Faccio una chiamata soap verso il WSDL sul mio server, inviando il certificato estratto, ti inserisco il codice:

ini_set('soap.wsdl_cache_enabled',0);
$cert=$_SERVER['SSL_CLIENT_CERT'];
$local_cert='certificato/cert.pem';
$fp=fopen($local_cert,'w+');
fwrite($fp,$cert);
fclose($fp);
$local_cert='certificato/cert.pem';
$header = "X-WASP-User: mdafnc......";

$url="WSDL/ConsultazioneRegistri/SICID/qbuilder-cons-anonima-sicc-be.wsdl";
$opts = array(
 'ssl' => array(
 'local_cert' => $local_cert,
 'allow_self_signed' => true
 ),
 'http'=> array(
     'header'=> $header."\r\n"
 )
);
$ctx = stream_context_create($opts);
$client = new SoapClient($url, array('stream_context' => $ctx,'local_cert' => $local_cert));
$vem = $client->__soapCall('getServiceNames',array('getServiceNames'=>'dasdas'));
print $vem;

 

3. Come da guida del Ministero ho modificato il WSDL cosi:

<soap:address location="https://ext.procesSotelematicotest.giustizia.it/pda/pycons/GLMV/JPW_SICID"/>

Ecco l' errore:

PHP Fatal error:  Uncaught SoapFault exception: [HTTP] Could not connect to host in /var/www/index.php:25
Stack trace:
#0 [internal function]: SoapClient->__doRequest('<?xml version="...', 'https://ext.pro...', 'getServiceNames', 1, 0)
#1 /var/www/index.php(25): SoapClient->__soapCall('getServiceNames', Array)
#2 {main}
  thrown in /var/www/index.php on line 25

 

Dove sbaglio ? Te ne sarei davvero grato se potessi darmi una mano

 

6/26/2014 11:04:45 AM
Gravatar
Total Posts 300
Ugo Chirico http://www.ugochirico.com

Re: SOAP Client, Mutual Authentication, client certificate...

Non ho idea di quale può essere l'errore.

Inoltre questo forum è dedicato a NCryptoki in .NET e Java non a PHP.

 

6/26/2014 11:25:23 AM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Io non uso i WSDL.

Io creo la busta (envelope) in documento XML e poi la invio al server utilizzando la classe HttpWebRequest.

Saluti Lello

6/27/2014 11:02:56 AM
Gravatar
Total Posts 4

Re: SOAP Client, Mutual Authentication, client certificate...

Ok Grazie mille Lello,

ti faccio un altra domanda che tu sicuramente avrai dovuto affrontare..

Il ministero oggi mi risponde all'email :

") Impostare come keystore il certificato utente (in formato p12, precedentemente estratto dalla smart card compresa chiave privata) e relativa password."

Ti risulta che si possa esportare la private key da una smart card?

Se si  mi sapresti indirizzare

 

Grazie

6/27/2014 11:08:38 AM
Gravatar
Total Posts 300
Ugo Chirico http://www.ugochirico.com

Re: SOAP Client, Mutual Authentication, client certificate...

Assolutamente no.

La chiave private non può essere estratta dalla smart card, che altrimenti, diventerebbe clonabile.

La CNS deve avere la certificazione di sicurezza Common Criteria 4 dove, tra le altre cose, è esplicitamente detto che la chiave privata non deve essere esportabile.

Ti hanno detto un'assurdità.

6/27/2014 11:33:51 AM
Gravatar
Total Posts 13

Re: SOAP Client, Mutual Authentication, client certificate...

Il Ministero usa un termine improprio.

Non devi "estrarre" il certificato, devi semplicemente "leggere" il certificato dalla Smart Card (oppure dallo Store) ed allegarlo alla webRequest:

 

================================

webRequest.ClientCertificates.Add(certificate)

================================

 

Nota Bene: NCriptoky consente di leggere il certificato direttamente dalla Smart Card.

6/27/2014 11:48:36 AM
Gravatar
Total Posts 300
Ugo Chirico http://www.ugochirico.com

Re: SOAP Client, Mutual Authentication, client certificate...

Anzitutto, il certificato contiene la chiave pubblica e pertanto può essere letto dalla card e conservato dove ti pare (non capisco poi che differenza ci sia tra "leggere" ed "estrarre".

Poi, un p12 contiene la chiave pubblica, la chiave privata e il certificato. Quindi per creare un p12 occorre avere anche la chiave privata.

Poi, NCryptoki consente di leggere il certificato dalla smart card, con poche righe di codice, seguendo gli esempi e le informazioni nel wiki.

Infine, purtroppo su quest'argomento c'è ancora tanta ignoranza e molti continuano a confondere il certificato con la chiave privata. Invece di ingaggiare dei professionisti che conoscono bene l'argomento, continuano a far lavorare persone non competenti che creano solo confusione e fanno perdere tempo.

6/27/2014 12:00:58 PM
Gravatar
Total Posts 4

Re: SOAP Client, Mutual Authentication, client certificate...

Infatti è quello che sospettavo anche io.. Che senso avrebbe estrarre la private key della smart card si perderebbe il criterio di sicurezza..

Eppure il Ministero mi scrive di effettuare le prove al web service cosi:

Proceda al download del prodotto SOAP-UI nella versione free (non PRO) dal sito http://www.soapui.org/ quindi lo installi ed esegua il test:
1) Aprire soapui.
2) Impostare la soap della richiesta e la URL della chiamata specificata sotto
3) Andare su File--> Preferences --> SSL Settings
4) Impostare come keystore il certificato utente (in formato p12, precedentemente estratto dalla smart card compresa chiave privata) e relativa password.
5) Assicurarsi che sia selezionato anche il checkbox : "requires client authentication"
6) Nel progetto utilizzare l'url: https://ext.processotelematicotest.giustizia.it/pda/pycons/GLMV/JPW_SICID
7) Lanciare il test premendo la freccia verde in alto a sx e attendere la risposta.

Io al massimo posso estrarre estrarre il certificato .pem

Grazie mille cmq

Qualsiasi altro consiglio su come operare è gradito
 

7/2/2014 3:48:28 PM
Gravatar
Total Posts 1

Re: SOAP Client, Mutual Authentication, client certificate...

Ciao Lello

Volevo sapere come hai risolto con il certificato client come fai l'esportazione del certificato e come lo passi al server che effettua la connessione al serivzio.

Grazie per l'aiuto