Τρόπος αποστολής ενός πιστοποιητικού προγράμματος-πελάτη με τη χρήση των κλάσεων HttpWebRequest και HttpWebResponse στο Microsoft Visual C# .NET

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 895971 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.

ΑΠΑΙΤΗΣΕΙΣ

Για να στείλετε ένα πιστοποιητικό προγράμματος-πελάτη από τις εφαρμογές του Microsoft ASP.NET, πρέπει να έχετε τις ακόλουθες επείγουσες επιδιορθώσεις ή το service pack εγκατεστημένο:

Microsoft .NET framework 1.0

Πρέπει να εγκαταστήσετε το .NET Framework 1.0 Service Pack 3 (SP3) ή θα πρέπει να εγκαταστήσετε την επείγουσα επιδιόρθωση 817854.Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
817854ΕΝΗΜΕΡΩΣΗ: Εφαρμογή Web του ASP.NET δεν μπορεί να παραδώσει ένα πιστοποιητικό προγράμματος-πελάτη σε μια τοποθεσία Web με εμπλουτισμένη ασφάλεια

.NET framework 1.1

Πρέπει να εγκαταστήσετε το .NET Framework 1.1 Service Pack 1 (SP1) ή θα πρέπει να εγκαταστήσετε την επείγουσα επιδιόρθωση 831138.Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
831138ΕΝΗΜΕΡΩΣΗ: Μια εφαρμογή .NET Framework που χρησιμοποιεί τη μέθοδο System.Net.WebRequest πολύ συχνά αντιμετωπίζει σφάλματα OutOfMemoryException
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

ΕΙΣΑΓΩΓΗ

Αυτό το άρθρο περιγράφει τον τρόπο αποστολής ενός πιστοποιητικού προγράμματος-πελάτη, χρησιμοποιώντας τοHttpWebRequestANDHttpWebResponseκατηγορίες στην Microsoft Visual C# NET.

Περισσότερες πληροφορίες

Μπορείτε να στείλετε ένα πιστοποιητικό προγράμματος-πελάτη, όταν ο διακομιστής Web απαιτεί ένα, χρησιμοποιώντας τοHttpWebRequestκαι τοHttpWebResponseκλάσεις. Για να αποκτήσετε ένα πιστοποιητικό το οποίο μπορεί να χρησιμοποιηθεί για την αποστολή ενός πιστοποιητικού προγράμματος-πελάτη, χρησιμοποιώντας τοHttpWebRequestκλάση, χρησιμοποιήστε μία από τις ακόλουθες μεθόδους:

Μέθοδος 1

Χρήση τουΠιστοποιητικό x 509κλάσης για να διαβάσετε το πιστοποιητικό από ένα αρχείο .cer και, στη συνέχεια, ορίστε τοClientCertificatesΙδιότητα.

Μέθοδος 2

Χρησιμοποιήστε το CryptoAPI κλήσεις για να αποκτήσετε το πιστοποιητικό από το χώρο αποθήκευσης πιστοποιητικών, και στη συνέχεια ορίστε τοΠιστοποιητικό x 509η κλάση με το πιστοποιητικό που παραλήφθηκε από το χώρο αποθήκευσης πιστοποιητικών. Μπορείτε να ορίσετε τοClientCertificatesΙδιότητα.

Απαιτήσεις για την αποστολή ενός πιστοποιητικού προγράμματος-πελάτη

Όταν εργάζεστε με τις εφαρμογές ASP.NET, βεβαιωθείτε ότι έχουν ολοκληρωθεί οι ακόλουθες απαιτήσεις:
  • Το πιστοποιητικό προγράμματος-πελάτη πρέπει να εγκατασταθεί στην ομάδα μητρώου LOCAL_MACHINE και όχι στην ομάδα μητρώου CURRENT_USER. Για να επιβεβαιώσετε την όπου είναι εγκατεστημένο το πιστοποιητικό προγράμματος-πελάτη, ακολουθήστε τα εξής βήματα:
    1. Κάντε κλικStartΚάντε κλικΕκτέλεσηTYPEMMC, και στη συνέχεια κάντε κλικ στο κουμπίOk.
    2. Στο διακομιστήFILEμενού, κάντε κλικ στο κουμπίΠροσθήκη/Κατάργηση συμπληρωματικού προγράμματος.
    3. ΣτοΠροσθήκη/Κατάργηση συμπληρωματικού προγράμματοςπαράθυρο διαλόγου, κάντε κλικ στο κουμπίADD.
    4. ΣτοΠροσθήκη μεμονωμένου συμπληρωματικού προγράμματοςπαράθυρο διαλόγου πλαίσιο, κάντε κλικ στο κουμπίΠιστοποιητικά (Certificates), και στη συνέχεια κάντε κλικ στο κουμπίADD.
    5. ΣτοΣυμπληρωματικό πρόγραμμα πιστοποιητικώνπαράθυρο διαλόγου πλαίσιο, κάντε κλικ στο κουμπίΛογαριασμός υπολογιστή, και στη συνέχεια κάντε κλικ στο κουμπίΕπόμενο
    6. ΣτοΕπιλέξτε τον υπολογιστήπαράθυρο διαλόγου, κάντε κλικ στο κουμπίΦινλανδικά.
    7. ΣτοΠροσθήκη μεμονωμένου συμπληρωματικού προγράμματοςπαράθυρο διαλόγου πλαίσιο, κάντε κλικ στο κουμπίClose (Κλείσιμο), και στη συνέχεια κάντε κλικ στο κουμπίOk.
    8. expandΠιστοποιητικά (τοπικός υπολογιστής)expandΠροσωπικά, και στη συνέχεια κάντε κλικ στο κουμπίΠιστοποιητικά (Certificates).
    Στο δεξιό τμήμα του παραθύρου, θα πρέπει να παρατίθεται στο πιστοποιητικό προγράμματος-πελάτη.
  • Πρέπει να δώσετε στο χρήστη ASP.NET δικαιώματα λογαριασμού στο ιδιωτικό κλειδί για το πιστοποιητικό προγράμματος-πελάτη. Για να δώσετε στο χρήστη ASP.NET δικαιώματα λογαριασμού στο ιδιωτικό κλειδί για το πιστοποιητικό προγράμματος-πελάτη, χρησιμοποιήστε το εργαλείο WinHttpCertCfg.exe.Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
    823193Πώς να τοποθετήσετε τα εργαλεία του πιστοποιητικού και του εντοπισμού 5.1 HTTP των Windows
    Για περισσότερες πληροφορίες σχετικά με το πώς μπορείτε να χρησιμοποιήσετε αυτό το εργαλείο, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft Developer Network (MSDN) στο Web:
    WinHttpCertCfg.exe, ένα εργαλείο ρύθμισης παραμέτρων πιστοποιητικούhttp://msdn2.Microsoft.com/en-us/library/aa384088.aspx

Χρήση ενός αρχείου .cer

Η μέθοδος 1 είναι ευκολότερη στη χρήση, αλλά η μέθοδος απαιτεί να έχετε ένα αρχείο .cer. Εάν έχετε εγκαταστήσει το αρχείο .cer που χρησιμοποιεί Microsoft Internet Explorer, για να εξαγάγετε το αρχείο .cer.

Ο κώδικας προέλευσης που ακολουθεί περιγράφει πώς μπορείτε να αποκτήσετε ένα πιστοποιητικό από ένα αρχείο .cer που μπορείτε να χρησιμοποιήσετε με τοHttpWebRequestCLASS.
//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 για να αποκτήσετε το πιστοποιητικό και στη συνέχεια να την αποθηκεύσετε σε έναΠιστοποιητικό x 509η κλάση αντικειμένου. Για ναX509CertificateCollectionη κλάση Απαριθμεί όλα τα πιστοποιητικά σε ένα χώρο αποθήκευσης και στη συνέχεια να τα τοποθετεί σε έναX509CertificateCollectionη κλάση αντικειμένου.

If you want to obtain a specific certificate, you must change the class code to obtain a specific certificate by using theCertFindCertificateInStoreFunction. This function is declared in the Wincrypt.h file. Alternatively, you can enumerate theX509CertificateCollectionfunction to find the certificate that you want.

The following sample code uses the first certificate in the collection that is returned from theCertEnumCertificatesInStoreFunction.
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;
		}
	}
}

Αναφορές

Για περισσότερες πληροφορίες, επισκεφθείτε τις ακόλουθες τοποθεσίες Web Microsoft Developer Network (MSDN):
X509Certificate class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509certificate(vs.71).aspx
Platform SDK: Cryptography
http://msdn2.microsoft.com/en-us/library/aa380255.aspx

Ιδιότητες

Αναγν. άρθρου: 895971 - Τελευταία αναθεώρηση: Πέμπτη, 23 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Λέξεις-κλειδιά: 
kbhowtomaster kbaspnet kbsample kbcode kbdigitalcertificates kbprogramming kbwebclasses kbhowto kbinfo kbmt KB895971 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της 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