Come inviare un certificato client, utilizzando le classi HttpWebRequest e HttpWebResponse in Microsoft Visual C# .NET

Traduzione articoli Traduzione articoli
Identificativo articolo: 895971 - Visualizza i prodotti a cui si riferisce l?articolo.

Requisiti

Per inviare un certificato client da applicazioni Microsoft ASP.NET, Ŕ necessario disporre service pack installati i seguenti hotfix:

Microsoft .NET framework 1.0

╚ necessario installare .NET Framework 1.0 Service Pack 3 (SP3) o Ŕ necessario installare aggiornamento rapido (hotfix) 817854.Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
817854FIX: Applicazione Web ASP.NET non pu˛ inviare un certificato client a un sito Web con protezione avanzata

.NET framework 1.1

╚ necessario installare .NET Framework 1.1 Service Pack 1 (SP1) o Ŕ necessario installare aggiornamento rapido (hotfix) 831138.Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
831138FIX: Un'applicazione .NET Framework che utilizza il metodo System.NET.WebRequest molto di frequente si verifica errori OutOfMemoryException
Espandi tutto | Chiudi tutto

In questa pagina

INTRODUZIONE

In questo articolo viene descritto come inviare un certificato client con le classi HttpWebRequest e HttpWebResponse in Microsoft Visual C#. NET.

Informazioni

╚ possibile inviare un certificato client quando il server Web richiede uno utilizzando il HttpWebRequest e HttpWebResponse classi. Per ottenere un certificato che pu˛ essere utilizzato per inviare un certificato client mediante la classe HttpWebRequest , utilizzare uno dei seguenti metodi:

Metodo 1

Utilizzare la classe X509Certificate per leggere il certificato da un file di CER e quindi impostare la proprietÓ ClientCertificates .

Metodo 2

Utilizzare chiamate di CryptoAPI per ottenere il certificato dall'archivio certificati e quindi impostare la classe X509Certificate al certificato ricevuto dall'archivio certificati. ╚ quindi possibile impostare la proprietÓ ClientCertificates .

Requisiti per l'invio di un certificato client

Quando si lavora con le applicazioni ASP.NET, assicurarsi che vengano completati i seguenti requisiti:
  • Il certificato del client deve essere installato in hive del Registro di sistema LOCAL_MACHINE e non nell'hive del Registro di sistema CURRENT_USER. Per confermare l'installazione in cui il certificato client, attenersi alla seguente procedura:
    1. Fare clic su Start , scegliere Esegui , digitare mmc e quindi fare clic su OK .
    2. Scegliere Aggiungi/Rimuovi snap-in dal menu file .
    3. Nella finestra della finestra di dialogo Aggiungi/Rimuovi snap-in , fare clic su Aggiungi .
    4. Nella finestra di dialogo Aggiungi snap-in autonomo fare clic su certificati e scegliere Aggiungi .
    5. Nella finestra di dialogo snap-in certificati , selezionare account del computer e scegliere Avanti
    6. Nella finestra della finestra di dialogo Seleziona Computer , fare clic su Fine .
    7. Nella finestra di dialogo Aggiungi snap-in autonomo fare clic su Chiudi , quindi OK .
    8. Espandere certificati (computer locale) , espandere personale e quindi fare clic su certificati .
    Nel riquadro di destra vengono elencato il certificato client.
  • ╚ necessario assegnare l'utente ASP.NET account autorizzazioni alla chiave privata del certificato client. Per assegnare l'utente ASP.NET account autorizzazioni alla chiave privata del certificato client, utilizzare lo strumento di WinHttpCertCfg.exe.Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
    823193Come ottenere strumenti di certificato e la traccia di Windows HTTP 5.1
    Per ulteriori informazioni su come utilizzare questo strumento, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
    WinHttpCertCfg.exe, strumento di configurazione di una certificato http://msdn2.microsoft.com/en-us/library/aa384088.aspx

Utilizzo di un file con estensione cer

Metodo 1 Ŕ pi¨ semplice da utilizzare, ma metodo richiede che sia disponibile un file con estensione cer. Se non si dispone del file con estensione cer installato, utilizzare Microsoft Internet Explorer per esportare il file con estensione cer.

Il codice riportato di seguito viene descritto come ottenere un certificato da un file CER che Ŕ possibile utilizzare con il class.
//Uncomment the following code if you need a proxy. The boolean true is used to bypass the local address.
//WebProxy proxyObject = new WebProxy("Your Proxy value",true); 
//GlobalProxySelection.Select = proxyObject;

// Obtain the certificate. 
try
{
	//You must change the path to point to your .cer file location. 
	X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\mycert.cer");
	// Handle any certificate errors on the certificate from the server.
	ServicePointManager.CertificatePolicy = new CertPolicy();
	// You must change the URL to point to your Web server.
	HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://YourServer/sample.asp");
	Request.ClientCertificates.Add(Cert);
	Request.UserAgent = "Client Cert Sample";
	Request.Method = "GET";
	HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
	// Print the repsonse headers.
	Console.WriteLine("{0}",Response.Headers);
	Console.WriteLine();
	// Get the certificate data.
	StreamReader sr = new StreamReader(Response.GetResponseStream(), Encoding.Default);
	int count;
	char [] ReadBuf = new char[1024];
	do
	{
		count = sr.Read(ReadBuf, 0, 1024);
		if (0 != count)
		{
			Console.WriteLine(new string(ReadBuf));
		}
						
	}while(count > 0);
}
catch(Exception e)
{
	Console.WriteLine(e.Message);
}
	

//Implement the ICertificatePolicy interface.
class CertPolicy: ICertificatePolicy
{
	public bool CheckValidationResult(ServicePoint srvPoint, 
X509Certificate certificate, WebRequest request, int certificateProblem)
	{
		// You can do your own certificate checking.
		// You can obtain the error values from WinError.h.

		// Return true so that any certificate will work with this sample.
		return true;
	}
}

Utilizzo di CryptoAPI chiamate

Se Ŕ necessario ottenere il certificato dall'archivio certificati, utilizzare le funzioni di CryptoAPI per ottenere il certificato e quindi memorizzarlo in un oggetto di classe X509Certificate . La classe X509CertificateCollection enumera tutti i certificati in un archivio e li inserisce in un oggetto di classe X509CertificateCollection .

Se si desidera ottenere un certificato specifico, Ŕ necessario modificare il codice di classe per ottenere un certificato specifico utilizzando la funzione CertFindCertificateInStore . Questa funzione viene dichiarata nel file Wincrypt.h. In alternativa, Ŕ possibile enumerare la funzione X509CertificateCollection per individuare il certificato che si desidera.

Nel codice di esempio seguente viene utilizzato il primo certificato nell'insieme restituito dalla funzione CertEnumCertificatesInStore .
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Runtime.InteropServices;

namespace SelectClientCert
{
	/// Sample that describes how how to select client cetificate and send it to the server.

	class MyCerts{

		private static int CERT_STORE_PROV_SYSTEM = 10;
		private static int CERT_SYSTEM_STORE_CURRENT_USER = (1 << 16);
		///private static int CERT_SYSTEM_STORE_LOCAL_MACHINE = (2 << 16);

		[DllImport("CRYPT32", EntryPoint="CertOpenStore", CharSet=CharSet.Unicode, SetLastError=true)]
		public static extern IntPtr CertOpenStore(
			int storeProvider, int encodingType,
			int hcryptProv, int flags, string pvPara);

		[DllImport("CRYPT32", EntryPoint="CertEnumCertificatesInStore", CharSet=CharSet.Unicode, SetLastError=true)]
		public static extern IntPtr CertEnumCertificatesInStore(
			IntPtr storeProvider,
			IntPtr prevCertContext);

		[DllImport("CRYPT32", EntryPoint="CertCloseStore", CharSet=CharSet.Unicode, SetLastError=true)]
		public static extern bool CertCloseStore(
			IntPtr storeProvider,
			int flags);
		
		X509CertificateCollection m_certs;

		public MyCerts(){
			m_certs = new X509CertificateCollection();
		}

		public int Init()
		{
			IntPtr storeHandle;
			storeHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, "MY");
			IntPtr currentCertContext;
			currentCertContext = CertEnumCertificatesInStore(storeHandle, (IntPtr)0);
			int i = 0;
			while (currentCertContext != (IntPtr)0) 
			{
				m_certs.Insert(i++, new X509Certificate(currentCertContext));
				currentCertContext = CertEnumCertificatesInStore(storeHandle, currentCertContext);
			}
			CertCloseStore(storeHandle, 0);

			return m_certs.Count;
		}
		
		public X509Certificate this [int index]
		{
			get 
			{
				// Check the index limits.
				if (index < 0 || index > m_certs.Count)
					return null;
				else
					return m_certs[index];
			}
		}
	};
	class MyHttpResource
	{
		String m_url;

		public MyHttpResource(string url){
			m_url = url;
		}

		public void GetFile(){

			HttpWebResponse  result = null;

			try{
			
				HttpWebRequest req = (HttpWebRequest)WebRequest.Create(m_url);
				req.Credentials  = CredentialCache.DefaultCredentials;

				///Method1
				//req.ClientCertificates.Add(X509Certificate.CreateFromCertFile("D:\\Temp\\cert\\c1.cer"));
		
				///Method2
				///Uses interop services
				MyCerts mycert = new MyCerts();
				if(mycert.Init() > 0)
					req.ClientCertificates.Add(mycert[0]);

				result = (HttpWebResponse)req.GetResponse();
				
				Stream ReceiveStream = result.GetResponseStream();
				Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

				StreamReader sr = new StreamReader( ReceiveStream, encode );
				Console.WriteLine("\r\nResponse stream received");

				Char[] read = new Char[256];
				int count = sr.Read( read, 0, 256 );

				Console.WriteLine("HTTP Response...\r\n");
				while (count > 0) 
				{
					String str = new String(read, 0, count);
					Console.Write(str);
					count = sr.Read(read, 0, 256);
				}

			} 
			catch(WebException e) 
			{
            
				Console.WriteLine("\r\nError:");
				#if (DEBUG)
					Console.WriteLine(e.ToString());
				#else		
					Console.WriteLine(e.Message); 				
				#endif

			} 
			finally 
			{
				if ( result != null ) {
					result.Close();
				}
			}
				
		}
	
	}

	class CertSample
	{
		static void Main(string[] args)
		{
			try
			{
				if (args.Length < 1)
				{
					Console.WriteLine("No url is entered to download, returning.\n");
					Console.WriteLine("Usage: CertSample <urltoget>\n");
					Console.WriteLine("  e.g: CertSample https://servername \n"); 

					return;
				}

				MyHttpResource hr = new MyHttpResource(args[0]);
				hr.GetFile();
			}
			catch(Exception e)
			{
				Console.WriteLine(e.ToString());
			}
			return;
		}
	}
}

Riferimenti

Per ulteriori informazioni, visitare il seguente sito Web Microsoft Developer Network (MSDN):
Classe X509Certificate
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate(vs.71).aspx
Platform SDK: crittografia
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

ProprietÓ

Identificativo articolo: 895971 - Ultima modifica: venerdý 18 maggio 2007 - Revisione: 1.6
Le informazioni in questo articolo si applicano a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Chiavi:á
kbmt kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo KB895971 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 895971
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com