Category Archives: Hiawatha

hiawatha: Generando certificado SSL hacia archivo .pem

En el sitio de hiawatha está bien documentado en este url. Pero quiero explicarlo para mi, a mi forma, como me funciona.

A propósito, hiawatha soporta SNI, que significa Server Name Indication, el cual permite que se generen varios certificados SSL utilizando una sola IP. Ya las cosas no son como antes que por cada certificado SSL se requería una dirección IP. También otros servidores web soportan SNI, no es algo único de hiawatha, pero es que con hiawatha es tan facilito.

Para generar un certificado SSL en hiawatha, la clave privada, el certificado obtenido del proveedor así como el bundle (grupo de certificados de ayuda que el proveedor entrega) deben ir en un mismo archivo que conocen como .pem.

Cómo generar este archivo .pem? Es fácil.

Obteniendo el certificado de una entidad certificadora

Lo primero que hacemos es generar la clave privada y la solicitud de certificado para enviar a la autoridad certificadora:

openssl req -nodes -newkey rsa:2048 -keyout server.key -out server.csr

La clave privada se llamará server.key y la solicitud de certificado se llamará server.csr. Envío este server.csr a la autoridad certificadora, leugo de cumplir los trámites, esta entidad certificadora emitirá un certificado el cual me llegará en un mail. Este certificado llega en un .zip con varios archivos, el certificado tendrá un nombre algo así como www_misitio_com.crt, yo le renombraré, por comodidad para mi como server.crt.

En resumen, tengo el siguiente listado:

AddTrustExternalCARoot.crt,

EssentialSSLCA_2.crt,

server.key,

server.crt,

ComodoUTNSGCCA.crt,

UTNAddTrustSGCCA.crt

Una vez que ya tengo el certificado (server.crt) puedo borrar la solicitud de certificado (server.csr) ya que solo se utiliza para obtener el certificado, por eso no le pongo aquí.

server.crt es el certificado

server.key es la clave privada

El resto de archivos son lo que algunos conocen como bundle, que digamos que son archivos que ayudan a los clientes a tener o dar la certeza de que el certificado fue emitido por una entidad certificadora.

Creando el archivo .pem:

El archivo .pem se crea concatenando los anteriores archivos, y tiene un orden, que es el siguiente:

1- server.key

2- server.crt

3- el resto del bundle (yo le probé poner en diferente orden los archivos del bundle y funcionó bien en cualquier caso).

El comando mediante el cual concatené todos los archivos es el siguiente:

cat server.key server.crt UTNAddTrustSGCCA.crt ComodoUTNSGCCA.crt EssentialSSLCA_2.crt \
AddTrustExternalCARoot.crt > /etc/hiawatha/server.pem

chmod 400 /etc/hiawatha/server.pem

Como se puede ver, es sencillo, concateno todo con cat hacia un archivo dentro de /etc/hiawatha/ y le cambio los permisos para 400 a este archivo.

Finalizando:

Aunque esto ya no tiene que ver con el hecho de generar el archivo .pem lo publico pues me hace falta:

Una vez haya realizado esto, simplemente en el sitio virtual dentro de /etc/hiawatha/hiawatha.conf declaro que su certificado ssl es el archivo server.pem:

SSLcertFile = server.pem

Puede verse más información sobre cómo activar el SSL en hiawatha puede verse en su sitio web.

How do I create a hiawatha webserver rpm?

This howto will explain how to create a CentOS-5 and centOS-6 rpm for hiawatha webserver, a security-centric webserver.

Installing mock

I do all my rpm building in a separate and isolated virtual machine.. you probably will want to do this.. install a CentOS-6 x86_64 virtual machine and then install mock:

I installed mock from the EPEL repository:

yum install mock

Installing our anku repositories for mock

Now a “must”:

The creator of hiawatha requires the use of a cmake version newer, not offered, by CentOS-5 nor CentOS-6, therefore I had to build a cmake rpm for a newer version, version 2.8.4 has been uploaded to our CentOS repositories (http://anku.ecualinux.com) we call those repos: anku (anku means flexible in Quechua Language). You have to add a “new” repository to your mock installation.

To do so, please download the following files into: your /etc/mock directory (as root):

wget http://www.ecualinux.com/anku-5-i386.cfg -O /etc/mock/anku-5-i386.cfg
wget http://www.ecualinux.com/anku-6-i386.cfg -O /etc/mock/anku-6-i386.cfg
wget http://www.ecualinux.com/anku-5-x86_64.cfg -O /etc/mock/anku-5-x86_64.cfg
wget http://www.ecualinux.com/anku-6-x86_64.cfg -O /etc/mock/anku-6-x86_64.cfg
wget http://www.ecualinux.com/anku-7-x86_64.cfg -O /etc/mock/anku-7-x86_64.cfg

Doing this is a must!!! Otherwise the compilation will fail with cmake errors.

Actually all the anku-*.cfg’s files are the very same epel-*cfg ones but with a new repository added (the anku one near the end of each file)

Creating a mock user:

Then created a user to work with mock, for this user to be able to work it must be in the “mock” group.

useradd eperez
passwd eperez

I then added eperez to the mock group by editing /etc/group. Check this line at the bottom of your /etc/group file containing my username as part of the mock group:

[eperez@mock ~]$ egrep mock /etc/group
mock:x:492:eperez

Good. Then login as your mock user, in my case eperez, all the steps from now on will be made as user eperez, as my mock user

Download the latest hiawatha from there, for example, the latest hiawatha webserver package as of today is 9.12, lets download it:

wget --no-check-certificate https://www.hiawatha-webserver.org/files/hiawatha-9.12.tar.gz

(ok, versions will continue rolling after a few months or years, allways look for the latest hiawatha*tar.gz in the hiawatha webserver’s site)

Now I must get a working hiawatha.spec file, I simply take advantage of a previous hiawatha SRC.RPM from my repos. I store all of them in here: http://anku.ecualinux.com/6/SRPMS/

I then download the latest src.rpm. In this example I will:

  • Download the most up to date hiawatha src.rpm from my repo: http://anku.ecualinux.com/6/SRPMS/hiawatha-9.8-ecualinux.2.el6.src.rpm as of today
  • Open it (with rpm -Uvh)
  • Copy the newest tar.gz I downloaded previously
  • Slightly modify the resulting hiawatha.spec to look for this new version (9.12 in this example)

Here are the steps:

wget http://anku.ecualinux.com/6/SRPMS/hiawatha-9.8-ecualinux.2.el6.src.rpm
rpm -Uvh hiawatha-9.8-ecualinux.2.el6.src.rpm
mv hiawatha-9.12.tar.gz rpmbuild/SOURCES/
vi rpmbuild/SPECS/hiawatha.spec

Ok, the last line.. this is the spec file for the previous version, 9.8 in this example. You may notice it by looking into the very first lines of hiawatha.spec you will see the version (realver) as 9.8, as Im about to compile version 9.12 I change it to look like this:

%define realver  9.12

Well, well… it is time to create an src.rpm for mock to later compile it for all the CentOS versions (5 and 6 as for the moment). I will create a CentOS-5 src.rpm because CentOS-5 can not easily read CentOS-6’s rpm but the opposite is possible: CentOS-6 can open and work with CentOS-5’s rpms.

mock -r anku-5-i386 --buildsrpm --spec rpmbuild/SPECS/hiawatha.spec --sources rpmbuild/SOURCES/

Good.. after a while I have a resulting hiawatha*src.rpm inside: /var/lib/mock/epel-5-i386/result/, lets move it away from there otherwise it can be deleted the next time we invoke mock for this version and arch:

mv /var/lib/mock/epel-5-i386/result/hiawatha-9.12*.src.rpm .

Now the easiest part of all: let’s recompile this newly obtained hiawatha-9.12*.src.rpm for all current CentOS versions (5 and 6) and architectures (i386 and x86_64):

mock -r anku-6-i386 hiawatha-9.12*.src.rpm
mock -r anku-6-x86_64 hiawatha-9.12*.src.rpm
mock -r anku-5-i386 hiawatha-9.12*.src.rpm
mock -r anku-5-x86_64 hiawatha-9.12*.src.rpm

Here is the trick, anku, our repo, remember it? The files I asked you to download into /etc/mock at the beginning of this post? great!.

The results will be stored in:

/var/lib/mock/anku-6-i386/result/
/var/lib/mock/anku-6-x86_64/result/
/var/lib/mock/anku-5-i386/result/
/var/lib/mock/anku-5-x86_64/result/

That’s it! Don’t forget to move the resulting rpms away from the directories stated above as mock delete their contents the next time you try to compile anything using mock for that version and arch.

Final thoughs

What will I do the next time a new hiawatha version comes of? Easy:

  1. Login as user eperez into this server (it is a virtual server with 10GB of HD)
  2. Download the new hiawatha version, for example some day we will have hiawatha-9.13.tar.gz
  3. Move this new tar.gz file to: rpmbuild/SOURCES/
  4. Edit rpmbuild/SPECS/hiawatha.spec and change the version to 9.13
  5. Create a new src.rpm for centos-5
  6. Recompile this src.rpm for all centos versions and arch.

That’s it.