Como enviar um certificado de cliente usando as classes HttpWebRequest e HttpWebResponse no Microsoft Visual translation from VPE for Csharp .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 895971 - Exibir os produtos aos quais esse artigo se aplica.

Requisitos

Para enviar um certificado de cliente a partir de aplicativos Microsoft ASP.NET, você deve ter os seguintes hotfixes ou service packs instalados:

Microsoft .NET framework 1.0

Você deve instalar o .NET Framework 1.0 Service Pack 3 (SP3) ou você deve instalar o hotfix 817854.Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
817854CORRECÇÃO: O aplicativo ASP.NET não pode enviar um certificado de cliente para um site com segurança avançada

.NET framework 1.1

Você deve instalar o .NET Framework 1.1 Service Pack 1 (SP1) ou você deve instalar o hotfix 831138.Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
831138CORRECÇÃO: Um aplicativo .NET Framework que usa o método System.NET.WebRequest com muita freqüência experiências OutOfMemoryException erros
Expandir tudo | Recolher tudo

Neste artigo

INTRODUÇÃO

Este artigo descreve como enviar um certificado de cliente usando o HttpWebRequest e classes de HttpWebResponse no Microsoft Visual translation from VPE for Csharp NET.

Mais Informações

Você pode enviar um certificado de cliente quando o servidor Web requer um usando HttpWebRequest e as classes de HttpWebResponse . Para obter um certificado que pode ser usado para enviar um certificado de cliente usando a classe HttpWebRequest , use um dos seguintes métodos:

Método 1

Usar a classe X509Certificate para ler o certificado de um arquivo .cer e em seguida, defina a propriedade ClientCertificates .

Método 2

Use CryptoAPI chamadas para obter o certificado do armazenamento de certificados e, em seguida, definir a classe X509Certificate para o certificado que você recebeu do armazenamento de certificados. Em seguida, você pode definir a propriedade ClientCertificates .

Requisitos para enviar um certificado de cliente

Quando você trabalha com aplicativos ASP.NET, verifique se que os seguintes requisitos são concluídos:
  • O certificado de cliente deve ser instalado no hive do Registro LOCAL_MACHINE e não no hive do Registro CURRENT_USER. Para confirmar onde o certificado de cliente é instalado, execute essas etapas:
    1. Clique em Iniciar , clique em Executar , digite mmc e, em seguida, clique em OK .
    2. No menu arquivo , clique em Adicionar/remover Snap-in .
    3. Na caixa de diálogo Adicionar/remover Snap-in , clique em Adicionar .
    4. Na caixa de diálogo Adicionar Snap-in autônomo , clique em certificados e, em seguida, clique em Adicionar .
    5. Na caixa de diálogo snap-in de certificados , clique em conta de computador e, em seguida, clique em Avançar
    6. Na caixa de diálogo Selecionar computador , clique em Concluir .
    7. Na caixa de diálogo Adicionar Snap-in autônomo , clique em Fechar e, em seguida, clique em OK .
    8. Expanda certificados (computador local) , expanda pessoal e em seguida, clique em certificados .
    O certificado de cliente deve estar listado no painel à direita.
  • Você deve dar permissões de conta para a chave particular para o certificado de cliente para o usuário do ASP.NET. Para conceder permissões de conta para a chave particular para o certificado de cliente de usuário ASP.NET, use a ferramenta WinHttpCertCfg.exe.Para obter mais informações, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
    823193Como obter ferramentas de certificado e rastreamento de Windows HTTP 5.1
    Para obter mais informações sobre como usar essa ferramenta, visite a seguinte site da Microsoft Developer Network (MSDN):
    WinHttpCertCfg.exe, uma configuração de certificado ferramenta http://msdn2.microsoft.com/en-us/library/aa384088.aspx

Usando um arquivo .cer

Método 1 é mais fácil de usar, mas o método requer que você tenha um arquivo cer. Se você não tiver o arquivo .cer instalado, use o Microsoft Internet Explorer para exportar o arquivo .cer.

O código de origem a seguir descreve como obter um certificado de um arquivo .cer que você pode usar com 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;
	}
}

Usando chamadas de CryptoAPI

Se você deve obter o certificado do armazenamento de certificados, use as funções de CryptoAPI para obter o certificado e armazená-lo em um objeto de classe X509Certificate . A classe X509CertificateCollection enumera todos os certificados em um armazenamento e, em seguida, coloca em um objeto de classe X509CertificateCollection .

Se você desejar obter um certificado específico, você deve alterar o código de classe para obter um certificado específico, usando a função CertFindCertificateInStore . Esta função está declarada no arquivo Wincrypt.h. Como alternativa, você pode enumerar a função X509CertificateCollection para encontrar o certificado que você deseja.

O seguinte código de exemplo usa o primeiro certificado na coleção é retornada da função 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;
		}
	}
}

Referências

Para obter mais informações, visite os seguintes sites do Microsoft Developer Network (MSDN) da:
Classe X509Certificate
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate(vs.71).aspx
Platform SDK: criptografia
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

Propriedades

ID do artigo: 895971 - Última revisão: sexta-feira, 18 de maio de 2007 - Revisão: 1.6
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Palavras-chave: 
kbmt kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo KB895971 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 895971

Submeter comentários

 

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