Certificats d'autorité de certification

La Public Key Infrastructure (infrastructure de clés publiques) est utilisée dans de nombreux cas de sécurité sur un système Linux. Pour qu'un certificat soit fiable, il doit être signé par un agent de confiance, qu'on appelle l'autorité de certificat (Certificate Authority) (CA). Les certificats chargés dans cette section sont issus de la liste du système de contrôle de Mozilla et elle est formatée dans une forme utilisée par OpenSSL-1.0.2h. Les certificats peuvent également être utilisés par d'autres applications, directement ou indirectement via openssl.

This package is known to build and work properly using an LFS-7.10 platform.

Introduction à Certificate Authorities

Informations sur le paquet

[Note]

Note

Le fichier certfile.txt dessous est en fait récupéré depuis https://hg.mozilla.org/releases/mozilla-release/file/default/security/nss/lib/ckfw/builtins/certdata.txt. C'est en fait un fichier HTML, mais le fichier texte peut être pris indirectement depuis le fichier HTML. L'URL dessous automatise ce processus et ajoute aussi une ligne où la date peut être extraite en tant que numéro de révision par le script.

Dépendances de Certificate Authority Certificates

Requises

OpenSSL-1.0.2h

Recommandées

Notes utilisateur : http://wiki.linuxfromscratch.org/blfs/wiki/cacerts

Installation de Certificate Authority Certificates

Créez d'abord un script pour reformater un certificat dans la forme dont a besoin openssl. En tant qu'utilisateur root :

cat > /usr/bin/make-cert.pl << "EOF"
#!/usr/bin/perl -w

# Used to generate PEM encoded files from Mozilla certdata.txt.
# Run as ./make-cert.pl > certificate.crt
#
# Parts of this script courtesy of RedHat (mkcabundle.pl)
#
# This script modified for use with single file data (tempfile.cer) extracted
# from certdata.txt, taken from the latest version in the Mozilla NSS source.
# mozilla/security/nss/lib/ckfw/builtins/certdata.txt
#
# Authors: DJ Lucas
#          Bruce Dubbs
#
# Version 20120211

my $certdata = './tempfile.cer';

open( IN, "cat $certdata|" )
    || die "could not open $certdata";

my $incert = 0;

while ( <IN> )
{
    if ( /^CKA_VALUE MULTILINE_OCTAL/ )
    {
        $incert = 1;
        open( OUT, "|openssl x509 -text -inform DER -fingerprint" )
            || die "could not pipe to openssl x509";
    }

    elsif ( /^END/ && $incert )
    {
        close( OUT );
        $incert = 0;
        print "\n\n";
    }

    elsif ($incert)
    {
        my @bs = split( /\\/ );
        foreach my $b (@bs)
        {
            chomp $b;
            printf( OUT "%c", oct($b) ) unless $b eq '';
        }
    }
}
EOF

chmod +x /usr/bin/make-cert.pl

Le script suivant crée les certificats et un bouquet de tous les certificats. Il crée un répertoire ./certs et ./BLFS-ca-bundle-${VERSION}.crt. Créez de nouveau ce script en tant qu'utilisateur root :

cat > /usr/bin/make-ca.sh << "EOF"
#!/bin/sh
# Begin make-ca.sh
# Script to populate OpenSSL's CApath from a bundle of PEM formatted CAs
#
# The file certdata.txt must exist in the local directory
# Version number is obtained from the version of the data.
#
# Authors: DJ Lucas
#          Bruce Dubbs
#
# Version 20120211

# Some data in the certs have UTF-8 characters
export LANG=en_US.utf8

certdata="certdata.txt"

if [ ! -r $certdata ]; then
  echo "$certdata must be in the local directory"
  exit 1
fi

REVISION=$(grep CVS_ID $certdata | cut -f4 -d'$')

if [ -z "${REVISION}" ]; then
  echo "$certfile has no 'Revision' in CVS_ID"
  exit 1
fi

VERSION=$(echo $REVISION | cut -f2 -d" ")

TEMPDIR=$(mktemp -d)
TRUSTATTRIBUTES="CKA_TRUST_SERVER_AUTH"
BUNDLE="BLFS-ca-bundle-${VERSION}.crt"
CONVERTSCRIPT="/usr/bin/make-cert.pl"
SSLDIR="/etc/ssl"

mkdir "${TEMPDIR}/certs"

# Get a list of starting lines for each cert
CERTBEGINLIST=$(grep -n "^# Certificate" "${certdata}" | cut -d ":" -f1)

# Get a list of ending lines for each cert
CERTENDLIST=`grep -n "^CKA_TRUST_STEP_UP_APPROVED" "${certdata}" | cut -d ":" -f 1`

# Start a loop
for certbegin in ${CERTBEGINLIST}; do
  for certend in ${CERTENDLIST}; do
    if test "${certend}" -gt "${certbegin}"; then
      break
    fi
  done

  # Dump to a temp file with the name of the file as the beginning line number
  sed -n "${certbegin},${certend}p" "${certdata}" > "${TEMPDIR}/certs/${certbegin}.tmp"
done

unset CERTBEGINLIST CERTDATA CERTENDLIST certbegin certend

mkdir -p certs
rm -f certs/*      # Make sure the directory is clean

for tempfile in ${TEMPDIR}/certs/*.tmp; do
  # Make sure that the cert is trusted...
  grep "CKA_TRUST_SERVER_AUTH" "${tempfile}" | \
    egrep "TRUST_UNKNOWN|NOT_TRUSTED" > /dev/null

  if test "${?}" = "0"; then
    # Throw a meaningful error and remove the file
    cp "${tempfile}" tempfile.cer
    perl ${CONVERTSCRIPT} > tempfile.crt
    keyhash=$(openssl x509 -noout -in tempfile.crt -hash)
    echo "Certificate ${keyhash} is not trusted!  Removing..."
    rm -f tempfile.cer tempfile.crt "${tempfile}"
    continue
  fi

  # If execution made it to here in the loop, the temp cert is trusted
  # Find the cert data and generate a cert file for it

  cp "${tempfile}" tempfile.cer
  perl ${CONVERTSCRIPT} > tempfile.crt
  keyhash=$(openssl x509 -noout -in tempfile.crt -hash)
  mv tempfile.crt "certs/${keyhash}.pem"
  rm -f tempfile.cer "${tempfile}"
  echo "Created ${keyhash}.pem"
done

# Remove blacklisted files
# MD5 Collision Proof of Concept CA
if test -f certs/8f111d69.pem; then
  echo "Certificate 8f111d69 is not trusted!  Removing..."
  rm -f certs/8f111d69.pem
fi

# Finally, generate the bundle and clean up.
cat certs/*.pem >  ${BUNDLE}
rm -r "${TEMPDIR}"
EOF

chmod +x /usr/bin/make-ca.sh

Ajoutez un script bref pour supprimer les certificats expirés d'un répertoire. Créez de nouveau ce script en tant qu'utilisateur root :

cat > /usr/sbin/remove-expired-certs.sh << "EOF"
#!/bin/sh
# Begin /usr/sbin/remove-expired-certs.sh
#
# Version 20120211

# Make sure the date is parsed correctly on all systems
mydate()
{
  local y=$( echo $1 | cut -d" " -f4 )
  local M=$( echo $1 | cut -d" " -f1 )
  local d=$( echo $1 | cut -d" " -f2 )
  local m

  if [ ${d} -lt 10 ]; then d="0${d}"; fi

  case $M in
    Jan) m="01";;
    Feb) m="02";;
    Mar) m="03";;
    Apr) m="04";;
    May) m="05";;
    Jun) m="06";;
    Jul) m="07";;
    Aug) m="08";;
    Sep) m="09";;
    Oct) m="10";;
    Nov) m="11";;
    Dec) m="12";;
  esac

  certdate="${y}${m}${d}"
}

OPENSSL=/usr/bin/openssl
DIR=/etc/ssl/certs

if [ $# -gt 0 ]; then
  DIR="$1"
fi

certs=$( find ${DIR} -type f -name "*.pem" -o -name "*.crt" )
today=$( date +%Y%m%d )

for cert in $certs; do
  notafter=$( $OPENSSL x509 -enddate -in "${cert}" -noout )
  date=$( echo ${notafter} |  sed 's/^notAfter=//' )
  mydate "$date"

  if [ ${certdate} -lt ${today} ]; then
     echo "${cert} expired on ${certdate}! Removing..."
     rm -f "${cert}"
  fi
done
EOF

chmod u+x /usr/sbin/remove-expired-certs.sh

Les commandes suivantes récupéreront les certificats et les convertiront dans le bon format. Si vous le désirez, vous pouvez utiliser un navigateur Internet plutôt que wget mais le fichier devra être enregistré sous le nom certdata.txt. Ces commandes peuvent être répétées autant de fois que nécessaire pour mettre à jour les Certificats CA.

URL=http://anduin.linuxfromscratch.org/BLFS/other/certdata.txt &&
rm -f certdata.txt &&
wget $URL          &&
make-ca.sh         &&
unset URL

Maintenant, en tant qu'utilisateur root :

SSLDIR=/etc/ssl                                              &&
remove-expired-certs.sh certs                                &&
install -d ${SSLDIR}/certs                                   &&
cp -v certs/*.pem ${SSLDIR}/certs                            &&
c_rehash                                                     &&
install BLFS-ca-bundle*.crt ${SSLDIR}/ca-bundle.crt          &&
ln -sfv ../ca-bundle.crt ${SSLDIR}/certs/ca-certificates.crt &&
unset SSLDIR

Enfin, nettoyez le répertoire courant :

rm -r certs BLFS-ca-bundle*

Après l'installation ou la mise à jour des certificats, si OpenJDK est installé, mettez à jour les certificats pour Java en utilisant la procédure dans JRE Certificate Authority Certificates.

Contenu

Programmes installés: make-ca.sh, make-cert.pl et remove-expired-certs.sh
Bibliothèques installées: Aucune
Répertoires installés: /etc/ssl/certs

Descriptions courtes

make-ca.sh

est un script du shell qui reformate le fichier certdata.txt pour que openssl l'utilise.

make-cert.pl

est un script perl qui convertit un certificat binaire unique (format .der) au format .pem.

remove-expired-certs.sh

est un script shell qui supprime les certificats expirés d'un répertoire. Le répertoire par défaut est /etc/ssl/certs.

Last updated on 2016-08-25 03:13:01 +0200