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

ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:895971
บทความนี้ถูกเก็บถาวรแล้วเนื้อหาของบทความจึงถูกนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก
บทนำ
บทความนี้อธิบายถึงวิธีการส่งใบรับรองไคลเอ็นต์ โดยใช้การHttpWebRequestและHttpWebResponseระดับชั้นใน Microsoft Visual c# NET

ความต้องการ

เมื่อต้องการส่งใบรับรองไคลเอ็นต์จากโปรแกรมประยุกต์ 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คลาสที่ การขอรับใบรับรองที่ใช้สำหรับการส่งใบรับรองไคลเอ็นต์โดยใช้ การ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 ต่อไปนี้:
แพลตฟอร์ม SDK: เข้ารหัส
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 895971 - การตรวจสอบครั้งสุดท้าย: 12/09/2015 02:17:19 - ฉบับแก้ไข: 4.0

Microsoft .NET Framework 1.1, Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo kbmt KB895971 KbMtth
คำติชม