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

Skip to end of metadata
Go to start of metadata
Время выполнения инструкции: до 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

https://www.nic.ru

Заказ сертификата 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

https://www.rapidssl.com

COMODO

https://ssl.comodo.com

Если Вы используете сертификат от 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

https://letsencrypt.org

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

Но Вы можете:

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

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

После выполния инструкции теряется возможность настраивать личный кабинет из вэб интерфейса по адресу http://<ip биллинга>:8081/settings/asr_cabinet/. Все настроеки личного кабинета нужно будет производить в файле:
/app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf
  1. Настройте порты и включите 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
  2. Внесите изменения в конфигурационный файл 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 - путь к файлу ключа сертификата

  3. Скопируйте измененный файл конфигурации:
    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
    
  4. Скопируйте сертификаты в директорию сертификатов:
    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
    
  5. Скопируйте ключ для сертификата
    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
    
  6. Проверка корректности установки сертификата
    Для проверки корректности установки сертификата необходимо перезапустить 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 . Для работы обоих доменных имён в личном кабинете нужно настроить виртуальные хосты вэб-сервера. Дополнение к выше приведённой инструкции:

  1. Откройте конфигурационный файл
    /app/asr_cabinet/cfg/etc/httpd/conf/httpd.conf
    
  2. Добавье в секцию имени хостов Section 3: Virtual Hosts строчку:
    NameVirtualHost *:443
    

    Так выглядит конечный результат:

    NameVirtualHost *:8888
    NameVirtualHost *:442
    NameVirtualHost *:441
    NameVirtualHost *:440
    NameVirtualHost *:444
    NameVirtualHost *:445
    NameVirtualHost *:8443
    NameVirtualHost *:443
    
  3. Добавьте опцию 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>
    
  4. Продублируйте блок VirtualHost с настройкой ServerName для второго домена:
    <VirtualHost *:443>
    ...
         ServerName example.com
    ...
    </VirtualHost>
    
    <VirtualHost *:443>
    ...
         ServerName example.org
    ...
    </VirtualHost>
    
  5. Проведите настройку сертификата для второго домене 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>
    
  6. Перезапустите контейнер личного кабинета для применения настроек:
    /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 и сертификата

  1. Зайдите в контейнер:
    chroot /app/asr_cabinet/
  2. Проверьте контрольную сумму файла сертификата
    openssl rsa -modulus -noout -in /etc/pki/tls/private/ca.key | openssl md5
  3. Проверьте контрольную сумму закрытого ключа
    openssl x509 -modulus -noout -in /cfg/etc/pki/tls/certs/ca.crt | openssl md5

Если в выводе будут разные значения: значит, ошибка в этом.

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

  1. Положите на сервере правильную пару сертификата и закрытого ключа
  2. Перезапустите веб-сервер:
    chroot /app/asr_cabinet/ service httpd restart

Сертификат установили, но при открытии сайта всё равно ошибка сертификата. Как проверить, на какой домен выдан сертификат?

Зайдите на сервер по SSH и выполните проверку утилитой curl:

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

В примере выше сертификат самоподписной, это видно по тексту CN=10.90.185.127: CN означает "Common Name", то есть домен для которого сертификат выдан. Тут должен быть Ваш домен.
Например, если сайт и ЛК должны быть доступны по адресу example.com, вывод команды должен быть примерно следующим:

* 	subject: CN=example.com

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

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

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

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

Метки

Введите метки, чтобы добавить к этой странице:
Please wait 
Ищите метку? просто начните печатать.