{"id":245,"date":"2004-10-31T21:29:55","date_gmt":"2004-10-31T19:29:55","guid":{"rendered":"http:\/\/www.marblestation.com\/blog\/?p=245"},"modified":"2012-04-26T18:43:42","modified_gmt":"2012-04-26T16:43:42","slug":"openssl","status":"publish","type":"post","link":"https:\/\/www.marblestation.com\/?p=245","title":{"rendered":"Entidad certificadora personal con OpenSSL"},"content":{"rendered":"<p>Gracias a <a href=\"http:\/\/www.openssl.org\/\">OpenSSL<\/a> podemos tener comunicaci\u00f3n encriptadas entre diferentes m\u00e1quinas utilizando criptolog\u00eda asimetrica, es decir, claves p\u00fablicas y privadas. Adem\u00e1s, es posible montar entidades certificadoras que se encarguen de asegurar que una llave pertenece a quien dice pertenecer, de esta forma conseguimos encriptaci\u00f3n y autentificaci\u00f3n.<\/p>\n<p>Las entidades certificadoras actuales cobr\u00e1n por el servicio de firma de llaves y no suele ser precisamente asequible. Por otro lado, montar una entidad certificadora oficial tambi\u00e9n resulta muy costoso ya que se demandan unas ciertas garantias que destr\u00e1s del negocio hay una cierta seguridad. Por tanto, es habitual que los administradores de peque\u00f1as redes se creen su propios certificados para firmar sus claves. De esta forma podremos disponer de comunicaciones encriptadas sin necesidad de entidades certificadoras.<\/p>\n<p>Estas entidades oficiales pagan para que aparezcan por defecto sus certificados en navegadores como Mozilla Firefox o Internet Explorer. De esta forma el propio navegador puede comprobar autom\u00e1ticamente que cuando se conecta a un sitio seguro, el certificado que recibe ha sido realmente firmado por una entidad oficial. Eso implica que nuestros certificados no ser\u00e1n reconocidos autom\u00e1ticamente por los navegadores a no ser que los a\u00f1adamos manualmente, el \u00fanico inconveniente que aporta esto es que el navegador mostrar\u00e1 un aviso extra al usuario (dependiendo de la configuraci\u00f3n) advirtiendo que no reconoce la entidad certificadora.<\/p>\n<p>Vamos a ver como configurar OpenSSL para montar nuestro servicio de certificaci\u00f3n personal. Lo primero es tener OpenSSL instalado en el sistema (aptitude install openssl), la configuraci\u00f3n la encontraremos en &#8220;\/etc\/ssl&#8221; y ser\u00e1 all\u00ed donde editemos el fichero &#8220;openssl.cnf&#8221;.  Os pongo un extracto del archivo con lo m\u00e1s importante:<br \/>\n<!--more--><\/p>\n<pre>\r\n...\r\n\r\n[ ca ]\r\ndefault_ca  = CA_default\r\n\r\n[ CA_default ]\r\ndir     = \/etc\/ssl\/marblestationCA  # Where everything is kept\r\ncerts       = $dir\/certs  # Where the issued certs are kept\r\ncrl_dir     = $dir\/crl  # Where the issued crl are kept\r\ndatabase    = $dir\/index.txt  # database index file.\r\nnew_certs_dir   = $dir\/newcerts     # default place for new certs\r\n\r\ncertificate = $dir\/MSca.crt     # The CA certificate\r\nserial      = $dir\/serial       # The current serial number\r\ncrl     = $dir\/crl.pem      # The current CR\r\n\r\nprivate_key = $dir\/private\/MSca.key # The private key\r\n\r\ndefault_days    = 3650\r\n\r\n...\r\n<\/pre>\n<p>En esta secci\u00f3n del fichero se define donde se va a almacenar toda la informaci\u00f3n, en mi caso lo guardar\u00e9 todo en &#8220;\/etc\/ssl\/marblestationCA&#8221;. Dentro de ese directorio creare toda una serie de subdirectorios que guardaran la informaci\u00f3n necesaria e imprescindible como por ejemplo el certificado o clave de la entidad (tanto privada como p\u00fablica). Tambi\u00e9n he puesto que por defecto se generen claves con un periodo de caducidad de 10 a\u00f1os ya que quiero olvidarme de renovar por una buena temporada.<\/p>\n<p>Tendremos que crear la estructura de directorios y ficheros:<\/p>\n<pre>\r\nmkdir \/etc\/ssl\/marblestationCA\/\r\nmkdir \/etc\/ssl\/marblestationCA\/certs\r\nmkdir \/etc\/ssl\/marblestationCA\/private\r\nmkdir \/etc\/ssl\/marblestationCA\/newcerts\r\nmkdir \/etc\/ssl\/marblestationCA\/crl\r\necho \"01\" > \/etc\/ssl\/marblestationCA\/serial\r\ntouch \/etc\/ssl\/marblestationCA\/index.txt\r\n<\/pre>\n<p>A continuaci\u00f3n crearemos la clave p\u00fablica\/privada de nuestra entidad certificadora:<\/p>\n<pre>\r\ncd \/etc\/ssl\/marblestationCA\/\r\nopenssl req -nodes -new -x509 -keyout private\/MSca.key -out MSca.crt -days 3650\r\n<\/pre>\n<p>Es importante especificar el mismo nombre para la clave privada (MSca.key) y p\u00fablica (MSca.crt) que pusimos en nuestra configuraci\u00f3n de OpenSSL. En cuanto a las preguntas que nos haga para generar la clave:<\/p>\n<pre>\r\nCountry Name (2 letter code) [ES]:\r\nState or Province Name (full name) [Catalunya]:\r\nLocality Name (eg, city) []:Tarragona\r\nOrganization Name (eg, company) [Marble Station]:\r\nOrganizational Unit Name (eg, section) []:Ejemplo\r\nCommon Name (eg, YOUR name) []:midominio.com\r\nEmail Address []:admin@midominio.com\r\n<\/pre>\n<p>Cabe destacar que en &#8220;Common Name&#8221; debemos poner el nombre de dominio correspondiente a la m\u00e1quina donde estar\u00e1 la entidad certificadora.<\/p>\n<p>Ahora ya tenemos nuestro servicio de certificaciones montado, las claves que hemos generado nos serviran para firmar terceras claves que ser\u00e1n utilizadas por ejemplo por los diferentes ordenadores de nuestra red.<\/p>\n<p>Imaginemos que en el mismo servidor donde hemos montado nuestros certificados para firmar, tenemos un servidor web Apache seguro (SSL) y necesitamos un certificado firmado por nuestra entidad personal. Lo primero que tendremos que hacer ser\u00e1 crear una petici\u00f3n de certificado junto a una clave privada:<\/p>\n<pre>\r\nopenssl req -nodes -new -keyout midominio.key -out midominio.csr\r\n<\/pre>\n<p>Nos volver\u00e1 a realizar las respectivas preguntas, debemos responder acorde para la m\u00e1quina donde se va a utilizar la clave. En &#8220;midominio.key&#8221; tendremos la clave privada generada y en &#8220;midominio.csr&#8221; la petici\u00f3n de certificado. La entidad certificadora solo necesita acceso al segundo, vamos a generar ahora el certificado firmado por nuestra entidad personal:<\/p>\n<pre>\r\nopenssl ca -out midominio.crt -in midominio.csr\r\n<\/pre>\n<p>Esto generar\u00e1 el archivo &#8220;midominio.crt&#8221; con el certificado firmado listo para ser usado por el solicitante. Adem\u00e1s se guardar\u00e1 informaci\u00f3n referente al certificado firmado en &#8220;\/etc\/ssl\/marblestationCA\/&#8221; de forma que siempre tendremos un listado de todo lo que hemos firmado, tambi\u00e9n podremos revocar firmas (man openssl) en caso de que sea necesario.<\/p>\n<p>Como coment\u00e9, ibamos a utilizarlo para nuestro servidor Apache pero tambi\u00e9n podria ser compartido por otros servicios en la misma m\u00e1quina, como por ejemplo un servicio de POP3\/IMAP (recomiendo <a herf=\"http:\/\/dovecot.org\/\">dovecot<\/a>) y SMTP (recomiendo <a href=\"http:\/\/www.exim.org\/\">exim<\/a>). Es importante asegurarnos que estas aplicaciones tengan acceso de lectura al certificado y que el resto de usuarios del sistema no puedan leerlo (sobretodo la llave privada .key).<\/p>\n<p>Habitualmente suelo ubicar los certificados de servicios en \/etc\/ssl\/certs y \/etc\/ssl\/private de la m\u00e1quina que los vaya a usar:<\/p>\n<pre>\r\nmv midominio.crt \/etc\/ssl\/certs\r\nmv midominio.key \/etc\/ssl\/private\r\n<\/pre>\n<p>La petici\u00f3n de certificado midominio.csr no lo vamos a necesitar m\u00e1s puesto que ya hemos generado el certificado.<\/p>\n<p>Ahora podriamos seguir generando nuevos certificados para despu\u00e9s firmarlos y repartirlos entre las m\u00e1quinas de nuestra red que dispongan de servicios con conexi\u00f3n segura.<\/p>\n<p>En resumen, hemos llevado a cabo dos acciones:<\/p>\n<ol>\n<li>Generaci\u00f3n de los certificados de nuestra entidad certificadora no oficial (clave p\u00fablica &#8220;MSca.crt&#8221; y clave privada &#8220;MSca.key&#8221;), se guardar\u00e1 toda la informaci\u00f3n en &#8220;\/etc\/ssl\/marblestationCA\/&#8221;<\/li>\n<li> Generaci\u00f3n de certificados firmados para los servicios o m\u00e1quinas de nuestra red, se guardar\u00e1 autom\u00e1ticamente la informaci\u00f3n necesaria en &#8220;\/etc\/ssl\/marblestationCA\/&#8221; y la clave p\u00fablica\/certificado firmado se guardar\u00e1n en la m\u00e1quina que los vaya a usar (&#8220;\/etc\/ssl\/certs&#8221;, &#8220;\/etc\/ssl\/private&#8221; respectivamente):\n<ol>\n<li>Generaci\u00f3n de una clave privada (midominio.key) con peticion de certificado (midominio.csr).<\/li>\n<li>Firma de la petici\u00f3n con nuestro certificado de entidad.<\/li>\n<li>El solicitante recibir\u00e1 su certificado firmado (midominio.crt) que usar\u00e1 en conjunto con su clave privada para su servicio (podremos eliminar la petici\u00f3n midominio.csr).<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>Gracias a OpenSSL podemos tener comunicaci\u00f3n encriptadas entre diferentes m\u00e1quinas utilizando criptolog\u00eda asimetrica, es decir, claves p\u00fablicas y privadas. Adem\u00e1s, es posible montar entidades certificadoras que se encarguen de asegurar que una llave pertenece a quien dice pertenecer, de esta forma conseguimos encriptaci\u00f3n y autentificaci\u00f3n. Las entidades certificadoras actuales cobr\u00e1n por el servicio de firma &hellip; <a href=\"https:\/\/www.marblestation.com\/?p=245\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Entidad certificadora personal con OpenSSL<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,6],"tags":[],"class_list":["post-245","post","type-post","status-publish","format-standard","hentry","category-espanyol","category-tecnologia"],"_links":{"self":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=245"}],"version-history":[{"count":1,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/245\/revisions"}],"predecessor-version":[{"id":1672,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/245\/revisions\/1672"}],"wp:attachment":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}