acme_init 2.67 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
}

# теперь считываем конфиг
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
OPENSSL=$(/usr/bin/env which openssl)
if [[ ! -x $OPENSSL ]] ; then
  echo Cannot find openssl
  exit 1
fi

# вычисляем версию
OPENSSL_VERSION=$(${OPENSSL} version)

# для старых версий выбираем sha1
if [[ "OPENSSL_VERSION" < "OpenSSL 0.9.8" ]] ; then
        OPT_DIGEST="-sha1"
else
        OPT_DIGEST="-sha256"
fi

echo "Using ${OPT_DIGEST} digest."

# создаём необходимые сертификаты
$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 \
    $OPT_DIGEST \
    -key $ACMEDIR/site.key \
    -subj "/CN=$PRIMARY_DOMAIN"
else
  cat /etc/ssl/openssl.cnf > $ACMEDIR/openssl.cnf
  echo "[SAN]" >> $ACMEDIR/openssl.cnf
  echo $ALT_DOMAINS | sed \
       -e 's/[[:space:], ]\{1,\}/,DNS:/g' \
       -e 's/^/subjectAltName=DNS:/' \
     >> $ACMEDIR/openssl.cnf
  $OPENSSL req \
    -new \
    $OPT_DIGEST \
    -key $ACMEDIR/site.key \
    -subj "/CN=$PRIMARY_DOMAIN" \
    -reqexts SAN \
    -config $ACMEDIR/openssl.cnf
fi \
 > $ACMEDIR/site.csr

# пишем в лог
echo "`date` initialized" > $ACMEDIR/log.txt