Библиотека сайта 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 |