Установка SSL-сертификата на локальный сайт

Ключ
Эта строка удалена.
Это слово было удалено. Это слово было добавлено.
Эта строка добавлена.

Изменения (87)

просмотр истории страницы
{toc:maxLevel=3}

h3. Введение
{tip}*Время выполнения инструкции*: до 15 минут начальная настройка, 2-3 минуты последующее обновление сертификата{tip}

h2. Введение

При работе личного кабинета абонента по https, используются автоматически сгенерированные самоподписанные сертификаты.

Получите нужные файлы у центра сертификации и по scp скопируйте их на сервер, например в директорию /tmp.

h3. Поддерживаемые сертификаты
С дополнительной информацией по установке сертификатов можно ознакомиться по ссылке [https://knowledge.digicert.com/home.html]

# Ru Center
# RapidSSL
{warning:title=Warning}
Необходимо создавать или заказывать ssl сертификаты без пароля. Иначе при перезапуске web сервера придётся каждый раз вводить пароль. Это создаёт проблемы при обновлении и подобных операциях.
{warning}

h3. Соответствие имён сертификатов от RU CENTER
h2. Поддерживаемые сертификаты

h3. RU-CENTER

*Имена файлов могут отличаться. Например при использовании сертификатов от Thawte (в качестве посредника может быть RU CENTER), вы получите набор:*
[https://www.nic.ru]

* root_cert_sslwebserver.crt \- соответствует *ca_bundle.crt*;
h4. Заказ сертификата RU-CENTER

Если вы хотите заказ свой сертификат для своего домена, то для начала вам нужно сгенерировать запрос на получение сертификата (CSR), подробнее вы можете посмотреть на [сайте Руцентра|http://www.nic.ru/dns/service/ssl/csr.html].

По указанной ссылке доступна инструкция "Генерация CSR для Apache", для генерации запроса нужно выполнить шаги из инструкции.

h4. Соответствие имён сертификатов от RU-CENTER

*Имена файлов могут отличаться. Например при использовании сертификатов от Thawte (в качестве посредника может быть RU-CENTER), вы получите набор:*

* root_cert_sslwebserver.crt \- соответствует *ca_bundle.crt*;
* domain_name_date.crt - соответствует *ca.crt* в команде ниже;
* private.key \- обычно \- обычно зашифрован и запаролен, соответствует *ca.key* в команде ниже;
* domain.name.csr - не нужен.

h3. Инструкция по установке сертификата
h3. RapidSSL

1. Внесите изменения в файл:
[https://www.rapidssl.com]

h3. COMODO

[https://ssl.comodo.com]

Если Вы используете сертификат от COMODO, вероятно Вам пришлют файл с цепочкой корневых сертификатов, или же несколько таких сертификатов в разных файлах.
Если их несколько, просто сохраните их содержимое в едином текстовом файле. В обоих случаях, в httpd.conf вместо переменной SSLCACertificateFile используйте SSLCertificateChainFile, например:
{code}#SSLCACertificateFile /etc/pki/tls/certs/ca_bundle.crt
SSLCertificateChainFile /etc/pki/tls/certs/CA.ca-bundle{code}

На всякий случай: [Документация Comodo по установке SSL-сертификата в Apache|https://support.comodo.com/index.php?/comodo/Knowledgebase/Article/View/637/66/]

h3. Let's Encrypt

[https://letsencrypt.org]

К сожалению, поддержка CentOS 6 в Certbot от Let's Encrypt прекращена, и установить его на биллинг достаточно проблематично.

Но Вы можете:
* [cоздать сертификат вручную на стороннем сервере|https://certbot.eff.org/docs/using.html#manual]
* [или онлайн|https://www.sslforfree.com]

и положить вручную на сервер биллинга по инструкции далее.

h2. Инструкция по установке сертификата

# Настройте порты и включите SSL в конфигурационном файле /app/asr_cabinet/cfg/config
По-умолчанию порт 443 занят Codeigniter (старый ЛК), а ssl для Wordpress находится на порту 8443. Необходимо поменять порты местами, включить SSL для Wordpress, после чего перезапустить контейнер чтобы корректно сформировались правила *iptables*
#* Измените порт ssl в переменной *app\['wordpress.sslport'\]* на 443 и включите ssl для Wordpress в переменной *app\['wordpress.use_ssl'\]* \\ \\
{code}app['wordpress.sslport']='443'
app['wordpress.use_ssl']='1'{code}
#* Поменяйте порт Codeigniter на 8443 \\ \\
{code}app['apache.sslport']='8443'
app['apache.sslip']='169.254.4.43'
{code}
#* Перезапустите *asr_cabinet*: \\ \\
{code}/app/asr_cabinet/service restart{code}
# Внесите изменения в конфигурационный файл Apache:
*/app/asr_cabinet/etc/httpd/conf/httpd.conf*
#* В настройках *<VirtualHost \*:80>* змените *RewriteCond %\{REQUEST_URI\} ^/cabinet.* на *RewriteCond %\{HTTPS\} off* чтобы HTTPS был включен глобально на сайт, а не только личный кабинет.
Замените *RewriteEngine Off* на *RewriteEngine On*, чтобы включить движок редиректов.
Должно получиться приблизительно следующее: \\ \\
{code:lang=xml}<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
DocumentRoot /var/wordpress/
AddDefaultCharset utf-8
</Directory>
#Redirect to https!
RewriteEngine Off On
#Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$
RewriteCond %{SERVER_PORT} 80
# Pages to Apply....
RewriteCond %{REQUEST_URI} ^/cabinet.* %{HTTPS} off
RewriteRule .* https://%{SERVER_NAME}:443%{REQUEST_URI} [R=301,L]
Redirect permanent / https://test.ru/
</VirtualHost>{code}


#* В настройках *<VirtualHost \*:443>* укажите правильные пути к сертификатам. Должно получиться приблизительно следующее: \\ \\
{code}<VirtualHost *:443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.<-
DocumentRoot /var/wordpress/
AddDefaultCharset utf-8
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCACertificateFile /etc/pki/tls/certs/ca_bundle.crt
SSLCertificateFile /etc/pki/tls/certs/ca.crt
#SSLVerifyClient require
# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
</VirtualHost>{code}


{code}


*Redirect permanent* \- значение задающее обязательную переадресацию на https версию сайта


*SSLCACertificateFile* \- путь к промежуточному сертификату


*SSLCertificateFile* \- путь к сертификату сайтуа


*SSLCertificateKeyFile* \- путь к файлу ключа сертификата \\ \\

{info}Рекомендуем изменить порт ssl в переменной app\['wordpress.sslport'\]='<номер порта>' на 443 в конфигурационном файле /app/asr_cabinet/cfg/config {info}
# Скопируйте измененный файл конфигурации:
{code}
app['wordpress.sslport']='443'
app['wordpress.use_ssl']='1'
app['wordpress.use_ssl.widget']='checkbox "Включить HTTPS в ЛК" "Включить HTTPS в ЛК"'

app['fiscal.ip']='169.254.14.44'
app['fiscal.port']='1444'

app['apache.port.widget']='readonly "Порт, на котором доступен локальный сайт" "Только для чтения"'

app['apache.sslip']='169.254.4.43'
app['apache.sslport']='8443'
app['apache.sslport.widget']='readonly "Порт, на котором доступен веб-интерфейс абонента" "Только для чтения"'
{code}

2. Скопируйте измененный файл конфигурации:

{code}
mkdir -p /app/asr_cabinet/cfg/etc/httpd/conf/
cp -p /app/asr_cabinet/etc/httpd/conf/httpd.conf /app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf
{code}

{warning}После этого изменения в настройках личного кабинета по адресу <ip биллинга>:8081/settings/asr_cabinet/ не будут менять настройки веб-сервера{warning}

3. # Скопируйте сертификаты в директорию сертификатов:
{code}
mkdir -p /app/asr_cabinet/cfg/etc/pki/tls/certs
mkdir -p /app/asr_cabinet/etc/pki/tls/certs
cp -p /tmp/ca.crt /app/asr_cabinet/cfg/etc/pki/tls/certs/ca.crt
cp -p /tmp/ca_bundle.crt /app/asr_cabinet/etc/pki/tls/certs/ca_bundle.crt
{code}
# Скопируйте ключ для сертификата
{code}
mkdir -p /app/asr_cabinet/etc/pki/tls/private
mkdir -p /app/asr_cabinet/cfg/etc/pki/tls/private
cp -p /tmp/ca.key /app/asr_cabinet/cfg/etc/pki/tls/private/ca.key
cp -p /tmp/ca.key /app/asr_cabinet/etc/pki/tls/private/ca.key
{code}
# Проверка корректности установки сертификата
Для проверки корректности установки сертификата необходимо перезапустить http сервер командой
{code}chroot /app/asr_cabinet/
/etc/init.d/httpd restart
{code}
Если сертификат установлен корректно, то у Вас отобразится следующее:
{panel}Останавливается httpd: \[ OK \]
Запускается httpd: \[ OK \]{panel}


4. Скопируйте ключ для сертификата
После того, как сервис *httpd* корректно запустится, необходимо выполнить команду

{code}/app/asr_cabinet/service restart{code}
Если в результате перезапуска все сервисы стартовали со статусом \[ OK \], необходимо проверить корректность установки сертификата и переадресации на https при переходе в личный кабинет, например через браузер Firefox.

Используя браузер можно увидеть ошибки сертификата:
* *неверный сайт* \- вероятно, вы обращаетесь на сайт по ip, а сертификат выдан для домена. В комментарии вы увидите всю нужную информацию; \\ \\
* *недоверенный сертификат* \- вероятно, вы не выгрузили серверный сертификат, либо выгрузили вместо него другой сертификат; \\ \\
* *просроченный сертификат* \- вышел срок действия сертификата, нужно покупать новый.

h2. Два доменных имени для локального сайта

Иногда для сайта регистрируют два доменных имени. Например в разных зонах example.com и example.org . Для работы обоих доменных имён в личном кабинете нужно настроить виртуальные хосты вэб-сервера. Дополнение к выше приведённой инструкции:

# Откройте конфигурационный файл
{code}
# mkdir app/asr_cabinet/etc/pki/tls/private
# mkdir app/asr_cabinet/cfg/etc/pki/tls/private
# cp -p /tmp/ca.key app/asr_cabinet/cfg/etc/pki/tls/private/ca.key
# cp -p /tmp/ca.key app/asr_cabinet/etc/pki/tls/private/ca.key
/app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf
{code}
# Добавье в секцию имени хостов *Section 3: Virtual Hosts* строчку:
{code}
NameVirtualHost *:443
{code}
Так выглядит конечный результат:
{code}
NameVirtualHost *:8888
NameVirtualHost *:442
NameVirtualHost *:441
NameVirtualHost *:440
NameVirtualHost *:444
NameVirtualHost *:445
NameVirtualHost *:8443
NameVirtualHost *:443
{code}
# Добавьте опцию *ServerName* для первого домена в описание хоста:
{code}
<VirtualHost *:443>
DocumentRoot /var/wordpress/
AddDefaultCharset utf-8
ServerName example.com
<Directory /var/wordpress>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCACertificateFile /etc/pki/tls/certs/ca_bundle.crt
SSLCertificateFile /etc/pki/tls/certs/ca.crt
#SSLVerifyClient require
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
</VirtualHost>
{code}
# Продублируйте блок *VirtualHost* с настройкой *ServerName* для второго домена:
{code}
<VirtualHost *:443>
...
ServerName example.com
...
</VirtualHost>

h4. Проверка корректности установки сертификата
<VirtualHost *:443>
...
ServerName example.org
...
</VirtualHost>
{code}
# Проведите настройку сертификата для второго домене example.org как указано в разделе [Инструкция по установке сертификата|Установка SSL-сертификата на локальный сайт#Инструкция по установке сертификата].
{note}
Нужно учесть, что имена файлов сертификата для второго домена должны отличаться от первого.
{note}
То есть, примерно так:
{code}
<VirtualHost *:443>
...
ServerName example.com
...
SSLCertificateFile /etc/pki/tls/certs/ca_example_COM.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca_example_COM.key
SSLCACertificateFile /etc/pki/tls/certs/ca_bundle_COM.crt
...
</VirtualHost>

Для проверки корректности установки сертификата необходимо перезапустить http сервер командой
{code}chroot /app/asr_cabinet/
/etc/init.d/httpd restart
<VirtualHost *:443>
...
ServerName example.org
...
SSLCertificateFile /etc/pki/tls/certs/ca_example_ORG.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca_example_ORG.key
SSLCACertificateFile /etc/pki/tls/certs/ca_bundle_ORG.crt
...
</VirtualHost>
{code}
# Перезапустите контейнер личного кабинета для применения настроек:
{code}
/app/asr_cabinet/service restart
{code}

Если сертификат установлен корректно, то у Вас отобразится следующее:
h2. Проверка срока действия сертификата

Вы можете узнать информацию по сертификату программой *openssl*. Этой командой можно узнать срок действия сертификата:

Останавливается httpd:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \[&nbsp; OK&nbsp; \]
Запускается httpd:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; \[&nbsp; OK&nbsp; \]
{code}openssl x509 -text -noout -in mucert ca.crt | grep -E 'Before|After'{code}

В том случае, если при запуске *httpd* отображается сбой, то необходимо проверить лог ошибок, который находится в */app/asr_cabinet/var/log/httpd/error_log.*
* *Before* - время начала действия
* *After* - время окончания действия

После того, как сервис *httpd* корректно запустится, необходимо выполнить команду
Вы так же можете проверить срок действия с помощью команды:
{code}
cat /cfg/etc/pki/tls/certs/ca.crt | openssl x509 -noout -enddate
{code}

*/app/asr_cabinet/service restart*
h2. Отладка

Если в результате перезапуска все сервисы стартовали со статусом \[&nbsp; OK&nbsp; \], необходимо проверить корректность установки сертификата и переадресации на https при переходе в личный кабинет, например через браузер Firefox.
Если при запуске *httpd* отображается сбой, Вы можете попробовать найти причину в логе */app/asr_cabinet/var/log/httpd/error_log.*: по типовым ошибкам и как их решать очень много информации в интернете: как правило, это ошибки синтаксиса в файлах конфигурации (не хватает каких-то символов, лишние символы, "директивы" не на своём месте и тд).

Используя браузер можно увидеть ошибки сертификата:
h3. Закрытый ключ не подходит к сертификату

* *неверный сайт* \- вероятно, вы обращаетесь на сайт по ip, а сертификат выдан для домена. В комментарии вы увидите всю нужную информацию;
Проверьте соответствие сертификата и его ключа консольными команда. Для этого необходимо вычислить md5 хэш модуля каждого файла. Равенство хэша означает соответствие private key и сертификата

* *недоверенный сертификат* \- вероятно, вы не выгрузили серверный сертификат, либо выгрузили вместо него другой сертификат;
# Зайдите в контейнер: {code}chroot /app/asr_cabinet/{code}
# Проверьте контрольную сумму файла сертификата
{code}openssl rsa -modulus -noout -in /etc/pki/tls/private/ca.key | openssl md5{code}
# Проверьте контрольную сумму закрытого ключа
{code}openssl x509 -modulus -noout -in /cfg/etc/pki/tls/certs/ca.crt | openssl md5{code}

* *просроченный сертификат* \- вышел срок действия сертификата, нужно покупать новый.
Если в выводе будут разные значения: значит, ошибка в этом.

h3. Заказ сертификата RUcenter
h4. Как исправить

Если вы хотите заказ свой сертификат для своего домена, то для начала вам нужно сгенерировать запрос на получение сертификата (CSR), подробнее вы можете посмотреть на [сайте Руцентра|http://www.nic.ru/dns/service/ssl/csr.html].
# Положите на сервере правильную пару сертификата и закрытого ключа
# Перезапустите веб-сервер:
{code}chroot /app/asr_cabinet/ service httpd restart{code}

По указанной ссылке доступна инструкция "Генерация CSR для Apache", для генерации запроса нужно выполнить шаги из инструкции.
h3. Сертификат установили, но при открытии сайта всё равно ошибка сертификата. Как проверить, на какой домен выдан сертификат?

Зайдите на сервер по SSH и выполните проверку утилитой curl:
{code:title=grep subject <(curl -ssvvkI https://169.254.0.80:443 2>&1)}
* subject: CN=10.90.185.127,OU=Fiscal secure web server,O=Carbon_Billing
{code}
В примере выше сертификат самоподписной, это видно по тексту *CN=10.90.185.127*: CN означает "Common Name", то есть домен для которого сертификат выдан. Тут должен быть Ваш домен.
Например, если сайт и ЛК должны быть доступны по адресу *example.com*, вывод команды должен быть примерно следующим:
{code}
* subject: CN=example.com
{code}

h4. Как исправить

# Купите сертификат на Ваш домен или создайте бесплатный с помощью Let's Encrypt (на другом сервере).
# Настройте сервер по инструкции выше

h2. Восстановление стандартных настроек

# Сохраните конфигурационный файл
{code}
mv /app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf /root/
{code}
# Перезапустите контейнер личного кабинета
{code}
/app/asr_cabinet/service restart
{code}