Несколько дней тому назад нужно было продлить сертификат для одного домена, как раз вспомнил как это делается. В связи с этим решил написать короткую заметку о проделанной работе, а именно установке godaddy SSL сертификатов на pound, apache и nginx под операционной системой Ubuntu 12.04.
1. Генерация CSR
Если ваш домен хоститься на godaddy серверах, то заморочек с продлением и покупкой сертификатов не будет. В моем случаи домен хоститься на серверах нашей фирмы, в связи с чем нужно генерировать csr(certificate signing request).
Certificate signing request – это файлик, который являет собой запрос на получение сертификата и содержит в закодированном виде нужную для центров сертификации информацию и открытый (публичный) ключ. Для генерации csr нужен закрытый(приватный) ключ, который генерируется на стороне сервера, где будет устанавливаться сертификат конкретного домена. Длина ключа должна быть не менее 2048 bit.
Приступаем к генерации приватного ключа. Для этого будем использовать, обновленный после фикса Heartbleed уязвимости, openssl.
root# openssl genrsa -des3 -out somedomain.com.key 2048 Generating RSA private key, 2048 bit long modulus ..........+++ ..............................................................+++ e is 65537 (0x10001) Enter pass phrase for somedomain.com.key: Verifying - Enter pass phrase for somedomain.com.key:
На этом этапе нужно будет ввести пароль на приватный ключ. Хочу заметить, что после получение нужных сертификатов от godaddy, нужно будет убрать пароль с ключа, так как при каждой перезагрузке веб-сервера он будет запрашиваться и мне влом каждый раз его вводить (но вы можете оставить).
После генерации ключа можно перейти к генерации csr запроса. При генерации csr необходимо заполнить латинскими символами следующие поля:
- Наименование страны (Country Name) – две прописных буквы кода страны;
- Страна, город или провинция (State or Province Name);
- Город или населенный пункт (Locality Name);
- Название организации (Organization Name);
- Название отрасли организации (Organizational Unit Name) – к примеру “IT”;
- Доменное имя (Common Name) – somedomain.com для одного домена, *.somedomain.com – для домена и поддоменов(wildcard).
- Почта (Email Address)
Приступаем.
root# openssl req -new -key somedomain.com.key -out somedomain.com.csr -sha512 Enter pass phrase for somedomain.com.key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:IL State or Province Name (full name) [Some-State]:Israel Locality Name (eg, city) []:Rehovot Organization Name (eg, company) [Internet Widgits Pty Ltd]:Some company Ltd Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:*.somedomain.com Email Address []:support@somedomain.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
На два последних запроса просто жмем Enter. Хочу заметить, что challenge password совсем не связан с запросом пароля, который вылазит при рестарте веб-сервера(nginx,pound,apache,etc.), этот атрибут большинство центров сертификации игнорят, godaddy – не исключение. Детали можно почитать в rfc2985.
2. Установка сертификатов
Теперь у нас есть тело запроса, которое нужно закинуть в форму на сайте godaddy. Просто делаем cat somedomain.com.csr, копируем и вставляем на сайте. Далее ждем, когда CA все проверит и утвердит(подпишет) сертификат. Если все прошло успешно – будет доступен для загрузки архив с двумя сертификатами:
- Промежуточный сертификат (intermediate certificate) — это одно из звеньев в цепочке доверия, которое позволяет связать Ваш личный SSL сертификат с корневым центром сертификации.
- Подписанный сертификат (signed certificate) — это наш подписанный(утвержденный) сертификат.
Промежуточный сертификат нужен, чтобы связать наш подписанный сертификат с центром сертификации, включенным в список доверенных в браузере или устройстве. К примеру возьмем goggle.com и посмотрим на информацию об их сертификате:
Здесь Google Internet Authority G2 – это промежуточный сертификат между GeoTrust Global CA и доменом *.google.com.ua.
Далее скачиваем архив и распакуем его на сервере где создавали приватный ключ.
root# unzip a8xq4l3hygnj3xd4rz0svlbzmorv1m.zip f5259a75c35b14bf.crt gd_bundle-g2-g1.crt root# ls -1 a8xq4l3hygnj3xd4rz0svlbzmorv1m.zip f5259a75c35b14bf.crt gd_bundle-g2-g1.crt somedomain.com.key somedomain.com.csr
Как видим у нас есть:
1. f5259a75c35b14bf.crt – наш подписанный сертификат;
2. gd_bundle-g2-g1.crt – промежуточный сертификат;
3. somedomain.com.key – наш приватный ключ, которым мы подписали наш сертификат;
4. somedomain.com.csr – наш запрос на генерацию сертификата.
Из всех файлов нас интересуют crt-файлы и key.
2.1 Убираем пароль из SSL ключа
root# mv somedomain.com.key somedomain.com.key.orig root# openssl rsa -in somedomain.com.key.orig -out somedomain.com.key
На всякий пожарный мы сделали резервную копию оригинального ключа. Теперь можно приступить к генерации ключей и настройки pound, apache и nginx.
2.1.1 Установка SSL-сертификата для pound
Для pound нам нужно сгенерировать pem ключ, который состоит из промежуточного сертификата, нашего подписанного сертификата и секретного ключа.
root# cat somedomain.com.key f5259a75c35b14bf.crt gd_bundle-g2-g1.crt > somedomain.com.pem
Теперь в настройках pound прописать путь к ключу и сделать рестарт
root# vim /etc/pound/pound.cfg … Cert "/path/to/your/ssl/somedomain.com.pem" … root# /etc/init.d/pound restart
Посмотреть информацию об новом сертификате можно из консоли используя curl, секция Server certificate. К примеру:
root# curl -v https://google.com.ua 2>&1 | grep -A6 'Server certificate' * Server certificate: * subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com.ua * start date: 2014-12-10 12:01:05 GMT * expire date: 2015-03-10 00:00:00 GMT * subjectAltName: google.com.ua matched * issuer: C=US; O=Google Inc; CN=Google Internet Authority G2 * SSL certificate verify ok.
2.1.2 Установка SSL-сертификата для nginx
Для nginx нам нужно сгенерировать crt файлик, который состоит из промежуточного сертификата и нашего подписанного сертификата (из двух файлов, которые били в скаченном архиве).
root# cat f5259a75c35b14bf.crt gd_bundle-g2-g1.crt > somedomain.com.crt
Потом, в конфигурациях виртуального хоста nginx нужно прописать путь к этому файлу и приватному ключу и сделать рестарт nginx.
root# vim /etc/nginx/sites-enabled/somedomain.com … ssl on; ssl_certificate /path/to/your/ssl/somedomain.com.crt; ssl_certificate_key /path/to/your/ssl/somedomain.com.key; … root# /etc/init.d/nginx restart
2.1.3 Установка SSL-сертификата для apache
Для генерации SSL ключа под apache вообще не нужно делать никаких лишних движений, просто прописать пути к приватному ключу, промежуточному и нашему подписанному сертификате в настройках виртуального хоста apache.
root# vim /etc/apache2/sites-enabled/somedomain.com … SSLEngine On SSLCertificateFile /path/to/your/ssl/f5259a75c35b14bf.crt SSLCertificateKeyFile /path/to/your/ssl/somedomain.com.key SSLCertificateChainFile /path/to/your/ssl/gd_bundle-g2-g1.crt … root# /etc/init.d/apache2 restart
2.1.4 Установка SSL-сертификата для IIS
В нашем случаи будет установлен SSL сертификат для IIS 10 – это у нас Microsoft Windows server 2016. IIS немного отличается от всего, когда генерируется csr – автоматически создается секретный ключ. В нашем случаи csr был сгенерирован не на IIS сервере (в принципе, как и наш секретный ключ), а используя инструментом openssl. И чтобы добавить сгенерированный вне IIS-a сертификат, мы можем создать pfx файлик, который держит в себе и сертификат и ключ. Чтобы его сгенерировать нужна всего одна команда.
root# openssl pkcs12 -inkey somedomain.com.key -in f5259a75c35b14bf.crt -export -out somedomain.com.pfx
На этом шаге можно ввести пароль на pfx файл или просто нажать два раза Enter.
Чтобы добавить данный сертификат в IIS 10 нужно просто его экспортировать. Для этого идем в Internet Information Services (IIS) Manager. Выбираем наш сервер. Находим Sever Certificates фичу и дважды на нее кликаем.
Справа сверху видим Действие Import… и кликаем на него. После чего, в новом открывшимся окне вставляем путь к нашему pfx файлику (вводим пароль, если он был назначен), выбираем сторедж сертификатов, ставим галочку Allow this certificate to be exported и жмем ОК.
Осталось только связать сайт с сертификатом. Переходим на Sites, выбираем нужные сайт. Справа сверху в секции Edit Site нажимаем на Bindings… В появившимся окне жмем на кнопку Add… В следующем окне выбираем тип биндинга – https. Прописываем имя хоста и выбираем SSL certificate из списка и жмем ОК.
3. Дополнительная информация
3.1 Дешифровка csr-файлов
Если продлеваете сертификат и забыли, какие данные вводили при генерации csr, можно использовать openssl для просмотра информации о старом сертификате.
root# openssl req -in oldsomedomain.com.csr -noout -text Certificate Request: Data: Version: 0 (0x0) Subject: C=IL, ST=Israel, L=Rehovot, O=Some company Ltd, OU=IT, CN=*.somedomain.com/emailAddress=support@somedomain.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) …
3.2 Генерация CSR
Когда имеется много разных доменов и нужно часто создавать SSL ключи – интерактивный режим становиться выносом мозга и потерянным временем. Openssl позволяет генерировать csr запрос не только в интерактивном режиме. Наведу пару дополнительных способов генерации csr-файла.
3.2.1 Интерактивная (активная) генерация
3.2.1.1 С созданием ключа
Генерация csr-файла и ключа в интерактивном режиме одной командой без запроса на ввод пароля(с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
root# openssl req -nodes -newkey rsa:2048 -keyout site.com.key -out site.com.csr
3.2.1.2 С предварительно созданным ключом
Генерация csr-файла на основе предварительно созданного ключа в интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
root# openssl req -new -key site.com.key -out site.com.csr
3.2.2 Не интерактивная (пассивная) генерация
3.2.2.1 С созданием ключа
Генерация csr-файла и ключа в не интерактивном режиме одной командой без запроса на ввод пароля(с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
root# openssl req -nodes -newkey rsa:2048 -keyout site.com.key -out site.com.csr -subj '/C=IL/ST=Israel/L=Rehovot/O=Some Company Ttd/OU=IT/CN=*.site.com/emailAddress=support@site.com'
3.2.2.2 С предварительно созданным ключом
Генерация csr-файла на основе предварительно созданного ключа в не интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
root# openssl req -new -key site.com.key -out site.com.csr -subj '/C=IL/ST=Israel/L=Rehovot/O=Some Company Ttd/OU=IT/CN=*.site.com/emailAddress=support@site.com'
3.3 Генерация самоподписного сертификата
Когда нужно тестировать SSL для какого-то локального сайта, можно использовать самоподписний сертификат, который позволит вам полноценно тестировать SSL, но будут вылазить сообщения, что сайт является не доверенным (сертификат липовый).
3.3.1 Интерактивная (активная) генерация
3.3.1.1 С созданием ключа
Генерация самоподписного сертификата с приватным ключом в интерактивном режиме, т.е. нужно будет вводит всю csr информацию без запроса на ввод пароля (с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ
root# openssl req -new -newkey rsa:2048 -keyout site.com.key -nodes -x509 -days 365 -out site.com.crt
3.3.1.2 С предварительно созданным ключом
Генерация самоподписного сертификата на основе предварительно созданного ключа в интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
root# openssl req -new -key site.com.key -days 365 -x509 -out site.com.crt
3.3.2 Не интерактивная (пассивная) генерация
3.3.2.1 С созданием ключа
Генерация самоподписного сертификата с приватным ключом в не интерактивном режиме без всяких вопросов и запроса на ввод пароля (с созданием ключа на лету). Если убрать опцию “-nodes”, то нужно будет задать пароль на ключ.
root# openssl req -new -newkey rsa:2048 -days 365 -nodes -x509 -subj "/C=IL/ST=Israel/L=Rehovot/O=Some Company Ttd/OU=IT/CN=*.site.com/emailAddress=support@site.com " -keyout site.com.key -out site.com.crt
3.3.2.2 С предварительно созданным ключом
Генерация самоподписного сертификата на основе предварительно созданного ключа в не интерактивном режиме. Если ключ создавался с паролем, то его нужно будет ввести.
root# openssl req -new -key site.com.key -days 365 -x509 -subj "/C=IL/ST=Israel/L=Rehovot/O=Some Company Ttd/OU=IT/CN=*.site.com/emailAddress=support@site.com " -out site.com.crt
Вот и все.
Пример генерации запроса на сертификат для мультидоменного сертификата:
openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout my.domain.key -out my.domain.req -subj ‘/C=US/ST=Florida/L=Miami/O=My Company/OU=It Dept/CN=my.domain/emailAddress=hostmaster@my.domain/subjectAltName=DNS.1=www.my.domain,DNS.2=anothersubdom.my.domain’
Спасибо.
Было бы неплохо описание создания самоподписной цепочки CA->Immediate->Signed.
На тестовых виртуалках добавляем CA в хранилища доверенных сертификатов и тестируем все, что душе угодно. HTTPS и подписание JARников например.