Certificados digitales autofirmados

Iniciado por alzehimer_cerebral, 9 Enero 2011, 18:01 PM

0 Miembros y 2 Visitantes están viendo este tema.

novanoticia

#10
Hola a todos,
hay otro metodo aunque tendría que repasar el tema para hacer una key de aplicación bastante segura.

consiste en lo siguiente,

creas una llave publica y en vez de ser esa la que das , la conservas seguramente, y utilizas la llave privada junto con datos del registro o del ordenador donde se ha instalado para tener que se utilize la llave privada como key de aplicación,

Es decir consistiría en lo que se llama criptografía asimetrica (donde es la clave publica la que se comparte) , pero en el caso que yo he esplicado sería criptografía asimetrica inversa, no he encontrado ninguna pagina que hable sobre ello,
vamos, en resumen el problema de utilizar una criptografía asimetrica tradicional estaría sobre todo en que si envias la llave publica esta solo sirve para descifrar sin embargo si implementas la clave privada dentro de tu aplicación podrías utilizarla para cifrar los datos del registro (nombre, usuario, email, y algunos datos que identifican unicamente al ordenador donde lo ha instalado) y enviarla al creador de la aplicación para que compruebe que coinciden el el registro inicial y que el equipo sea unico.

La llave pública es el candado y su pareja es la llave de metal (llave privada) que lo abre. Por supuesto, esta pareja debe ser fabricada una para la otra.

digamos que el candado lo guardo y solo distribuyo copias de la llave de metal,
http://www.alcancelibre.org/article.php/20070620210641855

la llave privada puede descifrar (como la llave publica) y cifrar ¿que cifrafía? pues los datos que he dicho antes, sin que sea visible para el usuario coge unos parametros del sistema además de su email, por ejemplo, su nombre dirección, ...etc y lo cifra y me lo envia a mi, el que he hecho la aplicación, y yo lo puedo descifrar con mi llave publica y confirmar que los datos que me ha mandado corresponden a los datos que tengo yo cuando se registró, si no coinciden o hay dos equipos utilizando estos datos pues entonces habría que darle avertencia de que está utilizando el software ilegalmente...etc.

lo importante es que el cliente pueda cifrar esos datos con la copia de la llave privada , cosa que no podría hacer si lo que distribuyo es la clave publica.

la forma de identificar al equipo como unico puede ser del siguiente modo:

Con la creación de un identificador unico global GUID de un ordenador http://www.subgurim.net/Articu los/csharp/97/guid-identificad or-global-unico.aspx
también con SID: http://technet.microsoft.com/e s-es/library/cc780850(WS.10).a spx

si no estoy equivocado, por ejemplo, los archivos de windows disponen de un identificador unico para todos los archivos de un equipo
acabo de encontrar sobre ese tema este enlace http://forums.techarena.in/windows-server-help/10000.htm
de tal forma que cuando se instala la aplicacion si se obtiene ese SID se puede identificar de forma unica al equipo, esto para windows, en linux no se si será exactamente igual,
si se regenera el SID de los archivos sería como si instalas de nuevo el sistema operativo
con lo cual este ultimo metodo llevaría a tener que volver a registrar la aplicación con los mismos datos pero con distinto SID para los archivos, con lo cual el Creador de la aplicación tendría que llevar un registro de datos_registro + SID_de_sistema (que solo podría ser una combinación unica).




espero que me deis vuestra opinion sobre esta idea,

gracias



perdonar que no me esplique extensamente es que hace tiempo tuve esa idea pero no he repasado el tema como

tengo algo que escribí hace tiempo:

generar clave publica y clave privada en windows ej.

en el programa :

clave publica para desemcriptar los datos enviados con clave privada,

datos enviados con clave privada:

¿como crear un certificado con la llave privada ¿o publica? en dicho ordenador?

enviar el certificado cifrado con la llave privada proporcionada como licencia.

y un codigo en c#:


validar através de internet el certificado (comunicación servidor de software y software instalado)

http://www.accv.es/

http://www.programandoamedianoche.com/2009/08/utilizar-certificados-digitales-desde-net/

http://en.juantxu.net/doku.php/ssl PARA HACER EL CERTIFICADO A PARTIR DE CLAVES

http://thinkingindotnet.wordpress.com/2007/04/06/trucos-habilitar-ssl-en-iis-70-usando-certificados-firmados-por-nosotros/


PARA CREAR LA CLAVE PUBLICA Y LA CLAVE PRIVADA EN C#
COLOCAR EN EL PROGRAM.CS

using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace CrearClavesPublicasPrivadas
{
   public class Form1 : System.Windows.Forms.Form
   {
       private System.Windows.Forms.Button button1;
       private System.Windows.Forms.TextBox textBox1;
       private System.Windows.Forms.Label label1;
       private System.ComponentModel.Container components = null;
       public Form1()
       {
           InitializeComponent();
       }
       protected override void Dispose(bool disposing)
       {
           if (disposing)
           {
               if (components != null)
               {
                   components.Dispose();
               }
           }
           base.Dispose(disposing);
       }
       #region Código generado por el Diseñador de Windows Forms
       ///
       /// Método necesario para admitir el Diseñador. No se puede modificar
       /// el contenido del método con el editor de código.
       ///
       private void InitializeComponent()
       {
           this.button1 = new System.Windows.Forms.Button();
           this.textBox1 = new System.Windows.Forms.TextBox();
           this.label1 = new System.Windows.Forms.Label();
           this.SuspendLayout();
           //
           // button1
           //
           this.button1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
           this.button1.Location = new System.Drawing.Point(8, 8);
           this.button1.Name = "button1";
           this.button1.Size = new System.Drawing.Size(104, 48);
           this.button1.TabIndex = 0;
           this.button1.Text = "Generar claves";
           this.button1.Click += new System.EventHandler(this.button1_Click);
           //
           // textBox1
           //
           this.textBox1.Font = new System.Drawing.Font("Courier New", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
           this.textBox1.Location = new System.Drawing.Point(120, 40);
           this.textBox1.Name = "textBox1";
           this.textBox1.Size = new System.Drawing.Size(144, 26);
           this.textBox1.TabIndex = 1;
           this.textBox1.Text = "";
           //
           // label1
           //
           this.label1.Location = new System.Drawing.Point(120, 8);
           this.label1.Name = "label1";
           this.label1.Size = new System.Drawing.Size(152, 24);
           this.label1.TabIndex = 2;
           this.label1.Text = "Nombre clave";
           //
           // Form1
           //
           this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
           this.ClientSize = new System.Drawing.Size(280, 94);
           this.Controls.Add(this.label1);
           this.Controls.Add(this.textBox1);
           this.Controls.Add(this.button1);
           this.Name = "Form1";
           this.Text = "Form1";
           this.ResumeLayout(false);
       }
       #endregion
       [STAThread]
       static void Main()
       {
           Application.Run(new Form1());
       }
       private void button1_Click(object sender, System.EventArgs e)
       {
           if (textBox1.Text != "")
           {
               RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(4096);
               string PCB = RSA.ToXmlString(true);
               string CPubB = RSA.ToXmlString(false);
               string nombre = textBox1.Text;
               nombre += "PCB.xml";
               StreamWriter PCAwriter = new StreamWriter(nombre);
               PCAwriter.Write(PCB);
               PCAwriter.Close();
               string nombre2 = textBox1.Text;
               nombre2 += "CPubB.xml";
               StreamWriter CPubAwriter = new StreamWriter(nombre2);
               CPubAwriter.Write(CPubB);
               CPubAwriter.Close();
               MessageBox.Show("LAS CLAVES FUERON CREADAS CON EXITO", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
           }
           else
           {
               MessageBox.Show("DEBE LLENAR EL CAMPO NOMBRE CLAVE.", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
           }
       }
   }
}

espero que os resulte interesante

novanoticia

#11
Cita de: APOKLIPTICO en 15 Enero 2011, 03:57 AM
Mira, si vos podes enviar por otro canal seguro el certificado, no tiene por que ser fisico, pero tiene que haber un secreto compartido o una VPN segura, entonces podes asegurar las 4 caracteristicas del protocolo SSL (O mejor dicho TLS).

yo por ejemplo lo de la firma autofirmada lo he utilizado en mis correos, ¿por que?, porque si soy yo el unico que sabe las claves de mi servidor de correo puedo garantizar que soy yo el que puede firmar ese correo ya que soy el autentico propietario,

me acuerdo que hace ya tiempo era muy facil enviar un correo haciendose pasar por otro simplemente con poner la dirección del otro, con la firma autofirmada o averiguas la password de mi correo o no puedes suplantarme la identidad , sobre todo por ejemplo para hacer spam con mi dirección, bueno es decir podrás hacer spam pero si mi correo lo envio con la firma autofirmada (como minimo) estoy garantizandole al otro que lo he enviado con mi servidor de correo.

os voy a poner otro ejemplo:
este pasa un certificado de un almacen a otro y se lo añade al servidor IIS

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.IO;
using Microsoft.Web.Administration;

namespace WindowsApplication1
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void Form1_Load(object sender, EventArgs e)
       {
           X509Store store0 = new X509Store(StoreName.My, StoreLocation.LocalMachine);
           X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);

           //ojo al dato, lo paso de mi store personal al root, para meterlo en mi store personal solo hay que hacer click en el certificado,
           //aunque esto se puede implementar con codigo, hay muchas posibilidades.
          //el el siguiente post voy a poner como se hace para:
          //COMO CREAR UNA FIRMA DIGITAL AUTOFIRMADA Y SER NOSOTROS LA ENTIDAD CERTIFICADORA DEL MISMO Y PODER UTILIZARLO EN LOS CORREOS


           store0.Open(OpenFlags.ReadWrite);
           store.Open(OpenFlags.ReadWrite);
           X509Certificate2Collection collection = store0.Certificates.Find(X509FindType.FindByIssuerName, "localhost", false);
           store.AddRange(collection);
           store.Close();
           using (ServerManager serverManager = new ServerManager())
           {
               Configuration config = serverManager.GetApplicationHostConfiguration();
               ConfigurationSection accessSection = config.GetSection("system.webServer/security/access","Default Web Site");
               accessSection["sslFlags"] = @"Ssl";
               serverManager.CommitChanges();
           }
           using (ServerManager serverManager = new ServerManager())
           {
               Configuration config = serverManager.GetApplicationHostConfiguration();
               ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
               ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
               ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Default Web Site");

               if (siteElement == null) throw new InvalidOperationException("Element not found!");

               ConfigurationElementCollection bindingsCollection = siteElement.GetCollection("bindings");
               ConfigurationElement bindingElement1 = bindingsCollection.CreateElement("binding");
               bindingElement1["protocol"] = @"https";
               bindingElement1["bindingInformation"] = @"*:443:";
                //En la linea siguiente es mi pequeña aportación casi todo lo demás lo podeis encontrar en internet
               ConfigurationMethod method = bindingElement1.Methods["AddSslCertificate"];
               ConfigurationMethodInstance mi = method.CreateInstance();
               //falta ver si la huella digital es la misma en todos los ordenadores
               string prueba="";
               int i=0;
               prueba = collection[0].GetCertHashString().ToString();
               mi.Input.SetAttributeValue("certificateHash",prueba);
               mi.Input.SetAttributeValue("certificateStoreName", store.Name );
               mi.Execute();
               bindingsCollection.Add(bindingElement1);
               serverManager.CommitChanges();
               
           }
       }
       private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
       {
           foreach (ConfigurationElement element in collection)
           {
               if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
               {
                   bool matches = true;
                   for (int i = 0; i < keyValues.Length; i += 2)
                   {
                       object o = element.GetAttributeValue(keyValues);
                       string value = null;
                       if (o != null)
                       {
                           value = o.ToString();
                       }
                       if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
                       {
                           matches = false;
                           break;
                       }
                   }
                   if (matches)
                   {
                       return element;
                   }
               }
           }
           return null;
       }
   }


}

novanoticia

#12
Hola , soy yo de nuevo,
sobre el uso de las firmas digitales autofirmadas

"Descripción del certificado autofirmado en Exchange 2007":
http://technet.microsoft.com/es-es/library/bb851554(EXCHG.80).aspx

Pues resulta que pregunte sobre la utilidad de las firmas autofirmadas en la Infojobs Comunidades Expertos y
resulta que parecía que estaba preguntando una tontería,
de hecho me pasó con muchas preguntas que puse,
y le dije al moderador que me diera de baja,

y resulta que microsoft lo está utilizando desde el 2007 en sus servidores Exchange, toma castaña.

Por poner otro ejemplo,

En mi servidor web (hosting AXARNET) ya existe la posibilidad de crear para tu hosting una firma digital autofirmada,
Lo han puesto muy recientemente,

y no es el unico que lo hace solo tienes que buscarlo en internet

novanoticia

#13
COMO CREAR UNA FIRMA DIGITAL AUTOFIRMADA Y SER NOSOTROS LA ENTIDAD CERTIFICADORA DEL MISMO Y PODER UTILIZARLO EN LOS CORREOS
este ejemplo es para entorno windows.

primero con un programa o programandolo nosotros mismos se crea la firma digital
una cosa a tener en cuenta son marcar los propositos para los que sirve la firma (yo por defecto he marcado todos),
y ponerle una caducidad,
y se guarda con formato .p12 with chain,

se ejecuta dicha firma y se instala (almacen por defecto),

se le da a ejecutar "mmc.exe" y se añade de contenido (en archivo) "certificados" y aparecen las carpetas de los certificados,

nos vamos a la carpeta de certificados raiz de confianza e importamos dicha firma .p12,
si al crear la firma rellenamos hemos rellenado el campo email con uno de los emails de los que tenemos en el apartado de cuentas de correo, podremos seleccionar la firma cuando, en las propiedades de dicho email, le marcamos que use el certificado, si no lo hemos rellenado o no coincide no lo mostrará.

le damos a las opciones de seguridad para que firme los mensajes y cifre,

cuando mandamos el mensaje lo firma con la firma digital y lo cifra,

cuando la otra persona recibe nuestro email, es cuando ella puede respondernos y cifrar el mensaje con nuestra firma.

si nos envia su firma digital nosotros podremos hacer lo mismo.

he editado los post varias veces para corregir expresiones, hacer indicaciones o para que sea más comprensible.

APOKLIPTICO

AMD Phenom II 1075T X6 @ 290 Mhz x 11 (HT 2036 Mhz NB Link 2616 Mhz) 1.23 Vcore
ASUS M4A89GTD-PRO/USB3
2x2gb G-Skill RipjawsX DDR3 1600 Mhz CL7 (7-8-7-24-25-1T)
Seagate 500 Gb
XFX HD4850 512Mb GDDR3. 650 Mhz/995 Mhz 1.1 Tflops.