Salve,
anche io sto tentando di autenticarmi al portale PST giustizia, ma incontro un problema che credo qualcuno di voi abbia già risolto.
Sono in possesso della chiavetta di un professionista abilitato al portale, me l'ha data appunto per verificare la fattibilità di un programmino che gli dovrebbe scaricare tutti gli allegati ai fascicoli sul suo pc senza doverli scaricare uno alla volta.
Tra la documentazione presa dal sito, e 6/7 mila pezzi di codice presi qua e la su StackOverflow ho buttato giù un po di codice che mi fa arrivare fino alla richiesta del pin ma poi si ferma sulla WebResponse con l'errore seguente:
"Richiesta annullata: Impossibile creare un canale sicuro SSL/TLS.."
Dai log ho tirato fuori la riga seguente, anche questa capitata a molti, ma da tutte le spiegazioni e soluzion trovate e provate in giro, sono orami due giorni che brancolo nel buio...
System.Net Information: 0 : [3892] InitializeSecurityContext(numero In-Buffer=2, lunghezza Out-Buffer=0, codice restituito=IllegalMessage).
Di seguito il codice
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.IO;
using System.Xml;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography.X509Certificates;
using System.Diagnostics;
using System.Net.Security;
namespace CTU
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Execute();
//CreateWebRequest("https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID");
}
/// <summary>
/// Execute a Soap WebService call
/// </summary>
public static void Execute()
{
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
/*
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;
*/
HttpWebRequest request = CreateWebRequest();
SetCertificatePolicy();
X509Certificate cert = FindCertByName("CERTIFICATO");
request.ClientCertificates.Add(cert);
request.ProtocolVersion = HttpVersion.Version10;
XmlDocument soapEnvelopeXml = new XmlDocument();
soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
<soap:Header>
<ws:invocationDomain
xmlns:ws=""https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID""
soap:MustUnderstand=""true""
group=""jpwusers"" role=""JPW"" name=""JPW"">
</ws:invocationDomain>
</soap:Header>
<soap:Body>
<getServiceNames>
xmlns:m=""urn:CONS-SICC-BE""
</getServiceNames>
</soap:Body>
</soap:Envelope>");
using (Stream stream = request.GetRequestStream())
{
soapEnvelopeXml.Save(stream);
}
WebResponse response = request.GetResponse(); <--------------------------------------------------- qui si ferma
//using (WebResponse response = request.GetResponse())
//{
using (StreamReader rd = new StreamReader(response.GetResponseStream()))
{
string soapResult = rd.ReadToEnd();
Console.WriteLine(soapResult);
}
//}
}
/// <summary>
/// Create a soap webrequest to [Url]
/// </summary>
/// <returns></returns>
public static HttpWebRequest CreateWebRequest()
{
//HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"https://ext.processotelematico.giustizia.it/pda/pycons/GLRM/JPW_SICID");
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"https://ext.processotelematico.giustizia.it");
webRequest.Headers.Add(@"SOAP:Action");
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
return webRequest;
}
private static X509Certificate FindCertByName(string simpleName)
{
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
foreach (X509Certificate cert in store.Certificates)
{
if (cert.Subject.Contains("CN=" + simpleName))
{
return cert;
}
}
string msg = "Il certificato di sicurezza " + simpleName + " non è installato in questo sistema.";
Debug.WriteLine(msg);
return null;
}
/// <summary>
/// Sets the cert policy.
/// </summary>
private static void SetCertificatePolicy()
{
ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
}
/// <summary>
/// Certificate validation callback
/// </summary>
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
{
if (error == SslPolicyErrors.None)
{
return true; // already determined to be valid
}
switch (cert.GetCertHashString())
{
// thumbprints/hashes of allowed certificates (uppercase)
case "5ACB8B01ED6B099C5B316A1F6E27C7089C70FFAC":
Debug.WriteLine("Trusting X509Certificate '" + cert.Subject + "'");
return true;
default:
return false;
}
}
public static HttpWebRequest CreateWebRequest(string url)
{
Uri uri = new Uri(url);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.Proxy = null;
webRequest.Headers.Add("SOAP:Action");
webRequest.Headers.Add("X-WASP-User", "CODICEFISCALE");
webRequest.KeepAlive = true;
webRequest.ContentType = "text/xml;charset=\"utf-8\"";
webRequest.Accept = "text/xml";
webRequest.Method = "POST";
webRequest.AuthenticationLevel = AuthenticationLevel.MutualAuthRequired;
if (FindCertByName("CERTIFICATO") != null)
{
webRequest.ClientCertificates.Add(FindCertByName("CERTIFICATO"));
}
return webRequest;
}
}
}
Grazie a tutti per qualche spunto, dritta, pezzo di codice che funziona...
Stefano
Modificato da StephenSoftware il 06 agosto 2020 17:28 -