Compilar "Apache HTTP" con soporte ACME en SmartOS

Apache HTTP añadió soporte nativo para el protocolo ACME (renovación automática de certificados X.509) en la versión 2.4.30 del servidor, como un componente opcional y experimental del mismo. La versión del paquete PkgSrc distribuido en SmartOS no tiene dicho módulo, así que en abril de 2020 pedí que se incluyese.

La respuesta fue algo decepcionante: Se añadía a PkgSrc la opción de compilar ese módulo opcional, mod_md, pero dado que sus propios autores lo tienen marcado como experimental, el paquete precompilado para SmartOS seguiría sin incluirlo de serie.

Pero, al menos, ahora puedo compilarlo de forma trivial yo mismo si lo necesito.

No voy a entrar en detalles sobre cómo compilar paquetes en PkgSrc para SmartOS. Este blog tienen muchos artículos sobre este tema, accesibles desde el menú de Tags de la parte superior de la página.

Los pasos concretos para compilar Apache HTTP con el módulo mod_md en una zona PkgSrc de SmartOS son los siguientes:

  1. Una vez en una zona PkgSrc de SmartOS y dentro de un sandbox de compilación apropiado para la versión de las zonas SmartOS donde queramos meter nuestro paquete Apache HTTP personalizado, nos vamos al directorio /data/pkgsrc/www/apache24/, que es donde está Apache HTTP.

  2. Ahí podemos ver las opciones de compilación disponibles usando el comando bmake show-options:

    -> bmake show-options
    Any of the following general options may be selected:
            apache-managed-domain-handling  Enable managing domains and ACME support in Apache web server.
            apache-mpm-event        Use multi-threaded workers in Apache web server.
            apache-mpm-prefork      Use pre-forked workers in Apache web server.
            apache-mpm-worker       Use multiple processes of multi-threaded workers in Apache web server.
            brotli   Enable support for Google's Brotli compression.
            http2    Add support for HTTP/2.
            lua      Enable Lua support.
            privileges
            suexec   Enable suEXEC support in Apache web server.
            xml      Enable XML support.
    
    These options are enabled by default:
            apache-mpm-event apache-mpm-prefork apache-mpm-worker
            brotli http2 xml
    
    These options are currently enabled:
            apache-mpm-event apache-mpm-prefork apache-mpm-worker
            brotli http2 privileges suexec xml
    
    You can select which build options to use by setting PKG_DEFAULT_OPTIONS
    or PKG_OPTIONS.apache.
    
  3. Aquí vemos varias cosas:

    • Al principio del texto vemos la opción que nos interesa:

      Any of the following general options may be selected:
              apache-managed-domain-handling  Enable managing domains and ACME support in Apache web server.
      
    • En medio del texto vemos las opciones con las que se va a compilar ahora mismo Apache HTTP, si no hacemos nada especial. Son las opciones por defecto. Podemos añadir y quitar cosas de ahí:

      These options are currently enabled:
              apache-mpm-event apache-mpm-prefork apache-mpm-worker
              brotli http2 privileges suexec xml
      
    • Al final de texto nos dice bien clarito qué debemos hacer para añadir lo que queremos a la compilación:

      You can select which build options to use by setting PKG_DEFAULT_OPTIONS
      or PKG_OPTIONS.apache.
      
  4. Por lo tanto, utilizaremos la siguiente línea de comando:

    -> bmake PKG_OPTIONS.apache=apache-managed-domain-handling package
    
  5. Al principio del proceso de compilación nos muestra lo siguiente por pantalla. Debemos ser rápidos para verlo o retroceder en el texto para buscarlo:

    The currently selected options are:
    
            apache-managed-domain-handling apache-mpm-event
            apache-mpm-prefork apache-mpm-worker brotli
            http2 privileges suexec xml
    
    You can select which build options to use by setting PKG_DEFAULT_OPTIONS
    or the following variable.  Its current value is shown:
    
            PKG_OPTIONS.apache = apache-managed-domain-handling
    

    Aquí vemos que se reconoce correctamente el cambio de configuración que hemos hecho y que el módulo apache-managed-domain-handling se va a añadir a la compilación.

  6. Esperamos un ratito a que compile y tendremos el paquete disponible en /data/packages/SmartOS/2022Q4/x86_64/All, fuera del sandbox [1].

    [1]

    El directorio depende de qué versión de la sandbox de compilación estemos usando que, a su vez, depende de para qué versión de las zonas SmartOS queremos compilar este paquete.

Detalles a tener en cuenta

Si nuestro paquete se llama igual y tiene el mismo número de versión que el paquete PkgSrc, una actualización o un refresco del paquete en SmartOS puede provocar que nuestra versión sea sustituida por un versión más moderna oficial, sin mod_md. Para solucionarlo, veo tres opciones:

  1. Que el paquete tenga un nombre distinto. Por ejemplo, en vez de apache24, lo podemos llamar apache24-jcea. Puede ser una buena opción, pero en nuestro caso no nos sirve porque Apache HTTP es una dependencia de muchos otros paquetes del Sistema Operativo, así que si le cambiamos el nombre y luego queremos instalar otros paquetes, se instalaría el paquete apache24 original.

  2. Otra posibilidad podría ser cambiarle el número de versión al paquete generado por nosotros para que en vez de ser 2.4.55, por ejemplo, sea 92.4.55. Este es mi enfoque normal, el 9 delante nos permite identificarlo como nuestro y como tiene una versión mayor que la de cualquier actualización que pueda salir para SmartOS, pues no se reemplazará.

    Pero en el caso concreto de Apache HTTP, en SmartOS tenemos problemas como este:

    [root@TEST ~]# pkgin show-deps py311-ap24-mod_wsgi-4.9.4
    direct dependencies for py311-ap24-mod_wsgi-4.9.4
            python311>=3.11.0
            py311-setuptools-[0-9]*
            gcc12-libs>=12.2.0
            apache>=2.4.54nb1<2.5
    

    Aquí vemos que el paquete py311-ap24-mod_wsgi-4.9.4 requiere instalar una versión de Apache HTTP inferior a la 2.5, así que nuestra versión 92.4.55 no le sirve y fallará.

    La solución evidente es añadir el nueve al final, versión 2.4.559 en vez de 2.4.55.

    ¿Cómo se edita la versión de un paquete que vamos a compilar en PkgSrc bajo SmartOS?. Pues examinamos el fichero Makefile en /data/pkgsrc/www/apache24 y vemos lo siguiente al principio:

    DISTNAME=       httpd-2.4.55
    PKGNAME=        ${DISTNAME:S/httpd/apache/}
    

    Reemplazaremos la segunda línea por:

    PKGNAME=        ${DISTNAME:S/httpd/apache/}9
    

    Esto nos añadirá el 9 al final del número de versión del paquete.

    Recuerda que si vas a recompilar un paquete PkgSrc te conviene hacer primero bmake clean para no tener problemas.

  3. Dado que el módulo mod_md es un módulo de carga dinámica en Apache HTTP, una posibilidad es descomprimir el paquete que hemos compilado, obtener el fichero mod_md.so en su interior y copiarlo en el directorio /opt/local/lib/httpd/ una vez instalado el paquete Apache HTTP original de SmartOS.

    En este caso hay que tener en cuenta que mod_md tiene una dependencia que no se va a instalar automáticamente si simplemente copiamos mod_md a lo bruto. Habrá que instalarla a mano:

    [root@TEST ~]# pkgin install jansson
    

Advertencia

Es evidente, pero lo dejo por escrito por si acaso: Si estamos compilando una versión propia de un paquete, tendremos que preocuparnos de actualizarlo cuando salga alguna versión que solucione problemas de seguridad. Ahora el tema estará en nuestras manos, SmartOS no va a actualizar un paquete que nos hemos esforzado mucho en que no toque.