Esistono due tipi di certificato. Lato Server e Lato Client.

I certificati vengono considerati le carte d’identità di internet.

Con un certificato un server può dimostrare all’utente la bontà del territorio in cui sta navigando.

Lo stesso può essere fatto da un utente, il quale deve dimostrare di essere effettivamente la persona che il server si aspetta.

 

L’azienda presso la quale sto svolgendo il ruolo di consulente ha avuto la necessità di realizzare certificati lato client firmati dalla propria Certification Authority interna.


Vorrei condivere questo argomento con voi, sperando che vi possa essere di aiuto in un vostro futuro progetto.

 

Per preparare la ricetta abbiamo bisogno di

Xenroll.dll

certcli.dll

Microsoft Certification Services

 

xenroll.dll, il componente che effettua le richieste alla Certification Authority, lo potete trovare nella cartella system32 di windows.

 

certcli.dll,il componente che s’impegna a ricevere le risposte dalla Certification Authority, l’ho trovata su www.dlldump.com

 

La certification Authority deve essere installata su una macchina interna presente nello stesso dominio.

 

Per prima cosa dobbiamo referenziare i due componenti.

Quindi effettuiamo Interop di xenroll e certcli, a questo punto abbiamo trasformato i componenti com in oggetti .net

 


Il codice che segue è di facile interpretazione :

 

             const int GETCERT_CAINFO = 0x700E666F;

             const int CR_OUT_BASE64HEADER = 0x00000000; 

             const int CR_OUT_BINARY = 0x00000002;

             const int GETCERT_CACERTBYINDEX = 0x63740000;

             const int CAINFOFIELD_RENEWALS = 1;

 

             const int AT_KEYEXCHANGE = 0x1;

             const int CR_IN_BASE64 = 0x1;

             const int CR_IN_PKCS10 = 0x100;

             const int CR_DISP_ISSUED = 0x3;

             const int CR_OUT_BASE64 = 0x1;

             const int CR_OUT_CHAIN = 0x100;

 

private void scaricaCertificato()

             {     

                    #region [RICHIESTA] di Certificato alla Certification Authority

                    ICEnroll4 CenRoll = new CEnrollClass();

 

                    CenRoll.ProviderType = 1;

                    CenRoll.KeySpec = AT_KEYEXCHANGE;

                    CenRoll.addCertTypeToRequest("User");

                    CenRoll.MyStoreFlags = 2 << 16;

                    CenRoll.RequestStoreFlags = 2 << 16;

 

                    string strReqCert = "CN=" + TextBox1.Text + ",OU=Test,OU=MiaOU,DC=MiaDC1,DC=it";

                    #endregion

 

                    if (strReqCert != null)

                    {

                           ICertRequest2 Req;

                           ICertConfig cconfig;

                           Req = new CCertRequestClass();

                           cconfig = new CERTCLIENTLib.CCertConfig();

                          

                           string strPKCS7;

                           string pkcs10 = CenRoll.createPKCS10(strReqCert, "1.3.6.1.5.5.7.3.3");

 

                           string strFormReqCert = "-----BEGIN NEW CERTIFICATE REQUEST-----" + Environment.NewLine + pkcs10 + Environment.NewLine + "-----END NEW CERTIFICATE REQUEST-----";

                           string strDefaultConfig = cconfig.GetConfig(0);

 

                           int Dis = 0;

                           try

                           {

 

                                  Dis = Req.Submit(CR_IN_BASE64 | CR_IN_PKCS10,pkcs10,null,strDefaultConfig);

                           }

                           catch (Exception Exception_)

                           {

                                  Response.Write(Exception_.Message.ToString());

                           }

 

                           if (Dis == CR_DISP_ISSUED) // Disponibilità al download del certificato

                           {     

                                  strPKCS7 = Req.GetCertificate(CR_OUT_BASE64 | CR_OUT_CHAIN);

 

                                        if (strPKCS7 != null)

                                        {

                                               CenRoll.acceptPKCS7(strPKCS7);

                                        }

                                        else

                                        {

                                               Response.Write("Non è stato possibile ricevere un certificato");

                                        }

 

                                  Object CACertificate = Req.GetCACertificate(0, cconfig.GetConfig(0), CR_OUT_BASE64HEADER);

                                  Object GetCertificate = Req.GetCertificate(CR_OUT_BASE64HEADER);

 

                                  ImageButton1.Visible = false;

                                  TextBox1.Enabled = false;

                                  Label1.Text = "
I certificati richiesti sono stati correttamente generati.";             

                           }

                           else

                           {

                                  Response.Write(Dis.ToString());

                           }

                    }

             }

 

 

 

Viene costruita la stringa di richiesta certificato, la quale sarà successivamente inviata alla certification authority. Cosa notevole, che mi ha sorpreso, è stato lo scoprire la modalità di connessione tra applicazione e Certification Authority. Se vi state chiedendo dove dico al componente a quale Certification Authority puntare.. beh la risposta è in cconfig.GetConfig(0).

 

GetConfig cerca all’interno del dominio una certification authority abilitata ad emettere certificate lato client e l’espone al metodo Submit.

 

Da questo momento in poi interviene CertClientLib il quale non fa altro che ricevere i dati dalla Certification Authority attraverso il metodo GetCertificate (Certificato Client) e GetCACertificate (Certificato della CA per rendere valido il Client Cert).

 

Valorizzati due Object si può procedere al response.write dell’oggetto per ricevere i certificati nella macchina.

Se v’interessa il ContentType da utilizzare è il seguente

 

Response.ContentType = "application/x-x509-ca-cert";

 

A questo punto potete impostare sotto IIS la richiesta di certificati Lato client come mostrato nella figura qui sotto.