![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Полностью автоматизированное (не диалоговое) создание современных стойких самоподписанных 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 вместо $$.