Vyladění SSL od Let’s Encrypt a Apache

Pokud na svém serveru, s operačním systémem Linux, používáte zdarma poskytované certifikáty od Let’s Encrypt a chcete docílit hodnocení A+ na ssllabs.com, viz moje hodnocení a zároveň si i zabezpečit Apache, viz další moje hodnocení, lze toho docílit celkem jednoduše, níže uvedenými kroky.

Vygenerování Diffie-Hellman (DH) parametrů

Nejdříve si pomocí openssl vygenerujeme DH parametry (bude to chvíli trvat):

openssl dhparam -out /etc/ssl/private/dhparams_4096.pem 4096

Nastavení VirtualHostu

Do VirtualHostu konkrétní domény, kde budeme SSL využívat, pak stačí vložit:

SSLEngine on
SSLCompression off
SSLCipherSuite "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
SSLHonorCipherOrder on
SSLProtocol TLSv1.2
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams_4096.pem"

SSLCertificateFile /etc/letsencrypt/live/ambroz.blog/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ambroz.blog/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ambroz.blog/fullchain.pem

Nastavení Apache

V nastavení Apache doporučuji provést podobné nastavení jako níže uvedené (je samozřejmě potřeba provést úpravy dle vašich požadavků a potřeb):

Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Content-Security-Policy: "script-src 'unsafe-inline' https://ambroz.blog; report-uri https://vaclavambroz.report-uri.io/r/default/csp/enforce"

Po restartu Apache byste pak již měli mít podobné hodnocení zabezpečení Apache jako jsem docílil já tady.

Vygenerování certifikátu

Certifikát pak již stačí vygenerovat např. pomocí:

./letsencrypt-auto certonly --standalone --rsa-key-size 4096 -d ambroz.blog

Výsledek pak můžete zkontrolovat tady.

Publikováno 7.5.2016 v 10:21 | Kategorie: Letsencrypt

Let’s Encrypt a chyba Segmentation fault

Po nějakém čase mi přestalo fungovat vystavování certifikátů v operačním systému Debian (viz můj dřívější příspěvek), když se mi po spuštění letsencrypt-auto začala zobrazovat tato chyba:

Updating letsencrypt and virtual environment dependencies...Segmentation fault

Vše se mi postupně povedlo rozchodit, pojďme si nyní ukázat jak.

Identifikace problému

Nejdříve bylo potřeba zjistit co přesně ve skriptu způsobuje problém. V souboru letsencrypt-auto jsem tak změnil:

#!/bin/sh -e

Na:

#!/bin/sh -xe

Problém s pip

Po znovuspuštění letsencrypt-auto jsem tedy zjistil, že to skončí u příkazu pip:

./letsencrypt-auto
+ XDG_DATA_HOME=/root/.local/share
+ VENV_NAME=letsencrypt
+ VENV_PATH=/root/.local/share/letsencrypt
+ VENV_BIN=/root/.local/share/letsencrypt/bin
+ dirname ./letsencrypt-auto
+ LEA_PATH=.
+ BOOTSTRAP=./bootstrap
+ id -u
+ test 0 -ne 0
+ SUDO=
+ [ ! -d /root/.local/share/letsencrypt ]
+ DeterminePythonVersion
+ command -v python2.7
+ export LE_PYTHON=python2.7
+ python2.7 --version
+ cut -d  -f 2
+ sed s/\.//
+ cut -d. -f1,2
+ PYVER=27
+ [ 27 -eq 26 ]
+ [ 27 -lt 26 ]
+ printf Updating letsencrypt and virtual environment dependencies...
Updating letsencrypt and virtual environment dependencies...+ [  = 1 ]
+ /root/.local/share/letsencrypt/bin/pip install -U setuptools
Segmentation fault

Špatně uvedené cesty

Z nějakého důvodu tedy jsou u příkazů pip špatně uvedeny cesty, proto jsem v souboru letsencrypt-auto změnil kód:

if [ "$VERBOSE" = 1 ]  ; then
  echo
  $VENV_BIN/pip install -U setuptools
  $VENV_BIN/pip install -U pip
  $VENV_BIN/pip install -U letsencrypt letsencrypt-apache
  # nginx is buggy / disabled for now, but upgrade it if the user has
  # installed it manually
  if $VENV_BIN/pip freeze | grep -q letsencrypt-nginx ; then
    $VENV_BIN/pip install -U letsencrypt letsencrypt-nginx
  fi
else
  $VENV_BIN/pip install -U setuptools > /dev/null
  printf .
  $VENV_BIN/pip install -U pip > /dev/null
  printf .
  # nginx is buggy / disabled for now...
  $VENV_BIN/pip install -U letsencrypt > /dev/null
  printf .
  $VENV_BIN/pip install -U letsencrypt-apache > /dev/null
  if $VENV_BIN/pip freeze | grep -q letsencrypt-nginx ; then
    printf .
    $VENV_BIN/pip install -U letsencrypt-nginx > /dev/null
  fi
  echo
fi

# Explain what's about to happen, for the benefit of those getting sudo
# password prompts...
echo "Requesting root privileges to run with virtualenv:" $SUDO $VENV_BIN/letsencrypt "$@"
$SUDO $VENV_BIN/letsencrypt "$@"

Na:

if [ "$VERBOSE" = 1 ]  ; then
  echo
  pip install -U setuptools
  pip install -U pip
  pip install -U letsencrypt letsencrypt-apache
  # nginx is buggy / disabled for now, but upgrade it if the user has
  # installed it manually
  if pip freeze | grep -q letsencrypt-nginx ; then
    pip install -U letsencrypt letsencrypt-nginx
  fi
else
  pip install -U setuptools > /dev/null
  printf .
  pip install -U pip > /dev/null
  printf .
  # nginx is buggy / disabled for now...
  pip install -U letsencrypt > /dev/null
  printf .
  pip install -U letsencrypt-apache > /dev/null
  if pip freeze | grep -q letsencrypt-nginx ; then
    printf .
    pip install -U letsencrypt-nginx > /dev/null
  fi
  echo
fi

# Explain what's about to happen, for the benefit of those getting sudo
# password prompts...
echo "Requesting root privileges to run with virtualenv:" $SUDO letsencrypt "$@"
$SUDO letsencrypt "$@"

V podstatě jsem tedy ve skriptu jen odstranil proměnnou $VENV_BIN.

python-dialog

Po této úpravě mi to ale stále nefungovalo a odkazovalo mě to na letsencrypt.log, kde to zobrazovalo chybu:

Traceback (most recent call last):
  File "/usr/local/bin/letsencrypt", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/letsencrypt/cli.py", line 1366, in main
    setup_logging(args, _cli_log_handler, logfile='letsencrypt.log')
  File "/usr/local/lib/python2.7/dist-packages/letsencrypt/cli.py", line 1280, in setup_logging
    cli_handler = cli_handler_factory(args, level, fmt)
  File "/usr/local/lib/python2.7/dist-packages/letsencrypt/cli.py", line 1267, in _cli_log_handler
    handler = log.DialogHandler()
  File "/usr/local/lib/python2.7/dist-packages/letsencrypt/log.py", line 29, in __init__
    self.d = dialog.Dialog() if d is None else d
  File "/usr/local/lib/python2.7/dist-packages/dialog.py", line 1013, in __init__
    self._dialog_prg = _path_to_executable(dialog)
  File "/usr/local/lib/python2.7/dist-packages/dialog.py", line 477, in _path_to_executable
    "can't find the executable for the dialog-like "
ExecutableNotFound

Tady už jen stačilo doinstalovat python-dialog:

aptitude install python-dialog

Publikováno 16.1.2016 v 11:53 | Kategorie: Letsencrypt

Certifikát vystavený autoritou Let’s Encrypt

V případě že chcete využívat zdarma volně dostupný certifikát od certifikační autority Let’s Encrypt na své doméně, kterou hostujete na serveru s operačním systémem Debian, ukáži vám jak na to.

Vygenerování Diffie-Hellman (DH) parametrů

Nejdříve si pomocí openssl vygenerujeme DH parametry (bude to chvíli trvat):

openssl dhparam -out /etc/ssl/private/dhparams_4096.pem 4096

Instalace

Následně provedeme instalaci těmito příkazy:

#aptitude install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Získání certifikátu

Certifikát pro naší doménu/domény získáme jednoduše přes příkaz:

./letsencrypt-auto --apache --rsa-key-size 4096

Kde si stisknutím mezerníku určíme pro jaké domény budeme chtít certifikát vystavit. V případě že chceme vystavit certifikát pro jednu konkrétní doménu a to jak s www, tak i bez, stačí použít příkaz:

./letsencrypt-auto certonly --standalone --rsa-key-size 4096 -d ambroz.blog

Nastavení virtualhosta

Pak už jen stačí nastavit si virtualhosta tak aby běžel na https a všechny http požadavky přesměrovával. Virtualhost by v tomto směru mohl vypadat např. takto:

<VirtualHost *:80>

ServerName ambroz.blog
ServerAlias *.ambroz.blog
ServerAdmin vaclavambroz@vaclavambroz.cz
DocumentRoot /var/www/html/ambroz.blog
<Directory /var/www/html/ambroz.blog>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>
RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

<IfModule mod_headers.c>
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Xss-Protection "1; mode=block"
Header always set X-Content-Type-Options "nosniff"
Header add Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set Content-Security-Policy: "script-src 'unsafe-inline' https://vaclavambroz.cz https://ambroz.blog https://cloud.vaclavambroz.cz google.com; report-uri https://vaclavambroz.report-uri.io/r/default/csp/enforce"
</IfModule>

</VirtualHost>

<VirtualHost *:443>

SSLEngine on
SSLCompression off
SSLCipherSuite "HIGH:!aNULL:!MD5:!3DES:!CAMELLIA:!AES128"
SSLHonorCipherOrder on
SSLProtocol TLSv1.2
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams_4096.pem"

SSLCertificateFile /etc/letsencrypt/live/ambroz.blog/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/ambroz.blog/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/ambroz.blog/fullchain.pem

ServerName ambroz.blog
ServerAlias *.ambroz.blog
ServerAdmin vaclavambroz@vaclavambroz.cz
DocumentRoot /var/www/html/ambroz.blog
<Directory /var/www/html/ambroz.blog>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
Require all granted
</Directory>

</VirtualHost>

Následně stačí jen restartovat Apache a mělo by vše fungovat.

Možné chyby

Po čase se mi začala zobrazovat chyba:

Updating letsencrypt and virtual environment dependencies…Segmentation fault

Moje řešení jsem popsal zde.

Publikováno 11.12.2015 v 00:01 | Kategorie: Letsencrypt