acme_init 2.22 KB
#!/usr/bin/env bash

# скрипт инициализирует папку ACMEDIR
# создаётся временный сертификат на 1 день
# подготавливаются необходимые ключи и файлы запросов
# проставляются права

set -e

CONFIGFILE=/etc/acme.conf

# считать настройку из конфига
function readconfig {
  OPTION=$1

  # test file
  if [[ ! -f $CONFIGFILE ]] ; then
	  echo "Configuration file $CONFIGFILE not found!"
	  exit 1
  fi
  # read option
  readconfig_return_value="$(cat $CONFIGFILE \
	  | grep -v "^[[:space:]]*#" \
	  | awk -F "=" '/'$OPTION'/ {print $2}' \
	  | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' \
  )"

  # test option
  if [[ -z "$readconfig_return_value" ]] ; then
	  echo "Option $OPTION not found in $CONFIGFILE!"
	  exit 1
  fi
}

OPENSSL=$(/usr/bin/env which openssl)
if [[ ! -x $OPENSSL ]] ; then
  echo Cannot find openssl
  exit 1
fi

# теперь считываем конфиг
readconfig acme_dir
ACMEDIR=$readconfig_return_value
readconfig primary_domain
PRIMARY_DOMAIN=$readconfig_return_value
readconfig alt_domains
ALT_DOMAINS=$readconfig_return_value

# если файл уже есть, ничего не делаем
if [[ -f "$ACMEDIR/site.csr" ]]
then
	(>&2 echo "Directory '$ACMEDIR' already exists")
	exit 0
fi

mkdir -p $ACMEDIR/challenges

# создаём необходимые сертификаты
$OPENSSL genrsa 4096 > $ACMEDIR/account.key
$OPENSSL genrsa 4096 > $ACMEDIR/site.key
$OPENSSL req \
    -new \
    -key $ACMEDIR/site.key \
    -days 1 \
    -nodes \
    -x509 \
    -subj "/CN=$PRIMARY_DOMAIN" \
    -out $ACMEDIR/site.crt

# если нет дополнительных доменов
if [[ -z "$ALT_DOMAINS" ]]
then
  $OPENSSL req \
    -new \
    -sha256 \
    -key $ACMEDIR/site.key \
    -subj "/CN=$PRIMARY_DOMAIN"
else
  $OPENSSL req \
    -new \
    -sha256 \
    -key $ACMEDIR/site.key \
    -subj "/CN=$PRIMARY_DOMAIN" \
    -reqexts SAN \
    -config \
       <(cat /etc/ssl/openssl.cnf \
       <(sed -e 's/[[:space:],]\+/,DNS:/g' -e 's/^/[SAN]\nsubjectAltName=DNS:/' \
       <(echo "$ALT_DOMAINS")))
fi \
 > $ACMEDIR/site.csr

echo "`date` initialized" > $ACMEDIR/log.txt