Microsoft Visual C# .NETÀÇ HttpWebRequest ¹× HttpWebResponse Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ º¸³»´Â ¹æ¹ý

±â¼ú ÀÚ·á: 895971 - ÀÌ ¹®¼­°¡ Àû¿ëµÇ´Â Á¦Ç° º¸±â.

¿ä±¸ »çÇ×

Microsoft ASP.NET ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ º¸³»·Á¸é ´ÙÀ½ ÇÖÇȽº³ª ¼­ºñ½º ÆÑÀÌ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù.

Microsoft .NET Framework 1.0

.NET Framework 1.0 ¼­ºñ½º ÆÑ 3(SP3)À» ¼³Ä¡Çϰųª ÇÖÇȽº 817854¸¦ ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
817854 FIX: ASP.NET À¥ ÀÀ¿ë ÇÁ·Î±×·¥Àº º¸¾È À¥ »çÀÌÆ®·Î Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ Àü´ÞÇÒ ¼ö ¾ø´Ù

.NET Framework 1.1

.NET Framework 1.1 ¼­ºñ½º ÆÑ 1(SP1)À» ¼³Ä¡Çϰųª ÇÖÇȽº 831138À» ¼³Ä¡ÇØ¾ß ÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
831138 FIX: System.Net.WebRequest ¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â .NET Framework ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­ OutOfMemoryException ¿À·ù°¡ ¸Å¿ì ÀÚÁÖ ¹ß»ýÇÑ´Ù
¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

ÀÌ ÆäÀÌÁö¿¡¼­

¼Ò°³

ÀÌ ¹®¼­¿¡¼­´Â Microsoft Visual C# NETÀÇ HttpWebRequest ¹× HttpWebResponse Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ º¸³»´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.

Ãß°¡ Á¤º¸

À¥ ¼­¹ö°¡ ¿äûÇÒ °æ¿ì HttpWebRequest ¹× HttpWebResponse Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ º¸³¾ ¼ö ÀÖ½À´Ï´Ù. HttpWebRequest Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­¸¦ º¸³»´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÎÁõ¼­¸¦ ¾òÀ¸·Á¸é ´ÙÀ½ ¹æ¹ý Áß Çϳª¸¦ »ç¿ëÇϽʽÿÀ.

¹æ¹ý 1

X509Certificate Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© .cer ÆÄÀÏ¿¡¼­ ÀÎÁõ¼­¸¦ ÀÐÀº ´ÙÀ½ ClientCertificates ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù.

¹æ¹ý 2

CryptoAPI È£ÃâÀ» »ç¿ëÇÏ¿© ÀÎÁõ¼­ ÀúÀå¼Ò¿¡¼­ ÀÎÁõ¼­¸¦ ¾òÀº ´ÙÀ½ ÀÌ ÀÎÁõ¼­¿¡ X509Certificate Ŭ·¡½º¸¦ ¼³Á¤ÇÕ´Ï´Ù. ±×·± ´ÙÀ½ ClientCertificates ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù.

Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­ º¸³»±â ¿ä±¸ »çÇ×

ASP.NET ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î ÀÛ¾÷ÇÏ´Â °æ¿ì¿¡´Â ´ÙÀ½ ¿ä±¸ »çÇ×ÀÌ ÃæÁ·µÇ¾î¾ß ÇÕ´Ï´Ù.
  • Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­°¡ CURRENT_USER ·¹Áö½ºÆ®¸® ÇÏÀ̺갡 ¾Æ´Ï¶ó LOCAL_MACHINE ·¹Áö½ºÆ®¸® ÇÏÀ̺꿡 ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­°¡ ¼³Ä¡µÈ À§Ä¡¸¦ È®ÀÎÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
    1. ½ÃÀÛ, ½ÇÇàÀ» Â÷·Ê·Î ´©¸£°í mmc¸¦ ÀÔ·ÂÇÑ ´ÙÀ½ È®ÀÎÀ» ´©¸¨´Ï´Ù.
    2. ÆÄÀÏ ¸Þ´º¿¡¼­ ½º³ÀÀÎ Ãß°¡/Á¦°Å¸¦ ´©¸¨´Ï´Ù.
    3. ½º³ÀÀÎ Ãß°¡/Á¦°Å ´ëÈ­ »óÀÚ¿¡¼­ Ãß°¡¸¦ ´©¸¨´Ï´Ù.
    4. µ¶¸³ ½ÇÇàÇü ½º³ÀÀÎ Ãß°¡ ´ëÈ­ »óÀÚ¿¡¼­ ÀÎÁõ¼­¸¦ ´©¸¥ ´ÙÀ½ Ãß°¡¸¦ ´©¸¨´Ï´Ù.
    5. ÀÎÁõ¼­ ½º³ÀÀÎ ´ëÈ­ »óÀÚ¿¡¼­ ÄÄÇ»ÅÍ °èÁ¤À» ´©¸£°í ´ÙÀ½À» ´©¸¨´Ï´Ù.
    6. ÄÄÇ»ÅÍ ¼±Åà ´ëÈ­ »óÀÚ¿¡¼­ ¸¶Ä§À» ´©¸¨´Ï´Ù.
    7. µ¶¸³ ½ÇÇàÇü ½º³ÀÀÎ Ãß°¡ ´ëÈ­ »óÀÚ¿¡¼­ ´Ý±â¸¦ ´©¸¥ ´ÙÀ½ È®ÀÎÀ» ´©¸¨´Ï´Ù.
    8. ÀÎÁõ¼­(·ÎÄà ÄÄÇ»ÅÍ), °³ÀÎÀ» Â÷·Ê·Î È®ÀåÇϰí ÀÎÁõ¼­¸¦ ´©¸¨´Ï´Ù.
    ¿À¸¥ÂÊ Ã¢¿¡ Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­°¡ Ç¥½ÃµË´Ï´Ù.
  • Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­ÀÇ °³ÀΠŰ¿¡ ASP.NET »ç¿ëÀÚ °èÁ¤ ±ÇÇÑÀ» ºÎ¿©ÇØ¾ß ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼­ÀÇ °³ÀΠŰ¿¡ ASP.NET »ç¿ëÀÚ °èÁ¤ ±ÇÇÑÀ» ºÎ¿©ÇÏ·Á¸é WinHttpCertCfg.exe µµ±¸¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
    823193 INFO: Windows HTTP 5.1 ÀÎÁõ¼­ ¹× ÃßÀû µµ±¸¸¦ ¾ò´Â ¹æ¹ý
    ÀÌ µµ±¸¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN(Microsoft Developer Network) À¥ »çÀÌÆ®¸¦ ÂüÁ¶ÇϽʽÿÀ.
    WinHttpCertCfg.exe ÀÎÁõ¼­ ±¸¼º µµ±¸ http://msdn2.microsoft.com/en-us/library/aa384088.aspx(¿µ¹®)

.cer ÆÄÀÏ »ç¿ë

¹æ¹ý 1Àº °¡Àå ½¬¿î ¹æ¹ýÀÌÁö¸¸ .cer ÆÄÀÏÀÌ ÇÊ¿äÇÕ´Ï´Ù. .cer ÆÄÀÏÀÌ ¼³Ä¡µÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì¿¡´Â Microsoft Internet Explorer¸¦ »ç¿ëÇÏ¿© .cer ÆÄÀÏÀ» ³»º¸³¾ ¼ö ÀÖ½À´Ï´Ù.

´ÙÀ½Àº HttpWebRequest Ŭ·¡½º¿Í ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÎÁõ¼­¸¦ .cer ÆÄÀÏ¿¡¼­ ¾ò´Â ¹æ¹ýÀ» º¸¿© ÁÖ´Â ¼Ò½º ÄÚµåÀÔ´Ï´Ù.
//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;
		}
	}
}

ÂüÁ¶

ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN(Microsoft Developer Network) À¥ »çÀÌÆ®¸¦ ÂüÁ¶ÇϽʽÿÀ.
X509Certificate Ŭ·¡½º
http://msdn.microsoft.com/library/kor/default.asp?url=/library/kor/cpref/html/frlrfsystemsecuritycryptographyx509certificatesx509certificateclasstopic.asp
Platform SDK: ¾Ïȣȭ
http://msdn2.microsoft.com/en-us/library/aa380255.aspx(¿µ¹®)




Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.

¼Ó¼º

±â¼ú ÀÚ·á: 895971 - ¸¶Áö¸· °ËÅä: 2007³â 1¿ù 16ÀÏ È­¿äÀÏ - ¼öÁ¤: 1.4
º» ¹®¼­ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Ű¿öµå:?
kbhowto kbhowtomaster kbinfo kbprogramming kbwebclasses kbsample kbcode kbaspnet kbdigitalcertificates KB895971

Çǵå¹é º¸³»±â