Certificate Authority Certificates

La Public Key Inrastructure (infrastructure de clés publiques) est utilisés 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.1e. Les certificats peuvent également être utilisés par d'autres applications, directement ou indirectement via openssl.

Ce paquet est connu pour se construire correctement sur une plateforme LFS-7.4.

Introduction à Certificate Authorities

Informations sur le paquet

Dépendances de Certificate Authority Certificates

Requises

OpenSSL-1.0.1e

Recommandée

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

Installation de Certificate Authority Certificates

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

cat > /bin/make-cert.pl << "EOF"
#!/usr/bin/perl -w
# Used to generate PEM encoded files from Mozilla certdata.txt.
# Run as ./mkcrt.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 /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 > /bin/make-ca.sh << "EOF"
#!/bin/bash
# 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
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="/bin/make-cert.pl"
SSLDIR="/etc/ssl"
mkdir "${TEMPDIR}/certs"
# Get a list of staring 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 certebegin certend
mkdir -p certs
rm 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 /bin/make-ca.sh

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

cat > /bin/remove-expired-certs.sh << "EOF"
#!/bin/bash
# Begin /bin/remove-expired-certs.sh
#
# Version 20120211
# Make sure the date is parsed correctly on all systems
function 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 +x /bin/remove-expired-certs.sh

Les commandes suivantes récupèreront les certificats et les convertit 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.

certhost='http://mxr.mozilla.org'                        &&
certdir='/mozilla/source/security/nss/lib/ckfw/builtins' &&
url="$certhost$certdir/certdata.txt?raw=1"               &&
wget --output-document certdata.txt $url &&
unset certhost certdir url               &&
make-ca.sh                               &&
remove-expired-certs.sh certs

Maintenant, en tant qu'utilisateur root :

SSLDIR=/etc/ssl                                             &&
install -d ${SSLDIR}/certs                                  &&
cp -v certs/*.pem ${SSLDIR}/certs                           &&
c_rehash                                                    &&
install BLFS-ca-bundle*.crt ${SSLDIR}/ca-bundle.crt         &&
ln -sv ../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 la section intitulée « Installez ou mettez à jour les fichiers "JRE Certificate Authority Certificates" (cacerts) ».

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 bash 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 perl qui supprime les certificats expirés d'un répertoire. Le répertoire par défaut est /etc/ssl/certs.

Last updated on : 2013-03-05 00:08:42 +010