Библиотека сайта rus-linux.net
| Beyond Linux From Scratch. Version 2011-12-30 | ||
| Назад | 4. Безопасность | Вперед |
Сертификаты Certificate Authority
Знакомимся с пакетом Certificate Authority
Инфраструктура общедоступных ключей Public Key Inrastructure используется в системе Linux для решения многих вопросов безопасности. Для того, чтобы сертификату можно было доверять, он должен быть подписан доверенным агентом, который называется Certificate Authority (CA). Сертификаты, загруженные этом разделе, берутся из списка системы контроля версий Mozilla и преобразуются в форму, используемую в пакете OpenSSL-1.0.0e. Сертификаты также могут использоваться в других приложениях либо напрямую, либо опосредованно через openssl.
Известно, что пакет правильно собирается и работает на платформе LFS-7.0.
Информация о пакете
- Загрузка сертификата CA: http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
- Контрольная сумма MD5:
- Размер скачиваемого архива CA: 1,2 MB
- Оценочный размер требуемого дискового пространства: 1,2 MB
- Оценочное время сборки: менее 0,1 SBU
Зависимости пакета Certificate Authority Certificates
Обязательные
Необязательные
Замечания для пользователей: http://wiki.linuxfromscratch.org/blfs/wiki/cacerts
Установка сертификатов Certificate Authority
Сначала создайте скрипт, который переформатирует сертификат в форму, необходимую для openssl. В роли пользователя root выполните:
cat > /bin/make-cert.pl << "EOF"
#!/usr/bin/perl -w
# Используется для генерации кодированных файлов PEM из файла certdata.txt пакета Mozilla.
# Запускается как ./mkcrt.pl > certificate.crt
#
# Фрагменты этого скрипта взяты из системы RedHat (mkcabundle.pl)
#
# Этот скрипт изменен с тем, чтобы его можно было использовать с данными (tempfile.cer),
# получаемыми из одного фала certdata.txt, взятого из последней версии исходного кода Mozilla NSS
# mozilla/security/nss/lib/ckfw/builtins/certdata.txt
#
# Авторы: 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
С помощью следующего скрипта создаются сертификаты о асхив со всеми сертификатами. Скрипт создает директорий ./certs и файл ./BLFS-ca-bundle-${VERSION}.crt. Опять же создавайте этот скрипт в роли пользователя root:
cat > /bin/make-ca.sh << "EOF"
#!/bin/bash
# Начало файла make-ca.sh
# Скрипт для заполнения данными CApath пакета OpenSSL из хранилища форматированных сертификатов PEM
#
# В локальном директории должен быть файл certdata.txt
# Номер версии берется из номера версии данных.
#
# Авторы: 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"
# Для каждого сертификата получаем список строк со звездочками
CERTBEGINLIST=$(grep -n "^# Certificate" "${certdata}" | cut -d ":" -f1)
# Для каждого сертификата получаем получаем список завершающих строк
CERTENDLIST=`grep -n "^CKA_TRUST_STEP_UP_APPROVED" "${certdata}" | cut -d ":" -f 1`
# Начало цикла loop
for certbegin in ${CERTBEGINLIST}; do
for certend in ${CERTENDLIST}; do
if test "${certend}" -gt "${certbegin}"; then
break
fi
done
# Дамп во временный файл с именем файла, с номером начальной строки
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
# Убеждаемся, что сертификат надежный...
grep "CKA_TRUST_SERVER_AUTH" "${tempfile}" | \
grep "CKT_NETSCAPE_TRUST_UNKNOWN" > /dev/null
if test "${?}" = "0"; then
# Отбрасываем значимые ошибки и удаляем файл
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
# Iесли исполнение доходит до этого места в цикле, то временный сертификат надежный
# Находим данные для сертификата и создаем для них сертификационный файл
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
# Удаляем файлы из черного списка
# 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
# Наконец, создаем bundle и удаляем ненужные данные
cat certs/*.pem > ${BUNDLE}
rm -r "${TEMPDIR}"
EOF
chmod +x /bin/make-ca.sh
Добавим короткий скрипт, с помощью которого из директория удаляются просроченные сертификаты. Снова создайте этот скрипт в роли пользователя root:
cat > /bin/remove-expired-certs.sh << "EOF"
#!/bin/bash
# Начало /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
Следующие команды будут получать сертификаты и конвертировать их в нужный формат. При желании можно вместо команды wget использовать веб-браузер, но файл нужно сохранять с именем certdata.txt. Эти команды можно повторять по мере необходимости для обновления сертификатов 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
Теперь в роли пользователя 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
Наконец, очистите текущий директорий:
rm -r certs BLFS-ca-bundle*
Описание пакета
Установленные программы: make-ca.sh, make-cert.pl и remove-expired-certs.sh
Установленные библиотеки: Нет
Установленные директории: /etc/ssl/certs
Краткое описание
make-ca.sh | скрипт bash, который переформатирует файл |
make-cert.pl | утилита — скрипт perl, одиночный сертификат в двоичном формате (формат .der) в формат .pem |
remove-expired-certs.sh | утилита — скрипт perl, которая удаляет из директория просроченные сертификаты. По умолчанию будет использоваться директорий |
Перевод сделан с варианта оригинала, датированного 2011-11-01 09:10:22 +0000
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| OpenSSL-1.0.0e | Пакет GnuTLS-3.0.7 |
