Des de que treballo amb certificats sempre m'ha sorprès la complexitat que li donen a una cosa que hauria de simple. Sempre des de línia de comandes, fent servir paràmetres exòtics... per mi que ho fan expressament per mantenir-los allunyats dels usuaris i que els informàtics tinguin feina.
Els passos a seguir són:
Descarregar el KeyStore Explorer, que es una eina FreeWare que permet gestionar certificats amb una... interficies grafica! Tremendu!
Crear un nou repositori de certificats, a mi m'agrada el P12, però hi ha d'altres tipus. El P12 es pot obrir des de C#.
Li donem al botó del guardar i ens preguntarà de crear una password pel fitxer. Li posem una que ens agradi, 1234 o així que és d'alta seguretat.
Generem un parell de clau pública-clau privada RSA. Li donem al OK, però encara no haurem acabat. Aquest és el primer pas.
Ara cal afegir les propietats, amb aquest botó encerclat. També augmentar la data de caducitat, al gust, jo li poso un munt d'anys per no ternir que amoinar-me:
La propietat IMPORTANT es la CN o "Common Name". A de coincidir amb el domini del servidor d'Internet, que si es localhost, serà "localhost" però si és un altra cal posar-lo. És el que els guiris diuen fully qualified name (FQDN) del servidor. La resta són etiquetes que es poden posar coses... es recomana posar dades acurades, per allò de les "best practices".
Li donem al "OK" un cop omplertes les dades però encara no hem acabat. Encara estem a la pantalla de "Generate Key Pair". Ara cal donar-li al botó "Add Extensions".
A la pantalla de les extensions, cal afegir amb el botó "+".
Ara cal afegir les extensions i les seves opcions, tot molt fàcil... Comencem per "Key usage", on cal marcar "Digital Signature" i "Key Encipherment".
Encara no hem acabat amb les extensions... Falta la "Extended Key Usage" on cal marcar la "TLS Web Server Authentication"
Amb això hi ha prou, encara que si es vol ser "purista" també es pot afegir el SANs (Subject Alternative Names). On es posa altra cop el FQDN del servidor (igual que al CN).
Amb això ja podem anar donant al botó, posant un nom a la clau, i si volem una pwd extra a la clau.
Ara cal generar un CSR (Certificate Signin Request) perque en teoria la signi una CA (Certificate Authority) i la posi sota el seu paraigües, però ja veure'm com es fa això... De moment generem el CSR fent botó dret sobre les claus acabades de crear i escollim l'opció "Generate CSR". Amb això tindrem creat un fitxer amb extensió CSR que es pot enviar per mail al responsable de la CA.
I ara ens imaginem que som la CA i rebem aquest CSR. Signem nosaltres mateixos el certificat. És l'opció "Sign".
Amb el fitxer firmat ara fem una importació de resposta de CA cap dins del P12.
Ara cal fer dos passos, posar el certificat al Firefox per tal que el reconegui (clar, Firefox no es fia de la CA "fake" que hem fet. Però es pot convencer.
I l'últim pas es fer servir el P12 que tenim des de C#, com si fos un servidor web.
if (UseSSL)
{
SSLStream = new SslStream(socket.GetStream(), false);
// Authenticate the server but don't require the client to authenticate.try
{
SSLStream.AuthenticateAsServer(serverCertificate, false, SslProtocols.Tls12, false);
inputStream = new BufferedStream(SSLStream);
// Display the properties and settings for the authenticated stream.
DisplaySecurityLevel(SSLStream);
DisplaySecurityServices(SSLStream);
DisplayCertificateInformation(SSLStream);
DisplayStreamProperties(SSLStream);
}
catch (AuthenticationException e)
{
server.IFace.SetResultsValue(string.Format("AuthenticationException: {0}", e.Message));
if (e.InnerException != null)
{
server.IFace.SetResultsValue(string.Format("Inner exception: {0}", e.InnerException.Message));
}
server.IFace.SetResultsValue("Authentication failed - closing the connection.");
}
catch (Exception e)
{
server.IFace.SetResultsValue(string.Format("Exception: {0}", e.Message));
if (e.InnerException != null)
{
server.IFace.SetResultsValue(string.Format("Inner exception: {0}", e.InnerException.Message));
}
}
}
else
{
inputStream = new BufferedStream(socket.GetStream());
}
Amb aquest codi, i el Firefox configurat amb el nostre certificat es poden fer "webservers" en C# amb connexions SSL la mar de cuques. Si volem tenir més d'un webserver d'aquests, llavors caldria muntar nosaltres mateixos la nostra propia CA, però això serà en un altra post.