Полностью автоматизированное (не диалоговое) создание современных стойких самоподписанных 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 < 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 < $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 вместо $$.