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.