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 вместо $$.

This account has disabled anonymous posting.
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org

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