Категории

вторник, 10 сентября 2013 г.

Скрипт генерации сертификатов SSL для nginx.

Скрипт генерации ssl сертификатов и ключей для nginx:
#!/bin/sh

error() {
        echo 'ERROR detected! Exiting...'
        exit 1
}

#################################################
DOMAIN='domain.com'
EMAIL='admin@domain.com'
ORGANISATION='Organisation'
CITY='you city'
RSA_BIT=2048
DAYS=99365
#################################################

# Генерируем пароль для ключей.
PASS=$(tr -cd A-Za-z < /dev/urandom | head -c8)
echo 'Generated Password: '${PASS}

# Проверим, если не существует каталог для домена, то создаем его.
[ ! -d ${DOMAIN} ] && mkdir ${DOMAIN} && echo 'Create directory: '${DOMAIN}

#http://linuxcmd.ru/openssl-genrsa-sozdanie-fayla-klyuchey
echo "Now create the server private key, you'll be asked for a passphrase:"
openssl genrsa -des3 -out ${DOMAIN}/${DOMAIN}.key -passout pass:${PASS} ${RSA_BIT}
[ $? -eq 1 ] && error

#http://linuxcmd.ru/openssl-req-sozdanie-csr-zaprosa
#В пункте Common Name (eg, YOUR name) []: надо указать именно имя домена (без http, https, /): имя.домена
echo 'Create the Certificate Signing Request (CSR):'
openssl req -out ${DOMAIN}/${DOMAIN}.csr -new -newkey rsa:${RSA_BIT} \
        -subj /C=RU/ST=${CITY}/L=${CITY}/O=${ORGANISATION}/OU=${ORGANISATION}/CN=*.${DOMAIN}/emailAddress=${EMAIL} \
        -nodes -keyout ${DOMAIN}/${DOMAIN}.key -passout pass:${PASS}
[ $? -eq 1 ] && error

# Starting up nginx with SSL using the above private key:
echo 'Remove the necessity of entering a passphrase for:'
cp ${DOMAIN}/${DOMAIN}.key ${DOMAIN}/${DOMAIN}.key.org
openssl rsa -in ${DOMAIN}/${DOMAIN}.key.org -out ${DOMAIN}/${DOMAIN}.key
[ $? -eq 1 ] && error

echo 'Finally sign the certificate using the above private key and CSR:'
openssl x509 -req -days ${DAYS} -in ${DOMAIN}/${DOMAIN}.csr -signkey ${DOMAIN}/${DOMAIN}.key -out ${DOMAIN}/${DOMAIN}.crt
[ $? -eq 1 ] && error


#http://wiki.nginx.org/HttpSslModule
cat <<_EOF
Update Nginx configuration by including the newly signed certificate and private key:
server {
    server_name YOUR_DOMAINNAME_HERE;
    listen 443;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
}
_EOF

#Убедиться в том, что сервер присылает полную цепочку сертификатов,
#можно при помощи утилиты командной строки openssl, например:
#openssl s_client -connect www.godaddy.com:443

Ссылки по теме:
1. openssl req - создание CSR-запроса
2. openssl genrsa - создание файла ключей

2 комментария:

Garet комментирует...

Спасибо за статью. Правда, еще можно немного добавить команд по генерации csr,key и crt в разных ситуациях (на лету без вопросом, с готовым ключом, с ключом без пароля, и тп.), как пишут здесь - http://sysadm.pp.ua/internet/pound-apache-nginx-ssl-setup.html

METAJIJI комментирует...

Скрипт генерирует только самоподписанные сертификаты, об этом забыл написать в заголовке, будет исправлено :)
Но многие части скрипта можно смело использовать для своих нужд, например я использовал секцию с генерацией csr запроса для получения сертификата на сайте https://login.wosign.com/reg.html (подробнее http://habrahabr.ru/post/249529/)

Код скрипта:
DOMAIN=example.com
PASS=$(tr -cd A-Za-z < /dev/urandom | head -c8)
echo 'Generated Password: '${PASS} | tee ${DOMAIN}.pass
openssl req -out ${DOMAIN}.csr -new -sha256 -newkey rsa:2048 -subj "/C=RU/CN=$DOMAIN" -nodes -keyout ${DOMAIN}.key -passout pass:$PASS

Отправить комментарий