ÀÌ ¹®¼¿¡¼´Â Microsoft Visual C# NETÀÇ
HttpWebRequest ¹×
HttpWebResponse Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼¸¦ º¸³»´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù.
À¥ ¼¹ö°¡ ¿äûÇÒ °æ¿ì
HttpWebRequest ¹×
HttpWebResponse Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼¸¦ º¸³¾ ¼ö ÀÖ½À´Ï´Ù.
HttpWebRequest Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼¸¦ º¸³»´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ÀÎÁõ¼¸¦ ¾òÀ¸·Á¸é ´ÙÀ½ ¹æ¹ý Áß Çϳª¸¦ »ç¿ëÇϽʽÿÀ.
¹æ¹ý 1
X509Certificate Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© .cer ÆÄÀÏ¿¡¼ ÀÎÁõ¼¸¦ ÀÐÀº ´ÙÀ½
ClientCertificates ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù.
¹æ¹ý 2
CryptoAPI È£ÃâÀ» »ç¿ëÇÏ¿© ÀÎÁõ¼ ÀúÀå¼Ò¿¡¼ ÀÎÁõ¼¸¦ ¾òÀº ´ÙÀ½ ÀÌ ÀÎÁõ¼¿¡
X509Certificate Ŭ·¡½º¸¦ ¼³Á¤ÇÕ´Ï´Ù. ±×·± ´ÙÀ½
ClientCertificates ¼Ó¼ºÀ» ¼³Á¤ÇÕ´Ï´Ù.
Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼ º¸³»±â ¿ä±¸ »çÇ×
ASP.NET ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î ÀÛ¾÷ÇÏ´Â °æ¿ì¿¡´Â ´ÙÀ½ ¿ä±¸ »çÇ×ÀÌ ÃæÁ·µÇ¾î¾ß ÇÕ´Ï´Ù.
- Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼°¡ CURRENT_USER ·¹Áö½ºÆ®¸® ÇÏÀ̺갡 ¾Æ´Ï¶ó LOCAL_MACHINE ·¹Áö½ºÆ®¸®
ÇÏÀ̺꿡 ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼°¡ ¼³Ä¡µÈ À§Ä¡¸¦ È®ÀÎÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
- ½ÃÀÛ, ½ÇÇàÀ» Â÷·Ê·Î ´©¸£°í
mmc¸¦ ÀÔ·ÂÇÑ ´ÙÀ½ È®ÀÎÀ» ´©¸¨´Ï´Ù.
- ÆÄÀÏ ¸Þ´º¿¡¼ ½º³ÀÀÎ Ãß°¡/Á¦°Å¸¦
´©¸¨´Ï´Ù.
- ½º³ÀÀÎ Ãß°¡/Á¦°Å ´ëÈ »óÀÚ¿¡¼ Ãß°¡¸¦
´©¸¨´Ï´Ù.
- µ¶¸³ ½ÇÇàÇü ½º³ÀÀÎ Ãß°¡ ´ëÈ »óÀÚ¿¡¼
ÀÎÁõ¼¸¦ ´©¸¥ ´ÙÀ½ Ãß°¡¸¦ ´©¸¨´Ï´Ù.
- ÀÎÁõ¼ ½º³ÀÀÎ ´ëÈ »óÀÚ¿¡¼ ÄÄÇ»ÅÍ
°èÁ¤À» ´©¸£°í ´ÙÀ½À» ´©¸¨´Ï´Ù.
- ÄÄÇ»ÅÍ ¼±Åà ´ëÈ »óÀÚ¿¡¼ ¸¶Ä§À»
´©¸¨´Ï´Ù.
- µ¶¸³ ½ÇÇàÇü ½º³ÀÀÎ Ãß°¡ ´ëÈ »óÀÚ¿¡¼
´Ý±â¸¦ ´©¸¥ ´ÙÀ½ È®ÀÎÀ» ´©¸¨´Ï´Ù.
- ÀÎÁõ¼(·ÎÄà ÄÄÇ»ÅÍ), °³ÀÎÀ» Â÷·Ê·Î
È®ÀåÇϰí ÀÎÁõ¼¸¦ ´©¸¨´Ï´Ù.
¿À¸¥ÂÊ Ã¢¿¡ Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼°¡ Ç¥½ÃµË´Ï´Ù. - Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼ÀÇ °³ÀΠŰ¿¡ ASP.NET »ç¿ëÀÚ °èÁ¤ ±ÇÇÑÀ» ºÎ¿©ÇØ¾ß ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ® ÀÎÁõ¼ÀÇ °³ÀÎ
Ű¿¡ ASP.NET »ç¿ëÀÚ °èÁ¤ ±ÇÇÑÀ» ºÎ¿©ÇÏ·Á¸é WinHttpCertCfg.exe µµ±¸¸¦ »ç¿ëÇÕ´Ï´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº
Microsoft ±â¼ú ÀÚ·áÀÇ ´ÙÀ½ ¹®¼¸¦ ÂüÁ¶ÇϽʽÿÀ.
823193
(http://support.microsoft.com/kb/823193/
)
INFO: Windows HTTP 5.1 ÀÎÁõ¼ ¹× ÃßÀû µµ±¸¸¦ ¾ò´Â ¹æ¹ý
ÀÌ µµ±¸¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN(Microsoft
Developer Network) À¥ »çÀÌÆ®¸¦ ÂüÁ¶ÇϽʽÿÀ.
.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) À¥ »çÀÌÆ®¸¦ ÂüÁ¶ÇϽʽÿÀ.
Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì
(http://support.microsoft.com/newsgroups/default.aspx)
¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.±â¼ú ÀÚ·á: 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 |