domingo, 6 de marzo de 2016

El problema de "No somos una empresa de software"


Todas las empresas usan software y en muchos casos necesitan software a medida que supla sus necesidades, posibiliten crecer a su negocio y las preparan para los cambios, que seguramente, requieran para mantenerse vigentes en el mercado.


Uno de los principales problemas es que generalmente no le dan la suficiente importancia al software como impulsor de su negocio, no invierten adecuadamente en su desarrollo y ni en su correcta integración  y uso, uno de los principales motivos es que "No son una empresa de software".

El tema es que ninguna empresa es una "empresa de software" como tal, en el sentido de que el software no es un producto final en sí mismo, sino que es un producto, que sirve para "algo",  para conseguir una seria de objetivos o suplir una serie de necesidades.

Si una empresa minimiza la necesidad del software que requiere, ya sea adquirido o desarrollado internamente,  su empresa tendrá problema, puesto que el software es una herramienta para "hacer" su trabajo y cumplir sus objetivos,  y esa es su única finalidad. Si no tiene el software adecuado, seguramente  será superada por otra empresa que si tenga el software necesario.

Muchas empresa tiene un pequeño departamento de desarrollo de software, generalmente integrado por un equipo sin una estructura clara, que resuelve problemas de una forma reactiva, y sin una planificación clara hacia el futuro, y mucho menos hacia el futuro del software y su sostenibilidad, no se invierte en elementos de programación, metodologías, y tecnologías actuales, porque consideran simplemente "que no es para ellos" y "no les hace falta", Al final ocurre un curioso efecto: En lugar de reflejar el software el negocio, el negocio acaba haciendo lo que el software "puede" hacer, limitándose cada vez más la operativa de la empresa. De allí viene la famosa frase "El sistema no me deja hacerlo", que muchas personas oyen perplejos ante peticiones aparentemente sencillas, acerca de sus necesidades, frente a vendedores, o personas de atención directa a clientes (y no hablamos de atención telefónica, donde el problema se agrava más).

Finalmente  dichas empresas deben comenzar un arduo camino, recorriendo los mismos pasos, uno a uno, que recorrió la ingeniera de software,  para poder llegar a resolver las autenticas necesidades que tiene. El problema es que la carga anterior que ya poseen hace ese cambio lento y pesado, y a veces condenado al fracaso.

Por eso es fundamental que las empresas nacientes, consideren el software como un elemento fundamental de su negocio, y aprovechen las tendencias y metodologías actuales de la ingeniera de software, cuya único propósito es construir software de manera más rápida, a menor costo y con mayor calidad, por que dichas tendencias y metodologías ya han recorrido el "arduo camino" mencionado previamente y no es necesario que nosotros lo volvamos a recorrer.

lunes, 8 de febrero de 2016

Diferentes estilos de liderazgo


Actualmente me encuentro leyendo “Liderazgo centrado en principios”, de Stephen R. Covey, el cual me está resultando un libro muy interesante que trata sobre cómo manejar correctamente diversos aspectos relativos al liderazgo. Es común como algunos puestos gerenciales o directivos, no tienen una verdadera formación en cuento a liderazgo, basándose su percepción de este en modelos que han tenido ha tenido la gente a lo largo de su vida, tal como figuras paternas, maestros o antiguos jefes. Sin embargo para conseguir un verdadero liderazgo es necesario un estudio y preparación sobre el tema ya que son características que se aprenden, se desarrollan y se mejoran con el tiempo.

En nuestro sector, es importante tener un buen liderazgo para poder gestionar un equipo que necesita guía y motivación para poder llevar adelante la finalización de un proyecto. Existe muchas variables, e iteraciones personales que se tienen que conducir apropiadamente para llegar a un caso de éxito.

Covey propone los siguientes motivos por los cuales un equipo de trabajo acepta y sigue a un líder:

  • Por coacción: Básicamente es por miedo. Se tiene miedo del poder líder, y de lo que puede hacer este si se le contradice o decepciona (se teme al castigo). Los resultados que se obtiene son siempre reactivos (no tendremos un equipo proactivo o con iniciativa propia), y la influencia del líder desaparece cuando este no está presente. Es común que la gente se organice en contra del líder, y de sus métodos, creando una situación de caos en la empresa.
  • Por utilidad: Se basa en lo beneficios mutuos que pueden obtener tanto líder y equipo uno del otros. No es una relación basada en el miedo, sino en lo útil que puede resultar la cooperación. Es la relación predominante en la mayoría de las empresas. El problema es que el compromiso esta basado en el interés, o en que el equipo sienta que se le retribuye de forma justa a su colaboración. Pero los intereses y necesidades cambian según cada quien y según el momento personal de cada uno. En este modelo es común que parte del equipo cambie de trabajo, cuando el actual no suple o no tiene la capacidad de suplir sus expectativas e intereses.
  • Porque creemos en ellos: El equipo cree que lo que hace el líder es lo correcto. Las metas de la empresa, el líder y el equipo son las mismas, y además el equipo cree que esas metas son buenas, no buenas en lo personal, ni para la empresa, sino buenas en un nivel más alto, en un nivel en el que todos pueden ganar, el equipo, el líder, la empresa, y los clientes de estas, e incluso, en una perspectiva superior, la sociedad en general. En este esquema el equipo sigue al líder, no por miedo, ni por compromiso, sino por respecto. Igualmente cuando se den momentos difíciles, como la necesidad de sacrificar tiempo personal, o un esfuerzo superior, el equipo luchara por acabar los proyectos en los que cree, en lugar de por ejemplo, buscar otro trabajo.


Esta información ha sido consultada en el libro “Liderazgo centrado en principios” de Stephen R. Covey, principalmente del capítulo 9 “El poder centrado en principios”.

domingo, 20 de diciembre de 2015

CapicuaGen: Proyecto de generador de codigo

Me encuentro estos días por comenzar mi proyecto de fin de master en "Investigación en ingeniera de software". Después de mucho debatir el tema decidí hacer un producto orientado a la generación automática de código, y a la construcción de software desde un enfoque generativo. ¿Que quiere decir esto? Bueno básicamente que construiremos un software, cuya misión es construir otro software, o mas exactamente el código de dicho software. El generador de código que voy a hacer se llamara CapicuaGen, nombre que elegí de forma aleatoria entre varias opciones, y espero, quizás, publicarlo como GPL (o otra licencia afín). En los siguientes meses iré publicando los avances que vaya haciendo en este tema y según sea posible el código fuente, quizás en GitHub.

Para comenzar, publico la propuesta del proyecto, sobre la que voy a comenzar a construir.

Situación actual


Durante la creación de sistemas empresariales, es común que se den las siguientes circunstancias:

  • Software muy parecido a desarrollos anteriores, pero lo suficientemente diferente para impedir que se reúse software y librerías de una forma clara y consistente.
  • Cortos tiempo de desarrollo.
  • Numero de recursos limitados (tanto económicos como humanos).
  • Equipos que atacan varios frentes que no tiene que ver con el sistema a desarrollar en cuestión (los recursos desarrollando o soportando varios sistemas a la vez).

El resultado de toda esta combinación de factores causa los siguientes problemas en el desarrollo de un sistema:

  • Lentitud en el desarrollo.
  • Retrasó en los tiempos de entrega.
  • Elevación de costos.
  • Multitud de horas extras realizadas por el equipo, lo que a su vez en la motivación de este.
  • Sacrificios en la calidad del sistema, lo que a su vez lleva a fallos en el sistema.

Como conclusión impactamos aspectos relativos al producto en si, como la calidad y el tiempo de entrega, y por otro lado impactamos en el equipo de personas que trabaja en el sistema.

Objetivos


Los objetivos a conseguir son los siguientes:

  • Agilizar la construcción de un sistema a partir del uso de generadores de código, que creen de manera adecuada las características comunes de cada sistema, ensamblándola apropiadamente.
  • Reducir la programación manual de un sistema a los elementos particulares que así lo requieran, esto es, aquellos elementos que son exclusivos del sistema y por lo tanto no están incluidos en otros sistemas.

Con el cumplimiento de estos dos objetivos se espera satisfacer las siguientes necesarias:

  • Aumento de la calidad del software al generarse en parte de forma automática. Los fallos detectados se podrían corregir en los elementos generadores y aplicar automáticamente al código de los sistemas.
  • Los codificadores no perderían tiempo realizando tareas repetitivas y se concentraría en las tareas que realmente da valor al sistema, y no en aquellas que se duplican sistema tras sistema.
  • Reducción de tiempo de desarrollo, en base a la generación de código automático, lo cual a su vez reduce el número de hora extras a desarrollar por un sistema.

Propuesta


Se realiza la siguiente propuesta de solución:

  • Es necesario detectar las características (features) comunes a un sistema, y las posibles variaciones de dichas características.
  • El análisis de dichas características detectadas y sus posibles variaciones, serán incorporados dentro de un generador de código, llamado Generador de características.
  • Los generadores de características serán los encargados de crear el código fuente que implementan las mencionadas características en base a una configuración sobre su variabilidad.
  • Los generadores de características deben ser independientes unos de otros, aunque pueden tener una serie de interfaces con las que exponer servicios a otras características, con el menor acoplamiento posible (debe ser lo más independientes posible).
  • La configuración de la variabilidad debe ser lo más versátil posible, si en una primera versión se uso XML, se intentara usar Ruby como lenguaje de configuración, parecido a la configuración de los archivos RakeFile o a un archivo podFile de CocoaPods.
  • Igualmente la generación de un sistema se llevara a cabo mediante la agrupación de varios generadores de características, que interactúan entre sí, para crear el código de dicho sistema.
  • La configuración, tanto del sistema, como de la variabilidad del sistema deben hacerse a través de una interfaz grafica que facilite dicha tarea.
  • Cuando se genera el código de un sistema, es necesario considerar que el sistema no puede generarse en un 100% de forma automática, por lo que habrá una parte del sistema que será creada automáticamente, y otra parte que lo creara el programador. Es importante que el generador reconozca la parte creada manualmente por el codificador y no sea reemplazado su código en ninguna circunstancia.
  • La creación de generadores de características en sí, es construida de forma manual, y se crean en parte a base de plantillas de código y analizadores de código, realizados en Ruby
  • Estos generadores de características una vez creados, podrán ser usados por varios programadores, con lo que se creara un repositorio centralizado en los que los programadores puedan subir sus generadores de características, o bajar los generadores de característica creados por otros programadores, algo parecido a las gemas de Ruby.
  • Hay que considerar que el generador de características, genera código, esa es su funcionalidad, es decir en ningún caso son librerías o framework a usar en nuestro código, sin embargo el código generador si puede usar librerías o framework externos.
  • Unos de los objetivos de generar el código, es aumentar la calidad del sistema, haciendo que el código generador implemente patrones de software, así como estándares y mejores prácticas de programación.
  • Hay que considerar que si tenemos un sistema generado con una versión de un generador de características y descargamos una nueva versión de las características podemos volver a generar el código y aprovechar las nuevas mejoras y cambios de esta versión.

martes, 1 de diciembre de 2015

Regla N°10 de la Ingeniería de Software: Si no es sencillo está mal hecho


El desarrollo de un software tiende a complicarse… a complicarse mucho. Se complica sacar el proyecto a tiempo, se complica las relaciones con el equipo de trabajo, con los proveedores o con los recursos. Debemos mantener esa complejidad bajo control, teniendo en la mente que todo lo que hagamos cumplir la regla "Si no es sencillo, está mal hecho".

La sencillez muchas veces se confunde. Sencillez no quiere decir fácil, es casi siempre lo contrario. Es difícil hacer las cosas sencillas. Casi siempre invertir en sencillez es un proceso costoso al principio y ventajoso al final del proyecto. El objetivo de esta regla es conseguir sistemas que estén guiados por la sencillez.

Para considerar un sistema sencillo debe cumplir las siguientes características:

  • Sencillo de entender.
  • Sencillo de explicar.
  • Sencillo de mantener.


Algunos consejos para conseguir sencillez son los siguientes:

  • Usa programación orienta a objetos: No veas un sistema como un flujo que va desde un punto ‘A’ a un punto ‘B’, sino como entidades que se relaciones entre ellas, e intercambian información.
  • Cada vez que uses una sentencia if, preguntante si no está organizando el código para evitar usar herencia (donde cada parte de if y el else debiera ser una clases hija con determinadas características).
  • Usa patrones de software: Son formas comprobadas de resolver determinados problemas, son extensamente conocidos, y son válidos tanto para incorporarlos en nuestros sistemas, como campo de estudio acerca de su sencillez.
  • Vuelvo a hacer: La primera vez que resolvemos un problema posiblemente no sea de la forma más sencilla posible, sin embargo ya tendremos una imagen clara del problema, si no estamos convenidos que la solución es lo suficientemente sencilla, es mejor rehacerla con la experiencia que ya tenemos. El problema de la complejidad es que crece como una bola de nieve, por eso es mejor rehacer partes de las que no estamos seguros de su sencillez.
  • Enfócate en hacer módulos que hagan muy pocas cosas pero que lo hagan muy bien.
  • Reúsa código: Casi todos los entornos y lenguajes de programación, como Java, Ruby o .NET, tienen repositorios de librerías, muchas excelentes, que resuelven muchas problemas comunes. Es bueno conocerlas y usarlas.
  • Pero no hagas tu código dependiente de librerías externas, encapsula apropiadamente las librerías para sea sencillo su reemplazo en caso que sea necesario.
  • Hablando de patrones, usa el patrón fascade (fachada), dicho patrón encapsula en funcionamiento de sistemas complicados, exponiéndolos con una interfaz mucha más sencilla. Este patrón es extremadamente útil cuando nos comunicamos con sistemas viejos, librerías en otros lenguajes o simplemente con elementos que no son sencillos, ni claros, pero no podemos modificarlos, ya sea porque no tenemos el código fuente, o porque se sale del ámbito de nuestro desarrollo. El patrón fascade lo expondrá para nosotros de una forma sencilla, y la complejidad del código a consumir no será contagiada a nuestro código.
  • Haz sistemas que no dependan de la implementación interna de otros sistemas (o módulos): Los sistemas se comunican por interfaces definidas, pero dichas interfaces debe ser independiente de sus respectivas implementaciones, es decir se debe poder cambiar la implementación sin afectar a las interfaces, ni a los sistemas con los que se consumen.


miércoles, 28 de octubre de 2015

Cuestión de confianza III: ¿Dónde están los malos?

Los “malos”, son personas individuales, o mafias que se dedican a buscar sujetos o entidades vulnerabilidades para poder obtener nuestros datos personales o financieros, con intención de lucrase con ellos. En algunos caso puede que no exista lucro, solo existe el afán de hacer daño, de perjudicar o de exponer información de nuestra vida que nos hacen sensibles a ataques futuros, como datos sobre nuestra salud, dinero o familia.

Ahora bien, ¿Dónde están los malos?

Hay una reglar sencilla para tener claro que elementos debemos proteger, por que allí están los intrusos. La regla es:

¡¡¡Los malos están en todas partes!!!

  • Están del lado del Usuario: Pueden usar técnicas de ingeniería social, tener acceso a los medios de autentificar del usuario, o atacar directamente la computadora de la víctima.
  • Están en las comunicaciones: O bien analizándolas o falseándolas para que pensemos que estamos operando directamente con nuestros servidores o sitios web, cuando no es así.
  • Están en el servidor: Empleados que tiene acceso a información privada o secreta, y que solo se confía en su "buena" fe para que no usen sus privilegios de forma maliciosa o bien software pernicioso que explota la información directamente de los servidores bancarios.
  • Están en lo servidores adicionales: Además de lo mencionado anteriormente, es posible que aplique solo la seguridad en los puntos de entrada de la red, y se deje toda una intranet desprotegida, confiando en que estamos protegidos de ataques del exterior. La seguridad se debe incluir en cada uno de los elementos de nuestra infraestructura.

miércoles, 21 de octubre de 2015

Cuestión de confianza II: Factores de autentificación.


La autentificación es una de las partes más delicadas de implementar en un sistema, básicamente consiste en asegúranos que la persona que se contacta a nuestro sistema es quien dice ser, pero no solo eso sino que los usuarios puedan garantizar que se están conectando a nuestro sistemas y no a ningún otro que se haga pasar por este.

Acerca de los factores de autentificación


Los factores de autentificación son maneras de clasificar los métodos posibles en los que basar la autentificación a nuestros sistemas.

  • Factor 0: Algo la empresa que ofrece el servicio conoce y el usuario debiera conocer. Se aplica, por ejemplo, haciendo preguntas por teléfono, en el que el operador telefónico conoce las preguntas (mediante un script), pero no las repuestas (o por lo menos no todas, porque su veracidad debe ser resulta por el  sistema informático). Es importante que el usuario sea el que inicie la comunicación telefónica siempre y en ningún caso contestar preguntas cuando es el usuario el que recibe la llamada del teléfono, puesto que no sabemos quién nos está llamando realmente, lo cual podría ser un fraude para conseguir nuestros datos personales. En lo general conviene evitar este tipo de autentificación, aunque generalmente no es posible porque necesitamos una atención personalidad.
  • Factor 1: Algo que el usuario conoce y que proporciona para acceder a su servicios, es esta categoría entran los password y los NIP, que deben estas compuestos con una fortaleza mínima, y que idealmente no conoce la institución, pero conoce los medios posibles de validarlo (por ejemplo con password encriptados no reversible, como SHA512).
  • Factor 2: Contraseñas dinámicas generadas por medios electrónicos, aquí entra el papel de los Token,  los cuales son dispositivos hardware (o aplicaciones moviles) que en base al tiempo, generan  un número (exclusivo para el usuario) que sirve para que autorice una operación en el sistema (y solo una), una vez que la ha autorizado, necesitara un nuevo número de token, para nuevas operaciones. Esto es "Algo que tiene el usuario", en este caso el dispositivo físico
  • Factor 3: Medios biométricos (“Algo que el usuario es”), Alguna característica física propia del cliente en si, como su huella dactilar, o patrones en la retina, etc.

Lo recomendable es usar un doble factor de autentificación. Combinamos un factor de seguridad, junto con otro, lo más común es combinar el factor 1 (contraseña), con el factor 2 (token).

De esta forma aunque alguien se adueñe de nuestras contraseñas, será incapaz de realizar ninguna operación en nuestro sistema por no poseer el número de token que le da acceso.

Todo esto en la práctica: Ejemplo con Gmail



Google ofrece un sistema de autentificación en dos pasos, que consiste de un sistema en el uso de la contraseña del usuario de una cuenta de Google, y adicionalmente un Token, que puede ser un token  basado en el tiempo o basado o un Token SMS.

Se activa desde la configuración de GMAIL



Se activa mediante un Token SMS que llega al celular registrado


Una vez autentificados nos pedirá que indiquemos la pantalla


Y mediante la lectura de un QR, queda instalada la clave simétrica en un celular



Desde este momento podremos usar la autentificación en dos pasos:



Ventajas de este token:

  • Es gratis
  • Se basa en estándares y algoritmos públicos

Desventajas:

  • Está pensado para los productos de Google, o aquellos que usan sus servicios.

jueves, 8 de octubre de 2015

Cuestión de confianza I: Criptografía


Es curioso como casi todos los elementos en los que se basa en internet se crearon de una manera más o menos insegura en la que cada elemento viajaba por la red si ningún tipo de protección, libres para que cualquiera pudiera leer su contenido. Esto fue así, hasta que entro en juego la criptografía.

Muchas veces la gente no es consciente de la información personal, privada y secreta que viaja a través de sus computadoras o celular, o si lo es no le da importancia requerida. El tema es que es realmente importancia limitar el acceso a nuestra información, porque nunca sabemos que consecuencia podría tener que un extraño acceda a nuestro teléfono, nuestras fotos o mensajes, lo que para nosotros es inofensivo para otras personas abren posibilidades de extorsión o estafas en contra nuestra.

La criptografía garantica que solo nosotros (u otras personas autorizas) puedan acceder a nuestra información, de forma que sepamos que lo que sale de nuestros dispositivos, está debidamente protegida, y es confidencial.

La criptografía es un conjunto de técnicas y métodos en que los que un mensaje origen (o en claro) con información confidencial, se convierte en otro sin aparente significado y que puede viajar por medios no seguros, con la tranquilidad de que el mensaje original no podrá ser descubierto, sin aplicar los correspondiente métodos criptográficos sobre el mensaje original.

La criptografía existe desde hace muchos siglos, siempre asociada al envió de mensaje secretos entre dos partes. Algunos sistema de criptografía antiguos, se basan en la ocultación del método criptográfico. En los sistemas criptográficos modernos, el método de inscripción es público (o podría serlo sin comprometer la seguridad) y al mismo tiempo poseen una clave de encripción que debe ser secreta, y que si la cual aunque tengamos el algoritmo y el mensaje cifrado, no conseguiremos tener el mensaje original.

Una excepción al tema de claves de encripción son los algoritmos de hash donde la información se encripta de forma no reversible, sin necesidad de una clave o llave de encripción, en una cadena de longitud fija tal que así:

Original: “ESTE ES MI PASSWORD”

Este es el hash creado: ed85e76ecad699fdb1bfa36876f35e665a3105750f0af9c4d6bbfc80a3b664a1

Debido a que es imposible partir del hash y llegar al original, Esta es la forma ideal para almacenar password, ya que incluso cuando la base de datos de los usuarios se viera comprometida (por ejemplo que se robara) no supondría un problema, porque no se podrían averiguar los password.

Al margen la autentificación anterior, se dan principalmente dos tipos de criptográfica.

Criptografía simétrica


Tanto el recepto del mensaje encriptado, como la persona que encripta, usan la misma clave de encripción para realizar sus operaciones. Algoritmos que lo usa son por ejemplo AES (Rijndael).

Las ventajas de este método son:
  • Es la practica tiene una velocidad aceptable
  • Es muy seguro

Las desventajas:
  • La principal desventaja es que un usuario genera la clave y tiene que pasársela a otro usuario, lo cual podría comprometer la conexión desde un inicio

El hecho que compartan la misma clave, es un problema, el único que tiene este tipo de criptográfica, porque ¿Cómo se hace que el usuario final y destino tengan la misma clave?, solo enviando la clave por un medio que sea seguro, para garantizar que nadie más la tiene, pero precisamente necesito intercambiar la llave porque no tengo un medio seguro para enviar información.

Criptografía asimétrica


Consta de dos claves, en lugar de una, llamadas clave privada y clave pública, la clave pública sirve para encriptar, y es de libre acceso, la clave privada para desencriptar y solo la tiene una persona (la que genero las claves). Además la privada sirve para firmar mensajes y garantizar que la persona que la usa es el dueño de la clave.

En la práctica funciona así: Una persona genera (a través de un algoritmo) una clave privada y pública (que se complementan entre sí), se queda para si la clave privada, y distribuye la clave pública (a quien desee), a partir de ese momento, quien desee mandarle un mensaje encriptado, puede hacerlo usando la clave pública, y solo el podrá desencintarlo usando la clave privada. Igualmente si él quiere mandar un comunicado y garantizar su autenticidad, podrá firmarlo con su llave privada, y todo aquel que tenga la llave publica, podrá validar su origen.

Algoritmos que implementan esta tecnología son por ejemplo RSA o DSA.

Las ventajas de estos algoritmos son:
  • Seguridad en cuanto al custodio de las claves (nunca se difunde la clave privada)
  • Seguro en cuanto los mecanismo de inscripción

Las desventajas:
  • Increíblemente lento

En esta criptografía se resuelve el problema de la llave compartida, puesto que al haber dos llaves, se puede distribuir libremente la llave pública (a cualquier persona) para encriptar, y la permanecer debidamente custodiada la llave privada para desencriptar. Así por ejemplo dos personas (o entes), pueden iniciar una comunicación segura, simplemente intercambiando sus llaves públicas y usando sus llaves privadas para desencriptar.

Debido a que la criptografía asimétrica es realmente lenta, en lugar de encriptar un mensaje completo, se genera una llave simétrica aleatoria, con la que se encripta el mensaje y se envía el mensaje encriptado y adjunto con la llave simétrica encriptada (ahora sí) con la llave asimétrica publica, lo cual garantiza la velocidad y la confidencialidad.

Certificados digital


Cuando recibimos un mensaje firmado con una llave privada, podemos validar su autenticidad con nuestra llave pública. Esto quiere decir que podemos garantizar que la persona que tiene la llave privada es la se está comunicado, con nosotros, puesto que debe coincidir con la llave publica que nos proporcionó.

Hay que agregar que la firma es diferente por cada mensajes, por lo que garantiza no solo que el mensaje fue enviado por quien tiene la llave privada, sino además que el mensaje no ha sido modificado en el cambio.

Un detalle importante es que solo garantiza eso, es decir que el mensaje fue firmado con la llave privada, pero no garantiza que esa firma electrónica pertenezca a una persona en particular. La firma podría ser de cualquier persona, y haberse generado en cualquier momento.

Para garantizar además que la firma privada pertenece a una determinada persona o entidad, se usan los certificados, que bien pueden identificar a una persona o a un ente como una empresa o un banco.

Pero, ¿En que consiste exactamente un certificado? Imaginemos que yo quiero comunicarme (a través de una computadora) con otra persona o entidad, por ejemplo una tienda. Con el uso de llaves públicas (y privada) garantizo que la comunicación es confidencial entre ambos, pero de ninguna forma garantizo que esa llave pertenezca a la tienda, pero igualmente imaginemos que existe un tercer elemento, un ente en el que confiamos los dos (la tienda y el usuario), que garantice que esa llave privada pertenece a la tienda, ¿Cómo lo puede hacer? Dando por supuesto que yo confió en el tercero, que se llama entidad certificadora, esta firma (con su propia llave privada), la llave publica y demás información de la tienda, posterior a que valide la identidad de la tienda (mediante documentos, escrituras, registros de empresa, visitas en persona). En este punto ya tenemos un certificado, que contiene la llave pública, y que está firmado por alguien en el que confiamos que ha validado correctamente la identidad de la tienda, de esta forma queda ligada la identidad con la llave pública.

¿Quién son esas entidades certificadoras y por qué confiamos en ella? Son grandes empresas cuyo servicio es precisamente ese garantizar la identidad de entes y personas, y son aceptadas a nivel mundial como VERISIGN, o incluso gobiernos o entidades gubernamentales que realizan dicha función.

¿Cuál es proceso para generar un certificado?

  1. Se genera un par de llaves (pública y privada)
  2. Se realiza una petición de generación de certificado en base a la clave pública, y a los datos de la empresa (y los host que queremos certificar).
  3. Se envía la petición a una entidad certificara, que realizara los pasos necesarios para garantizar que somos la empresa para la cual estamos pidiendo los certificados, y una vez garantizado nos expedida dicho certificado.
  4. En nuestro servidor podemos unir la llave privada con el certificado, y en base a eso configurar nuestros servidores para que lo usen apropiadamente

Nuestro clientes al conectarse a nuestros servidores descargaran el certificado (con la llave publica), y al estar firmado por la entidad certificadora (en la confiamos), asumiremos que el servidor al que nos estamos conectando es el correcto. Igualmente si no está firmado o lo está por alguien en que no confiamos seremos advertidos de esta situación, y estará en nuestra decisión continuar la comunicación con dicho servidor.

¿Qué ocurre cuando queremos generar un certificador de pruebas?


Es posible que los certificados se firmen a sí mismos, como si fueran una entidad certificadora, estos se llaman certificados autofirmados.

Por otro lado es posible que firmemos un certificado a través de otro certificado, por ejemplo puedo firmar todos los certificados internos de una empresa, con un mismo certificado, y configurar en los ordenadores de la empresa, el certificado firmante como entidad firmante de confianza. A partir de este momento todos los certificados firmados con aquel, serán de confianza.