Bir istemci sertifikası, Microsoft Visual C# .NET ile HttpWebRequest ve HttpWebResponse sınıfları kullanarak gönderme

Makale çevirileri Makale çevirileri
Makale numarası: 895971 - Bu makalenin geçerli olduğu ürünleri görün.

Gereksinimler

Bir istemci sertifikası, Microsoft ASP.NET uygulamalarını göndermek için <a0></a0>, aşağıdaki düzeltme veya hizmet paketlerinin yüklü olması gerekir:

Microsoft .NET framework 1.0

.NET Framework 1.0 Service Pack 3 (SP3) yüklemelisiniz ya da <a1>düzeltme</a1> 817854 yüklemeniz gerekir.Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
817854Düzeltme: ASP.NET Web uygulaması güvenliği artırılmış Web sitesine bir istemci sertifikası teslim edemiyor

.NET framework 1.1

.NET Framework 1.1 Service Pack 1 (SP1) yüklemeniz gerekir; <a1>düzeltme</a1> 831138 yüklemeniz gerekir.Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
831138Düzeltme: çok sık System.Net.WebRequest yöntemini kullanan BIR .NET Framework uygulaması OutOfMemoryException hataları karşılaşır.
Hepsini aç | Hepsini kapa

Bu Sayfada

Giriş

Bu makalede, Microsoft Visual C# NET HttpWebRequest ve HttpWebResponse sınıfları kullanarak istemci sertifikası gönderme anlatılır.

Daha fazla bilgi

HttpWebRequest ve HttpWebResponse sınıfları kullanarak bir Web sunucusu gerektiğinde bir istemci sertifikası gönderebilir. HttpWebRequest sınıfı kullanılarak, bir istemci sertifikası göndermek için kullanılabilecek bir sertifika almak için <a0></a0>, aşağıdaki yöntemlerden birini kullanın:

Yöntem 1

X509Certificate sınıfı, sertifikanın bir .cer dosyasını okumak için kullanın ve sonra ClientCertificates özelliğini ayarlayın.

Yöntem 2

X509Certificate sınıfı, sertifikayı sertifika deposundan alınan ayarlayın ve Cryptoapı çağrıları sertifika deposundan sertifika almak için kullanın. Sonra ClientCertificates özelliğini ayarlayabilirsiniz.

Bir istemci sertifikası göndermek için gereksinimler

ASP.NET uygulamaları ile çalışırken, aşağıdaki gereksinimleri tamamlandığından emin olun:
  • Istemci sertifikası LOCAL_MACHINE kayıt defteri kovanının ve değil örnein kayıt defteri kovanı yüklenmiş olmalıdır. Istemci sertifikasının yüklü olduğu doğrulamak için şu adımları izleyin:
    1. Başlat ' ı tıklatın, Çalıştır ' ı tıklatın, mmc yazın ve Tamam ' ı tıklatın.
    2. Dosya menüsünde, ek bileşen Ekle/Kaldır'ı tıklatın.
    3. Eklenti Ekle/Kaldır iletişim kutusunda <a3>Ekle</a3>'yi tıklatın.
    4. Tek başına ek bileşen iletişim kutusunda,Sertifikalar ' ı tıklatın ve sonra Ekle ' yi tıklatın.
    5. Sertifikalar ek bileşenini iletişim kutusunda, bilgisayar hesabını tıklatın ve sonra ileri ' yi tıklatın.
    6. Bilgisayar Seç iletişim kutusunda son ' u tıklatın.
    7. Tek başına ek bileşen Ekle iletişim kutusundaKapat ' ı tıklatın ve sonra Tamam ' ı tıklatın.
    8. Sertifikalar (yerel bilgisayar) genişletin, Personal ' ı genişletin ve sonra Sertifikalar ' ı tıklatın.
    Sağ bölmede, istemci sertifikası listelenmelidir.
  • ASP.NET kullanıcı, istemci sertifikasının özel anahtarına hesabı izinleri vermelisiniz. ASP.NET kullanıcının istemci sertifikasının özel anahtarına hesap izinlerini vermek için <a0></a0>, WinHttpCertCfg.exe aracını kullanın.Daha fazla bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
    823193Windows HTTP 5.1 sertifika ve izleme araçlarının nasıl edinilir
    Bu Aracı'nı kullanma hakkında daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitesini ziyaret edin:
    http://msdn2.microsoft.com/en-us/library/aa384088.aspx WinHttpCertCfg.exe, bir sertifika yapılandırma aracı

Bir .cer dosyasını kullanma

Yöntem 1 kullanmak daha kolay olsa da, .cer uzantılı bir dosya olduğunu yöntemi gerektirir. .Cer dosya yüklü değilse, Microsoft ınternet kullanmak Explorer .cer dosyasına vermek için.

Aşağıdaki kaynak kodu, bir proxy gereksinim duyarsanız, HttpWebRequest 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;
	}
}

Cryptoapı çağrılarını kullanarak

Sertifika deposundan sertifika edinmelisiniz, Cryptoapı işlevleri, sertifika almak için kullanabilirsiniz ve bir X509Certificate sınıf nesnesi içinde depolar. X509CertificateCollection sınıfı, bir depodaki tüm sertifikaları numaralandırır ve ardından X509CertificateCollection sınıf nesnenin geçirir.

Belirli bir sertifika almak istiyorsanız, CertFindCertificateInStore işlevini kullanarak belirli bir sertifika almak için sınıf kodunu değiştirmeniz gerekir. Bu işlev, Wincrypt.h dosyasında bildirildi. Alternatif olarak, istediğiniz sertifikayı bulmak için X509CertificateCollection işlevi numaralandırabilirsiniz.

Aşağıdaki örnek kod, derlemedeki CertEnumCertificatesInStore işlevinden döndürülen ilk sertifika kullanır.
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;
		}
	}
}

Referanslar

Daha fazla bilgi için aşağıdaki Microsoft Developer Network (MSDN) Web sitelerini ziyaret edin:
X509Certificate sınıfı
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate(vs.71).aspx
Platform SDK: şifreleme
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

Özellikler

Makale numarası: 895971 - Last Review: 18 Mayıs 2007 Cuma - Gözden geçirme: 1.6
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Anahtar Kelimeler: 
kbmt kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo KB895971 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:895971

Geri Bildirim Ver

 

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