HttpWebRequest e i certificati digitali
corradAspItalia
corradAspItalia non è online. Ultima attività: 23/11/2009 17.06.43corradAspItalia
il 22 giugno 2009 alle 22:07
3 messaggi dal 25 maggio 2009
Ciao a tutti,
sto costruendo un'applicazione web con WinServer2008, quindi IIS 7, e asp.net 3.5.
Questa pagina deve girare solo su SSL.
Motivo percui su IIS configuro per il sito il relativo certificato.
Fin qui tutto bene.
Questa pagina deve far fare un download di un file che per sicurezza deve prima essere firmato digitalmente e poi criptato con chiave simmetrica (anche qui tutto bene) e poi postato con messaggio SOAP che contiene il file criptato e la chiave simmetrica criptata a sua volta con una chiave asimmetrica: chiave pubblica di un certificato digitale inviatomi dal client.

E' in ques'ultima parte che ho dei problemi, o meglio ho dei comportamenti che non mi aspetto dalla pagina Asp.net e/o IIS

Cercando un pò in giro son riuscito a trovare un esempio di client per fare una richiesta Http con allegato un certificato digitale (http://www.codeproject.com/KB/security/attachCertWithHttpsReques.aspx)

Controllando il codice client sembra che il certificato sia inserito nell'oggetto HttpWebRequest, ma sul lato della pagina asp.net, tramite il codice pubblicato direttamente da microsoft :

Page_Load()
{
.........
HttpClientCertificate cert = Request.ClientCertificate;
if (cert.IsPresent)
certDataLabel.Text = cert.Get("SUBJECT O");
else
certDataLabel.Text="No certificate was found.";
.........

}

Ho provato innanzitutto a mettere l'opzione su IIS su impostazioni SSL di Richiedi SSL e Richiedi certificato, col risultato che tramite iexplore non riesco più ad accedere alla pagina (ne deduco che non ho installato correttamente il certificato client su ie).

Ho provato ha fare il mapping dei certificati con gli utenti (cosa peraltro non semplice) e non cambia nulla.

Ho pensato di aver sbagliato qualcosa nelle opzioni di IIS 7 e allora mi sono spostato su un IIS 6 che permette la mappatura via interfaccia grafica e quindi più facile, ma il risultato non cambia.

Ho tolto l'opzione Richiedi certificato in Accetta in modo da poter comunque verificare che almeno in IE posso visualizzare la pagina.

Il risultato quando comunque riesco ad avere un response dal server e lo visualizzo è che per lui non c'è allegato il certificato.

Qualcuno sa dirmi in cosa sbaglio?

Il codice é :
//
private void postFile()
{
HttpWebRequest req = null;
HttpWebResponse rsp = null;

X509Certificate cert = X509Certificate.CreateFromCertFile("d:\\cert\\abc.crt");
// Create a X509Certificat object from yor certificate.
// other way is to go through all the cerificates which are installed
// in your Pc and get the right one from the store list

string uri = "https://abc.com:2111/test.aspx";

// A url which is looking for the right public key with
// the incomming https request

String myfile = File.ReadAllText("C:\\somfile.xml");

req = (HttpWebRequest)System.Net.WebRequest.Create(uri);

String DataToPost = this.GetTextFromXMLFile(myfile);

String strSenderID = "123";

req.Method = "POST"; // Post method
req.ContentType = "application/octet-stream"; // content type
//You can also use ContentType = "text/xml";

req.Headers.Add("sender-id", strSenderID);
// Some Header information which you would like to send
// with the request
req.ContentLength = 1000;
req.KeepAlive = false;
req.UserAgent = null;
req.Timeout = 99999;
req.ReadWriteTimeout = 99999;
req.ServicePoint.MaxIdleTime = 99999;

req.ClientCertificates.Add(cert);
// Attaching the Certificate To the request

System.Net.ServicePointManager.CertificatePolicy =
new TrustAllCertificatePolicy();

// when you browse manually you get a dialogue box asking
// that whether you want to browse over a secure connection.
// this line will suppress that message
//(pragramatically saying ok to that message).

StreamWriter writer = new StreamWriter(req.GetRequestStream());

writer.WriteLine(this.GetTextFromXMLFile(myfile));

writer.Close();

rsp = (HttpWebResponse)req.GetResponse();

System.IO.StreamReader reader =
new System.IO.StreamReader(rsp.GetResponseStream());
String retData = reader.ReadToEnd();

if (req != null) req.GetRequestStream().Close();
if (rsp != null) rsp.GetResponseStream().Close();

}
RE: HttpWebRequest e i certificati digitali
Cradle
Cradle non è online. Ultima attività: 09/02/2010 17.38.37Cradle
il 23 giugno 2009 alle 06:56
Domanda banale, ma neanche tanto: perchè non usi WCF con wsHttpBinding?
RE: HttpWebRequest e i certificati digitali
corradAspItalia
corradAspItalia non è online. Ultima attività: 23/11/2009 17.06.43corradAspItalia
il 23 giugno 2009 alle 09:43
3 messaggi dal 25 maggio 2009
Cradle ha scritto:
Domanda banale, ma neanche tanto: perchè non usi WCF con wsHttpBinding?

A dir la verità non conosco i WCF
ma dovrei usarli al posto della pagina asp, giusto?
RE: HttpWebRequest e i certificati digitali
Cradle
Cradle non è online. Ultima attività: 09/02/2010 17.38.37Cradle
il 23 giugno 2009 alle 11:12
Sì, e ti assicuro che è MOLTO meno faticoso, veloce e soprattuto con meno rischi di errori, rispetto a fare a mano tutto; ah.. il mio consiglio non cambia anche se dovessi mettere in conto qualche giorno di self training su questa tecnologia.

m.
RE: HttpWebRequest e i certificati digitali
corradAspItalia
corradAspItalia non è online. Ultima attività: 23/11/2009 17.06.43corradAspItalia
il 28 giugno 2009 alle 18:11
3 messaggi dal 25 maggio 2009
nessun altro consiglio?

 

Torna al forum |   Feed RSS
ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
COMMUNITY
ULTIMI MESSAGGI
UTENTI ONLINE
MEDIA
IN EVIDENZA
MISC
Powered by .db Forums "Caesar Reborn" v. 2010.2.8