• [^] # Re: Dépêche !

    Posté par . En réponse au journal Reparlons de Let’s Encrypt. Évalué à 8.

    Le truc qu'il manque à letsencrypt c'est la possibilité d'avoir la clée en avance de phase (ou alors je ne l'ai pas vu de façon simple). La clé actuelle + la clée future (valide que dans le future).

    C’est possible à condition de gérer soi-même les clefs au lieu de laisser Letsencrypt en générer une nouvelle à chaque renouvellement.

    Ça implique de renoncer en partie à l’automatisation fournie par Let’s Encrypt, mais ça n’interdit pas d’automatiser soi-même. :)

    Surtout si il y a un script qui fait tout tout seul :)

    Un exemple à LA RACHE ? Un premier script new-key.sh pour gérer les rotations de clefs :

    #!/bin/bash
    keydir=keys
    if [ -f $keydir/server-key-next.pem ]; then
     # La prochaine clef existe déjà, on la promeut
     mv $keydir/server-key-next.pem $keydir/server-key.pem
    else
     # Pas de prochaine clef (première invocation?),
     # on génère une active
     openssl genrsa -out $keydir/server-key.pem 2048
    fi
    # On génère la nouvelle prochaine clef
    openssl genrsa -out $keydir/server-key-next.pem 2048
    # On génère les empreintes
    for key in $keydir/server-key{,-next}.pem ; do
     hpkp_pin=$(openssl rsa -in $key -pubout -outform DER 2>/dev/null | \
     openssl dgst -sha256 -binary | \
     openssl enc -base64)
     tlsa_pin=$(openssl rsa -in $key -pubout -outform DER 2>/dev/null | \
     openssl dgst -sha256 | cut -d' ' -f2)
     echo "HPKP: pin-sha256=\"$hpkp_pin\""
     echo "TLSA: 3 1 1 $tlsa_pin"
    done
    # On génère la demande de certificat
    # (cert.cfg contient les subjectAlternativeName)
    openssl req -new -key $keydir/server-key.pem \
     -config cert.cfg -outform DER -out cert.csr

    Un second script new-cert.sh demande un nouveau certificat :

    #!/bin/sh
    if [ ! -f cert.csr ]; then
     ./new-key.sh
    fi
    letsencrypt \
     certonly \
     --config ~/.config/letsencrypt/letsencrypt.conf \
     --csr cert.csr \
     --cert-path cert.pem \
     --chain-path chain.pem \
     --fullchain-path cert+chain.pem \
     --authenticator letsencrypt-ssh:ssh \
     --letsencrypt-ssh:ssh-server root@server.example.com \
     --domains $(openssl req -inform DER -in cert.xsr -noout -text | sed -nre 's/ +DNS://gp')

    Appeler le second script chaque fois qu’il faut renouveler le certificat ; appeler préalablement le premier script chaque fois qu’on veut changer de clef.

    Évidemment, le premier script peut faire quelque chose de plus intéressant que de simplement afficher les épingles. Par exemple, aller mettre à jour un fichier de zone.