Ce paquet est connu pour se construire et fonctionner correctement
sur une plateforme LFS-7.0.
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
# Utilisé pour générer des fichiers encodés en PEM à partir du certdata.txt de
# Mozilla. Lancez en tant que ./mkcrt.pl > certificate.crt
#
# Nous devons des parties de ce script à RedHat (mkcabundle.pl)
#
# Ce script modifié pour être utilisé avec un seul fichier de données
# (tempfile.cer) extrait de certdata.txt, récupéré dans la dernière version
# des sources de Mozilla NSS.
# mozilla/security/nss/lib/ckfw/builtins/certdata.txt
#
# Auteurs> : DJ Lucas
# Bruce Dubbs
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
# Début de make-ca.sh
# Script pour peupler le CApath d'OpenSSL à partir d'un bouquet de CAs au
# format PEM
#
# Le fichier certdata.txt doit exister dans le répertoire local
# On obtient le numéro de version à partir de la version des données.
#
# Auteurs: DJ Lucas
# Bruce Dubbs
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="make-cert.pl"
SSLDIR="/etc/ssl"
mkdir "${TEMPDIR}/certs"
# Récupérer une liste des lignes bizarres pour chaque certif
CERTBEGINLIST=$(grep -n "^# Certificate" "${certdata}" | cut -d ":" -f1)
# Récupérer une liste des lignes finales pour chaque certif
CERTENDLIST=`grep -n "^CKA_TRUST_STEP_UP_APPROVED" "${certdata}" | cut -d ":" -f 1`
# Démarrer une boucle
for certbegin in ${CERTBEGINLIST}; do
for certend in ${CERTENDLIST}; do
if test "${certend}" -gt "${certbegin}"; then
break
fi
done
# Envoi vers un fichier temp avec le nom des fichiers en tant que numéro du
# début de ligne
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
# S'assure que le certif est fiable...
grep "CKA_TRUST_SERVER_AUTH" "${tempfile}" | \
grep "CKT_NETSCAPE_TRUST_UNKNOWN" > /dev/null
if test "${?}" = "0"; then
# Affiche une erreur significative et supprime le fichier
cp "${tempfile}" tempfile.cer
"${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
# Si on exécute à ce moment de la boucle, le certif temporaire est fiable
# Chercher les données du certif et génère pour lui un fichier de certif
cp "${tempfile}" tempfile.cer
"${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
# Supprime les fichiers blacklistés (mis sur liste noire)
# 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
# Enfin, génère le bouquet et nettoie.
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
# Début de /bin/remove-expired-certs.sh
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=//' )
if [ $( date -d "${date}" +%Y%m%d ) -lt ${today} ]; then
echo "${cert} is expired! 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 the 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 &&
unset SSLDIR
Enfin, nettoyez le répertoire courant :
rm -r certs BLFS-ca-bundle*