วิธีการส่งใบรับรองไคลเอ็นต์ โดยใช้คลาส HttpWebRequest และ HttpWebResponse ใน Microsoft Visual c# .NET

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 895971 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้

ความต้องการ

เมื่อต้องการส่งใบรับรองไคลเอ็นต์จากโปรแกรมประยุกต์ Microsoft ASP.NET คุณต้องมีดังต่อไปนี้ฮอตฟิกซ์หรือเซอร์วิสแพ็คติดตั้ง:

Microsoft .NET Framework 1.0

คุณต้องติดตั้งใน.NET Framework 1.0 Service Pack 3 (SP3), หรือคุณต้องติดตั้งโปรแกรมแก้ไขด่วน 817854สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
817854การแก้ไข: โปรแกรมประยุกต์เว็บ ASP.NET ไม่สามารถส่งใบรับรองไคลเอ็นต์ไปยังเว็บไซต์ที่เพิ่มการรักษาความปลอดภัย

กรอบงาน.NET 1.1

คุณต้องติดตั้งใน.NET Framework 1.1 Service Pack 1 (SP1), หรือคุณต้องติดตั้งโปรแกรมแก้ไขด่วน 831138สำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
831138การแก้ไข: โปรแกรมประยุกต์.NET Framework ส่วนที่ใช้เมธอด System.Net.WebRequest บ่อยครั้งมากประสบข้อผิดพลาด OutOfMemoryException
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

บทนำ

บทความนี้อธิบายถึงวิธีการส่งใบรับรองไคลเอ็นต์ โดยใช้การHttpWebRequestและHttpWebResponseระดับชั้นใน Microsoft Visual c# NET

ข้อมูลเพิ่มเติม

คุณสามารถส่งใบรับรองไคลเอ็นต์เมื่อเว็บเซิร์ฟเวอร์ต้องใช้หนึ่ง โดยใช้การHttpWebRequestและHttpWebResponseคลาสที่ การขอรับใบรับรองที่ใช้สำหรับการส่งใบรับรองไคลเอ็นต์โดยใช้ การHttpWebRequestคลา ใช้หนึ่งในวิธีการต่อไปนี้:

วิธีที่ 1:

ใช้แบบX509Certificateคลาสอ่านใบรับรองจากแฟ้ม.cer และจากนั้น ตั้งค่านี้ClientCertificatesคุณสมบัติ

วิธีที่ 2

ใช้การเรียก CryptoAPI เพื่อขอรับใบรับรองจากเก็บใบรับรอง และจากนั้น ตั้งค่านี้X509Certificateคลาสของใบรับรองที่คุณได้รับจากเก็บใบรับรอง คุณสามารถตั้งค่าแล้วนี้ClientCertificatesคุณสมบัติ

ข้อกำหนดสำหรับการส่งใบรับรองไคลเอ็นต์

เมื่อคุณทำงานกับโปรแกรมประยุกต์ ASP.NET ตรวจสอบให้แน่ใจว่า มีการให้เสร็จสมบูรณ์ข้อกำหนดต่อไปนี้:
  • ใบรับรองของไคลเอ็นต์ต้องติดตั้ง ในรีจิสทรีไฮฟ์ LOCAL_MACHINE และไม่ได้อยู่ ในรีจิสทรีไฮฟ์ CURRENT_USER เมื่อต้องการยืนยันที่มีการติดตั้งใบรับรองของไคลเอ็นต์ ดำเนินการดังต่อไปนี้:
    1. คลิกเริ่มการทำงานคลิกเรียกใช้ประเภท:mmcแล้ว คลิกตกลง.
    2. ในการแฟ้ม:เมนู คลิกเพิ่ม/เอาออกสแนปอิน.
    3. ในการเพิ่ม/เอาออกสแนปอินกล่องโต้ตอบ คลิกadd.
    4. ในการเพิ่มสแนปอินแบบสแตนด์อโลนกล่องโต้ตอบกล่อง คลิกใบรับรองแล้ว คลิกadd.
    5. ในการสแนปอินใบรับรองกล่องโต้ตอบกล่อง คลิกบัญชีคอมพิวเตอร์แล้ว คลิกถัดไป
    6. ในการเลือกคอมพิวเตอร์กล่องโต้ตอบ คลิกเสร็จสิ้น.
    7. ในการเพิ่มสแนปอินแบบสแตนด์อโลนกล่องโต้ตอบกล่อง คลิกปิดแล้ว คลิกตกลง.
    8. ขยายใบ รับรอง (ภาย ใน เครื่อง คอมพิวเตอร์), ขยายส่วน บุคคลแล้ว คลิกใบรับรอง.
    ในบานหน้าต่างด้านขวา คุณควรถูกแสดงด้วยใบรับรองของไคลเอ็นต์
  • คุณต้องให้ผู้ใช้ ASP.NET บัญชีสิทธิ์ให้คีย์ส่วนตัวสำหรับใบรับรองของไคลเอ็นต์ เมื่อต้องการให้ผู้ใช้ ASP.NET สิทธิ์บัญชีกับคีย์ส่วนตัวสำหรับใบรับรองของไคลเอนต์ ใช้เครื่องมือ WinHttpCertCfg.exeสำหรับข้อมูลเพิ่มเติม ให้คลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
    823193วิธีการเรียกใช้เครื่องมือ Windows HTTP 5.1 ใบรับรองและการสืบค้นกลับ
    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการใช้เครื่องมือนี้ ไปที่เว็บไซต์ของ Microsoft สำหรับนักพัฒนาเครือข่าย (MSDN) ต่อไปนี้:
    WinHttpCertCfg.exe เครื่องมือตั้งค่าคอนฟิกใบรับรองhttp://msdn2.microsoft.com/en-us/library/aa384088.aspx

การใช้แฟ้ม.cer

วิธีที่ 1 ถูกใช้งานง่ายขึ้น แต่วิธีที่คุณต้องมีแฟ้ม.cer ถ้าคุณไม่มีแฟ้ม.cer ที่ติดตั้ง ใช้ Microsoft Internet Explorer จะส่งออกแฟ้ม.cer

รหัสต้นทางต่อไปนี้อธิบายถึงวิธีการขอรับใบรับรองจากแฟ้ม.cer ที่คุณสามารถใช้กับHttpWebRequestคลาสที่
//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;
	}
}

ใช้การเรียก CryptoAPI

ถ้าคุณต้องขอรับใบรับรองจากเก็บใบรับรอง ใช้ฟังก์ชัน CryptoAPI เพื่อขอรับใบรับรอง แล้ว เก็บไว้ในการX509Certificateคลาสของวัตถุ กระบวนการX509CertificateCollectionคลาสที่ระบุใบรับรองทั้งหมดในร้านค้า และเอาใส่ไว้ในการX509CertificateCollectionคลาสของวัตถุ

ถ้าคุณต้องการขอรับใบรับรองที่เจาะจง คุณต้องเปลี่ยนรหัสระดับชั้นเพื่อขอรับใบรับรองที่ระบุ โดยใช้การCertFindCertificateInStoreฟังก์ชัน ฟังก์ชันนี้ถูกประกาศในแฟ้ม Wincrypt.h อีกวิธีหนึ่งคือ คุณสามารถระบุการX509CertificateCollectionฟังก์ชันการค้นหาใบรับรองที่คุณต้องการ

ตัวอย่างรหัสต่อไปนี้ใช้ใบรับรองที่แรกในคอลเลกชันที่มีการส่งคืนจากการ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;
		}
	}
}

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม แวะไปไซต์เว็บ Network (MSDN) นักพัฒนา Microsoft ต่อไปนี้:
คลา X509Certificate
.aspx http://msdn2.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate (vs.71)
แพลตฟอร์ม SDK: เข้ารหัส
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

คุณสมบัติ

หมายเลขบทความ (Article ID): 895971 - รีวิวครั้งสุดท้าย: 15 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Keywords: 
kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo kbmt KB895971 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:895971

ให้ข้อเสนอแนะ

 

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