Problemas en repositorio apt de qgis

2018/01/05

Descripción del problema

Se desea instalar qgis versión 2.14 en un ubuntu 14.04.

Para ello se siguen las instrucciones indicadas en https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu (como root):

  1. Se agrega el repositorio de qgis a la lista de repositorios de apt:

    # cat > /etc/apt/sources.list.d/qgis.list <<'END'
    deb https://qgis.org/ubuntugis-ltr trusty main
    deb http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu trusty main
    END
    
  2. Se instalan los certificados de los repositorios:

    Para qgis:

    # apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key CAEB3DC3BDF7FB45
    Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.2ITtsBKJDp --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key CAEB3DC3BDF7FB45
    gpg: solicitando clave BDF7FB45 de hkp servidor keyserver.ubuntu.com
    gpg: clave BDF7FB45: clave pública "QGIS Archive Automatic Signing Key (2017) <qgis-developer@lists.osgeo.org>" importada
    gpg: Cantidad total procesada: 1
    gpg:               importadas: 1  (RSA: 1)
    

    Para ppa ubuntu:

    # apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 089EBE08314DF160
    Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --homedir /tmp/tmp.fDrFUqJgJ8 --no-auto-check-trustdb --trust-model always --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 089EBE08314DF160
    gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
    gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
    gpg: Total number processed: 1
    gpg:               imported: 1  (RSA: 1)
    
  3. Se actualiza la información de los paquetes del nuevo repositorio:

    # apt-get update
    ...
    Err https://qgis.org trusty/main i386 Packages
      gnutls_handshake() failed: Handshake failed
    ...
    W: Failed to fetch https://qgis.org/ubuntugis-ltr/dists/trusty/main/binary-i386/Packages  gnutls_handshake() failed: Handshake failed
    
    E: Some index files failed to download. They have been ignored, or old ones used instead.
    

El problema anterior suele darse debido a que la versión de gnutls instalada en el sistema no soporta los algoritmos de cifrado TLS disponibles en el servidor.

A continuación se lista el script completo para instalar qgis:

#!/bin/bash
#
# Install qgis
#
# See:
# * http://www.qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu
#
set -e

# only run in ubuntu 14.04
if [ "$(lsb_release -si)" != "Ubuntu" -o "$(lsb_release -sr)" != "14.04" ]; then
    echo "This scripts only works in 'Ubuntu 14.04'" >&2
    exit 1
fi

# check that is run with sudo
if [ -z $SUDO_USER ]; then
    echo "Run using 'sudo'" >&2
    exit 1
fi

#
# install qgis
#
export DEBIAN_FRONTEND=noninteractive

# add qgis repositories
cat > /etc/apt/sources.list.d/qgis.list <<'END'
deb https://qgis.org/ubuntugis-ltr trusty main
deb http://ppa.launchpad.net/ubuntugis/ppa/ubuntu trusty main
END

# add certificates for repositories
# NOTE: get qgis repository key from keyserver - 2017
# NOTE: the key change every year!
# NOTE: See: https://qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key CAEB3DC3BDF7FB45
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 089EBE08314DF160

# update repository and install packages
apt-get update
apt-get install -qVy qgis python-qgis qgis-plugin-grass

Confirmación del problema

Para confirmar lo anterior se puede utilizar el comando gnutls-cli disponible en el paquete gnutls-bin y el sitio https://www.ssllabs.com/ssltest:

  1. Instalación del paquete gnutls-bin:

    $ sudo apt-get install -qVy gnutls-bin
    
  2. Intentar establecer una conexión TLS con el servidor (se espera que falle):

    $ gnutls-cli --verbose --port 443 qgis.org
    Resolving 'qgis.org'...
    Connecting to '104.27.139.220:443'...
    *** Fatal error: A TLS fatal alert has been received.
    *** Received alert [40]: Handshake failed
    *** Handshake has failed
    GnuTLS error: A TLS fatal alert has been received.
    
  3. Obtener los algoritmos soportados por la versión de gnutls del sistema:

    $ gnutls-cli --list
    
  4. Obtener los algoritmos utilizados por el servidor de la página https://www.ssllabs.com/ssltest/analyze.html?d=qgis.org

Comparando los algoritmos listados en el paso 3. y los del paso 4., vemos que no hay coincidencias, de ahí que ocurra el error al intentar realizar el handshake.

Solucion propuesta - crear mirror

Se intentó actualizar las versiones de gnutls, de los repositorios de ubuntu, pero esto no solucionó el problema.

Como alternativa se creará un mirror local del repositorio utilizando apt-mirror (paquete apt-mirror), ya que se buscará instalar qgis en varios PC’s y se aprovechará para realizar la configuración de forma que deban utilizarse solamente servidores de la red interna sin acceso a internet.

Para ello se crea una configuración de apt-mirror para realizar un mirror de los repositorios de qgis y ppa ubuntugis, que contienen los paquetes para ubuntu trusty (14.04):

NOTA: los siguientes comandos se ejecutan en el servidor en el que se desea crear los mirror locales.

$ cat <<'END' | sudo tee /etc/apt/mirror-qgis-trusty.list > /dev/null
set base_path /srv/mirror/apt-mirror-qgis-trusty
set run_postmirror 0
set nthreads 20
set _tilde 0
deb-i386 https://qgis.org/ubuntugis-ltr trusty main
deb-i386 http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu trusty main
clean https://qgis.org/ubuntugis-ltr
clean http://ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu
END

Luego se crea el directorio en que se descargarán los archivos y se ejecuta el programa con la configuración previamente creada:

$ sudo mkdir -p /srv/mirror/apt-mirror-qgis-trusty
$ sudo chown apt-mirror:apt-mirror /srv/mirror/apt-mirror-qgis-trusty
$ sudo su -c 'apt-mirror /etc/apt/mirror-qgis-trusty.list' -l apt-mirror

Ya que se busca evitar la conexión a internet, se elige el directorio /srv/mirror/apt-mirror-qgis-trusty para almacenar los certificados de los repositorios:

$ sudo wget -q -P /srv/mirror/apt-mirror-qgis-trusty 'https://qgis.org/downloads/qgis-2017.gpg.key'
$ gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-key 089EBE08314DF160
$ gpg --export --armor 089EBE08314DF160 | sudo tee /srv/mirror/apt-mirror-qgis-trusty/ubuntugis.gpg.key > /dev/null

Ahora resta servir los repositorios descargados en /srv/mirror/apt-mirror-qgis-trusty/mirror/qgis.org mediante un servidor web.

Configurando un servidor web que sirva el contenido de /var/www, se crean los links simbólicos:

$ sudo mkdir -p /var/www/mirrors/qgis-trusty
$ sudo ln -s -t /var/www/mirrors/qgis-trusty /srv/mirror/apt-mirror-qgis-trusty/mirror/qgis.org
$ sudo ln -s -t /var/www/mirrors/qgis-trusty /srv/mirror/apt-mirror-qgis-trusty/mirror/ppa.launchpad.net
$ sudo ln -s -t /var/www/mirrors/qgis-trusty /srv/mirror/apt-mirror-qgis-trusty/qgis-2017.gpg.key
$ sudo ln -s -t /var/www/mirrors/qgis-trusty /srv/mirror/apt-mirror-qgis-trusty/ubuntugis.gpg.key

Ahora, suponiendo que se acceda al mirror utilizando el hostname mirror.example.com, se modifica el script anterior para instalar qgis:

#!/bin/bash
#
# Install qgis
#
# See:
# * http://www.qgis.org/en/site/forusers/alldownloads.html#debian-ubuntu
#
set -e

# only run in ubuntu 14.04
if [ "$(lsb_release -si)" != "Ubuntu" -o "$(lsb_release -sr)" != "14.04" ]; then
    echo "This scripts only works in 'Ubuntu 14.04'" >&2
    exit 1
fi

# check that is run with sudo
if [ -z $SUDO_USER ]; then
    echo "Run using 'sudo'" >&2
    exit 1
fi

#
# install qgis
#
export DEBIAN_FRONTEND=noninteractive

# add qgis repositories
cat > /etc/apt/sources.list.d/qgis.list <<'END'
deb http://mirror.example.com/qgis-trusty/qgis.org/ubuntugis-ltr trusty main
deb http://mirror.example.com/qgis-trusty/ppa.launchpad.net/ubuntugis/ubuntugis-unstable/ubuntu trusty main
END

# add certificates for repositories in mirror
wget -q -O- 'http://mirror.example.com/qgis-trusty/qgis-2017.gpg.key' | apt-key add -
wget -q -O- 'http://mirror.example.com/qgis-trusty/ubuntugis.gpg.key' | apt-key add -

# update repository and install packages
apt-get update
apt-get install -qVy qgis python-qgis qgis-plugin-grass