Jak poslat klientského certifikátu pomocí třídy HttpWebRequest a HttpWebResponse v Microsoft Visual C#.NET

Překlady článku Překlady článku
ID článku: 895971 - Produkty, které se vztahují k tomuto článku.

Požadavky

Klientský certifikát lze odeslat z Microsoft ASP.NET aplikací, je nutné mít následující opravy hotfix nebo aktualizace service Pack nainstalována:

Společnosti Microsoft.Rozhraní .NET Framework 1.0

Je nutné nainstalovat.NET Framework 1.0 Service Pack 3 (SP3), nebo je nutné nainstalovat opravu hotfix 817854. Další informace získáte následující článek znalostní báze Microsoft Knowledge Base:
817854OPRAVA: PROSTŘEDÍ ASP.NET webové aplikace nelze doručit klientského certifikátu rozšířené zabezpečení webového serveru

.Rozhraní .NET Framework 1.1

Je nutné nainstalovat.Rozhraní .NET Framework 1.1 Service Pack 1 (SP1), nebo je nutné nainstalovat opravu hotfix 831138. Pro Další informace získáte klepnutím na následující číslo článku v následujícím článku Znalostní báze Microsoft Knowledge Base:
831138OPRAVA: A.NET Framework aplikace, která používá metodu System.Net.WebRequest velmi často dochází k OutOfMemoryException chyby
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

ÚVOD

Tento článek popisuje, jak lze odeslat pomocí klientského certifikátu pomocí HttpWebRequest a Třída HttpWebResponse Chcete-li zobrazit třídy v Microsoft Visual C# NET.

Další informace

Můžete odeslat klientovi certifikát, kdy webový server pomocí vyžaduje HttpWebRequest a Třída HttpWebResponse třídy. Získat certifikát, který lze použít k odeslání klientský certifikát pomocí HttpWebRequest Třída, použijte jednu z následujících metod:

Metoda 1

Použít Certifikát x 509 Třída číst certifikát ze souboru s příponou CER a pak nastavte ClientCertificates Vlastnost.

Metoda 2

Pomocí volání rozhraní CryptoAPI získat certifikát z certifikátu Uložit a pak nastavte Certifikát x 509 třídy k certifikátu, který jste obdrželi od certifikátu úložiště. Potom můžete nastavit ClientCertificates Vlastnost.

Požadavky pro odesílání klientský certifikát

Při práci s ASP.NET aplikací, zkontrolujte, zda následující požadavky na dokončení:
  • Certifikát klienta musí být instalovány Podregistr registru LOCAL_MACHINE a není v podregistru CURRENT_USER. K potvrzení, kde je nainstalován certifikát klienta, postupujte takto:
    1. Klepněte na tlačítko Spustit, klepněte na tlačítko Spustit, typ konzoly MMCa klepněte na tlačítko OK.
    2. V Soubor nabídky, klepněte na tlačítko Přidat nebo odebrat modul Snap-in.
    3. V Přidat nebo odebrat modul Snap-in Dialogové okno Klepněte na tlačítko Přidat.
    4. V Přidat samostatný modul Snap-in Dialogové okno Klepněte na tlačítko Certifikátya klepněte na tlačítko Přidat.
    5. V Modul Snap-in Certifikáty Dialogové okno Klepněte na tlačítko Účet počítačea klepněte na tlačítko Další
    6. V Vybrat počítač Dialogové okno Klepněte na tlačítko Dokončit.
    7. V Přidat samostatný modul Snap-in Dialogové okno Klepněte na tlačítko Zavříta klepněte na tlačítko OK.
    8. Rozbalit Certifikáty (místní), Rozbalit Osobnía klepněte na tlačítko Certifikáty.
    V pravém podokně by měl být certifikát klienta uvedeny.
  • Musíte dát ASP.NET user oprávnění soukromý klíč pro certifikát klienta. Poskytnout ASP.NET uživatelského účtu použití oprávnění k soukromému klíči pro klientský certifikát Nástroj WinHttpCertCfg.exe. Další informace informace získáte klepnutím na následující číslo článku v následujícím článku Znalostní báze Microsoft Knowledge Base:
    823193Získání certifikátu a Trasovací nástroje Windows HTTP 5.1
    Další informace o použití tohoto nástroje. navštivte následující Web společnosti Microsoft Developer Network (MSDN):
    WinHttpCertCfg.exe, nástroj Konfigurace certifikátu http://msdn2.microsoft.com/en-us/library/aa384088.aspx

Pomocí souboru s příponou CER

Metoda 1 je jednodušší, ale metoda vyžaduje, aby byl soubor s příponou CER. Pokud nemáte nainstalován soubor CER, použijte aplikaci Microsoft Internet V aplikaci Explorer exportovat do souboru s příponou CER.

Popisuje následující zdrojový kód Jak získat certifikát ze souboru .cer, který lze použít HttpWebRequest Třída.
//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;
	}
}

Pomocí volání rozhraní CryptoAPI

Pokud musíte získat certifikát z úložiště certifikátů, použijte Funkce rozhraní CryptoAPI, získat certifikát a uložte ji do Certifikát x 509 objekt třídy. Na X509CertificateCollection Třída výčet všech certifikátů v úložišti a uvede v X509CertificateCollection objekt třídy.

Chcete-li získat konkrétní certifikát, musíte změnit kód třídy získat určitý certifikát podle pomocí CertFindCertificateInStore funkce. Tato funkce je deklarována v souboru Wincrypt.h. Alternativně můžete vytvořit výčet X509CertificateCollection Funkce certifikát, který chcete najít.

Na Následující ukázkový kód v kolekci, která je používá první certifikát vrátil CertEnumCertificatesInStore funkce.
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;
		}
	}
}

Odkazy

Další informace naleznete na následující společnosti Microsoft Webech Developer Network (MSDN):
Třída certifikát x 509
http://msdn2.microsoft.com/en-us/library/System.Security.Cryptography.x509certificates.x509certificate (vs.71) .aspx
Sada SDK pro platformy: kryptografie
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

Vlastnosti

ID článku: 895971 - Poslední aktualizace: 22. května 2011 - Revize: 3.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Klíčová slova: 
kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo kbmt KB895971 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:895971

Dejte nám zpětnou vazbu

 

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