dadv: (chuck)
[personal profile] dadv

Полностью автоматизированное (не диалоговое) создание современных стойких самоподписанных CA и сертификатов для доменов с поддержкой субдоменов (заметки на память).

  • Создаём CA.

    days=3650
    sign="sha256"
    encrypt="-newkey rsa:2048"
    pass='pass:1234567890'
    cnf=/etc/ssl/openssl.cnf
    
    umask 077
    mkdir CA
    cd CA
    mkdir certs crl newcerts private
    echo "01" > serial
    touch index.txt
    
    answers() {
      cat <<EOF
    RU
    Moscow region
    Moscow
    Company name
    Department name
    domain.name
    info@domain.name
    EOF
    }
    
    answers | openssl req -passout "$pass" -new -x509 -$sign $encrypt \
      -keyout private/cakey.pem -out cacert.pem -days $days -config $cnf
    echo "$pass" > pass
    


  • Создаем сертификат для веб-домена domain.name (опционально с поддержкой субдоменов *.domain.name), в скрипт передаём имя домена, контактный e-mail и название организации для создаваемого сертификата.

    wildcard="no"
    days=3650
    cnf=/etc/ssl/openssl.cnf
    sign="sha256"
    encrypt="-newkey rsa:2048"
    name="$1"
    email="$2"
    org="$3"
    outdir="certs"
    
    cd CA
    read pass < pass
    answers() {
      local cname="$name"
      [ "$wildcard" = yes ] && cname="*.$name"
      cat <<EOF
    RU
    Moscow region
    Moscow
    $org
    IT Department
    $cname
    $email
    EOF
    }
    
    # Создаем из стандартного временный файл конфигурации для OpenSSL,
    # включающий нужные расширения
    extcnf="$cnf-$$.tmp"
    ename="altname"
    {
      sed "s,^dir[[:space:]]*=.*,dir=.," $cnf
      cat <<EOE
    [ alt_names ]
    DNS.1 = *.$name
    DNS.2 = $name
    
    [ $ename ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    EOE
      [ "$wildcard" = yes ] && echo "subjectAltName = @alt_names"
    } > $extcnf
    
    # Создаем приватный ключ и шаблон сертификата
    filename="$outdir/$name"
    answers | openssl req -nodes -new -x509 -$sign $encrypt \
      -keyout $filename.pem -out $filename.pem -days $days \
      -config "$extcnf" -reqexts $ename
    
    # Конвертируем шаблон в запрос сертификата
    openssl x509 -x509toreq -in $filename.pem -$sign -signkey $filename.pem \
      -extensions $ename -extfile "$extcnf" -out request-$$.pem
    
    # Подписываем запрос с помощью CA
    printf "y\ny\n" | openssl ca -passin "$pass" -config "$extcnf" \
      -days $days -extensions $ename -extfile "$extcnf" -md $sign \
      -policy policy_anything -out $filename-cert.pem -infiles request-$$.pem
    
    # Сохраняем приватный ключ
    openssl rsa -in $filename.pem -out $filename-key.pem
    
    # Создаем файл сертификата для веб-сервера
    openssl x509 -in $filename-cert.pem | cat - $filename-key.pem > $filename.crt
    
    # Не нужны больше
    rm -f request-$$.pem $extcnf $filename.pem
    

В качестве упражнения оставлены контроль ошибок и использование mktemp вместо $$.

Profile

dadv: (Default)
Choose your future

July 2024

M T W T F S S
12 34567
891011121314
15161718192021
22232425262728
293031    

Tags

Style Credit

Powered by Dreamwidth Studios