Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Электронные книги по ОС Linux
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.

Информация о пакете

Зависимости пакета Certificate Authority Certificates

Обязательные

OpenSSL-1.0.0e

Необязательные

Wget-1.13.4

Замечания для пользователей: 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, который переформатирует файл certdata.txt для его использования в openssl

make-cert.pl

утилита — скрипт perl, одиночный сертификат в двоичном формате (формат .der) в формат .pem

remove-expired-certs.sh

утилита — скрипт perl, которая удаляет из директория просроченные сертификаты. По умолчанию будет использоваться директорий /etc/ssl/ceerts

Перевод сделан с варианта оригинала, датированного 2011-11-01 09:10:22 +0000


Предыдущий раздел: Оглавление Следующий раздел:
OpenSSL-1.0.0e   Пакет GnuTLS-3.0.7