- Описание
- Поддерживаемые сертификаты
- Инструкция по установке сертификата
- Два доменных имени для локального сайта
- Проверка срока действия сертификата
- Отладка
- Закрытый ключ не подходит к сертификату
- Сертификат установили, но при открытии сайта всё равно ошибка сертификата. Как проверить, на какой домен выдан сертификат?
- Восстановление стандартных настроек
Время выполнения инструкции: до 15 минут начальная настройка, 2-3 минуты последующее обновление сертификата |
Описание
При работе личного кабинета абонента по https, используются автоматически сгенерированные самоподписанные сертификаты. При этом абонент получает в браузере предупреждение об использовании сайтом недоверенного сертификата. Чтобы решить эту проблему, можно приобрести сертификат на используемое вами доменное имя локального сайта у авторизованного центра сертификации и установить его на сервер.
Сертификационные центры чаще всего используют трехуровневую схему подписей. Для подписывания сайта понадобится:
- Публичный сертификат для вашего сайта со встроенным в него публичным ключем;
- Секретный ключ от вашего сертификата;
- Сертификат промежуточного центра сертификации.
С дополнительной информацией по установке сертификатов можно ознакомиться по ссылке https://knowledge.digicert.com/home.html
Сертификаты должны быть в формате PEM.
Сертификат должен быть подписан с помощью алгоритма sha256 с использованием rsa шифрования. Проверить сертификат можно командой:
openssl x509 -text -noout -in ca.crt | grep "Signature Algorithm" | tail -n 1
Signature Algorithm: sha256WithRSAEncryption
Необходимо заказывать ssl сертификаты без пароля. Иначе при каждом перезапуске web сервера придётся вводить пароль. Это создаёт проблемы при обновлении или сервисных работах. Если вы заказали сертификат с паролем, снять его можно командой: openssl rsa -in ca_passwd.key -out ca_no_passwd.key |
Поддерживаемые сертификаты
RU-CENTER
Заказ сертификата RU-CENTER
Если вы хотите заказ свой сертификат для своего домена, то для начала вам нужно сгенерировать запрос на получение сертификата (CSR), подробнее вы можете посмотреть на сайте Руцентра.
По указанной ссылке доступна инструкция "Генерация CSR для Apache", для генерации запроса нужно выполнить шаги из инструкции.
Соответствие имён сертификатов от 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 - не нужен.
RapidSSL
COMODO
Если Вы используете сертификат от COMODO, вероятно Вам пришлют файл с цепочкой корневых сертификатов, или же несколько таких сертификатов в разных файлах.
Если их несколько, просто сохраните их содержимое в едином текстовом файле. В обоих случаях, в httpd.conf вместо переменной SSLCACertificateFile используйте SSLCertificateChainFile, например:
#SSLCACertificateFile /etc/pki/tls/certs/ca_bundle.crt SSLCertificateChainFile /etc/pki/tls/certs/CA.ca-bundle
На всякий случай: Документация Comodo по установке SSL-сертификата в Apache
Let's Encrypt
К сожалению, поддержка CentOS 6 в Certbot от Let's Encrypt прекращена, и установить его на биллинг достаточно проблематично.
Но Вы можете:
и положить вручную на сервер биллинга по инструкции далее.
Инструкция по установке сертификата
После выполния инструкции теряется возможность настраивать личный кабинет из вэб интерфейса по адресу http://<ip биллинга>:8081/settings/asr_cabinet/. Все настроеки личного кабинета нужно будет производить в файле:
/app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf |
- Настройте порты и включите 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']
app['wordpress.sslport']='443' app['wordpress.use_ssl']='1'
- Поменяйте порт Codeigniter на 8443
app['apache.sslport']='8443' app['apache.sslip']='169.254.4.43'
- Перезапустите asr_cabinet:
/app/asr_cabinet/service restart
- Измените порт ssl в переменной app['wordpress.sslport'] на 443 и включите ssl для Wordpress в переменной app['wordpress.use_ssl']
- Внесите изменения в конфигурационный файл Apache:
/app/asr_cabinet/etc/httpd/conf/httpd.conf
- В настройках <VirtualHost *:80> змените RewriteCond %{REQUEST_URI} ^/cabinet. на RewriteCond %{HTTPS} off чтобы HTTPS был включен глобально на сайт, а не только личный кабинет.
Замените RewriteEngine Off на RewriteEngine On, чтобы включить движок редиректов.
Должно получиться приблизительно следующее:
<VirtualHost *:80> DocumentRoot /var/wordpress/ AddDefaultCharset utf-8 <Directory /var/wordpress> Options Indexes FollowSymLinks AllowOverride All </Directory> #Redirect to https! RewriteEngine On #Check for POST Submission RewriteCond %{REQUEST_METHOD} !^POST$ # Forcing HTTPS RewriteCond %{HTTPS} !=on [OR] RewriteCond %{SERVER_PORT} 80 # Pages to Apply.... RewriteCond %{HTTPS} off RewriteRule .* https://%{SERVER_NAME}:443%{REQUEST_URI} [R=301,L] </VirtualHost>
- В настройках <VirtualHost *:443> укажите правильные пути к сертификатам. Должно получиться приблизительно следующее:
<VirtualHost *:443> DocumentRoot /var/wordpress/ AddDefaultCharset utf-8 <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>
SSLCACertificateFile - путь к промежуточному сертификату
SSLCertificateFile - путь к сертификату сайта
SSLCertificateKeyFile - путь к файлу ключа сертификата
- В настройках <VirtualHost *:80> змените RewriteCond %{REQUEST_URI} ^/cabinet. на RewriteCond %{HTTPS} off чтобы HTTPS был включен глобально на сайт, а не только личный кабинет.
- Скопируйте измененный файл конфигурации:
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
- Скопируйте сертификаты в директорию сертификатов:
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/cfg/etc/pki/tls/certs/ca_bundle.crt cp -p /tmp/ca.crt /app/asr_cabinet/etc/pki/tls/certs/ca.crt cp -p /tmp/ca_bundle.crt /app/asr_cabinet/etc/pki/tls/certs/ca_bundle.crt
- Скопируйте ключ для сертификата
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
- Проверка корректности установки сертификата
Для проверки корректности установки сертификата необходимо перезапустить http сервер командойchroot /app/asr_cabinet/ /etc/init.d/httpd restart
Если сертификат установлен корректно, то у Вас отобразится следующее:
Останавливается httpd: [ OK ]
Запускается httpd: [ OK ]
После того, как сервис httpd корректно запустится, необходимо выполнить команду
/app/asr_cabinet/service restart
Если в результате перезапуска все сервисы стартовали со статусом [ OK ], необходимо проверить корректность установки сертификата и переадресации на https при переходе в личный кабинет, например через браузер Firefox.
Используя браузер можно увидеть ошибки сертификата:
- неверный сайт - вероятно, вы обращаетесь на сайт по ip, а сертификат выдан для домена. В комментарии вы увидите всю нужную информацию;
- недоверенный сертификат - вероятно, вы не выгрузили серверный сертификат, либо выгрузили вместо него другой сертификат;
- просроченный сертификат - вышел срок действия сертификата, нужно покупать новый.
Два доменных имени для локального сайта
Иногда для сайта регистрируют два доменных имени. Например в разных зонах example.com и example.org . Для работы обоих доменных имён в личном кабинете нужно настроить виртуальные хосты вэб-сервера. Дополнение к выше приведённой инструкции:
- Откройте конфигурационный файл
/app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf
- Добавье в секцию имени хостов Section 3: Virtual Hosts строчку:
NameVirtualHost *:443
Так выглядит конечный результат:
NameVirtualHost *:8888 NameVirtualHost *:442 NameVirtualHost *:441 NameVirtualHost *:440 NameVirtualHost *:444 NameVirtualHost *:445 NameVirtualHost *:8443 NameVirtualHost *:443
- Добавьте опцию ServerName для первого домена в описание хоста:
<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>
- Продублируйте блок VirtualHost с настройкой ServerName для второго домена:
<VirtualHost *:443> ... ServerName example.com ... </VirtualHost> <VirtualHost *:443> ... ServerName example.org ... </VirtualHost>
- Проведите настройку сертификата для второго домене example.org как указано в разделе Инструкция по установке сертификата.
Нужно учесть, что имена файлов сертификата для второго домена должны отличаться от первого. То есть, примерно так:
<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> <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>
- Перезапустите контейнер личного кабинета для применения настроек:
/app/asr_cabinet/service restart
Проверка срока действия сертификата
Вы можете узнать информацию по сертификату программой openssl. Этой командой можно узнать срок действия сертификата:
openssl x509 -text -noout -in mucert ca.crt | grep -E 'Before|After'
- Before - время начала действия
- After - время окончания действия
Вы так же можете проверить срок действия с помощью команды:
cat /cfg/etc/pki/tls/certs/ca.crt | openssl x509 -noout -enddate
Отладка
Если при запуске httpd отображается сбой, Вы можете попробовать найти причину в логе /app/asr_cabinet/var/log/httpd/error_log.: по типовым ошибкам и как их решать очень много информации в интернете: как правило, это ошибки синтаксиса в файлах конфигурации (не хватает каких-то символов, лишние символы, "директивы" не на своём месте и тд).
Закрытый ключ не подходит к сертификату
Проверьте соответствие сертификата и его ключа консольными команда. Для этого необходимо вычислить md5 хэш модуля каждого файла. Равенство хэша означает соответствие private key и сертификата
- Зайдите в контейнер:
chroot /app/asr_cabinet/
- Проверьте контрольную сумму файла сертификата
openssl rsa -modulus -noout -in /etc/pki/tls/private/ca.key | openssl md5
- Проверьте контрольную сумму закрытого ключа
openssl x509 -modulus -noout -in /cfg/etc/pki/tls/certs/ca.crt | openssl md5
Если в выводе будут разные значения: значит, ошибка в этом.
Как исправить
- Положите на сервере правильную пару сертификата и закрытого ключа
- Перезапустите веб-сервер:
chroot /app/asr_cabinet/ service httpd restart
Сертификат установили, но при открытии сайта всё равно ошибка сертификата. Как проверить, на какой домен выдан сертификат?
Зайдите на сервер по SSH и выполните проверку утилитой curl:
* subject: CN=10.90.185.127,OU=Fiscal secure web server,O=Carbon_Billing
В примере выше сертификат самоподписной, это видно по тексту CN=10.90.185.127: CN означает "Common Name", то есть домен для которого сертификат выдан. Тут должен быть Ваш домен.
Например, если сайт и ЛК должны быть доступны по адресу example.com, вывод команды должен быть примерно следующим:
* subject: CN=example.com
Как исправить
- Купите сертификат на Ваш домен или создайте бесплатный с помощью Let's Encrypt (на другом сервере).
- Настройте сервер по инструкции выше
Восстановление стандартных настроек
- Сохраните конфигурационный файл
mv /app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf /root/
- Перезапустите контейнер личного кабинета
/app/asr_cabinet/service restart