HTTPS, SSL сертификаты и форматы сертификатов

Google заявил что использование https на сайтах будет восприниматься как положительный фактор для ранжирования и даже ходят слухи что сайты без https будут помечаться в Google Chrome как не надежные. Информация о https и ssl на данный момент очень актуальна. В этой записи как раз пойдет речь на эту тему -  в ней описана общая информация о SSL сертификатах, их видах, форматах и способах конвертации.

P.S.: сам пока на https еще не перешел, подготавливаюсь и собираю информацию.

CSR Запрос SSL сертификата

При покупке SSL сертификата при помощи специальных утилит или сервисов генерируется CSR запрос (Certificate Signing Request) в котором закодированы следующие данные:

  • Common Name: elims.org.ua — доменное имя, защищаемое сертификатом
  • Organization: elimS — компания-владелец домена
  • Organization Unit: IT — департамент\отдел компании
  • Locality: Kiev — город
  • State: Kiev — область
  • Country: UA — двухбуквенный код страны
  • Email: admin@elims.org.ua — почтовый ящик

При генерации запроса получаем две части: публичную, которую нужно сообщить тому, кто генерирует нам сертификат (центру сертификации) и приватную, которую нужно будет прописать на сервере, где будет находиться ваш сайт с ssl-сертификатом.

Ниже пример публичной части такого CSR запроса, в котором закодированы указанные выше данные:

-----BEGIN CERTIFICATE REQUEST-----
MIICyDCCAbACAQAwgYIxCzAJBgNVBAYTAlVBMQ0wCwYDVQQIDARLaWV2MQ0wCwYD
VQQHDARLaWV2MQ4wDAYDVQQKDAVlbGltUzELMAkGA1UECwwCSVQxFTATBgNVBAMM
DGVsaW1zLm9yZy51YTEhMB8GCSqGSIb3DQEJARYSYWRtaW5AZWxpbXMub3JnLnVh
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvcvusWoQJ+iVE9Z8bD6F
k00/GMiwLNi+mR0EJwp2TGybVgUnydlK2FV8o0091ZuGrkniwnoimX+8N4ATzem1
jMeXlScqmLdWL2R6DnUTWHiIWezAmyIO51gBiMJ0E+jbfnauog2rNXTgGZbzJRvR
7y8hnL10DYtCfbCObxERynJWzxBFmK0qm8NREMMTa1dZGgmT7e9+afLMaKYqLlcM
DGQNvIQyehI4g8aQwS2OJ7JuTcTXMusWjSQFIMeleg8nkuWJZ6awtTN6Rubh/VHI
XO7LC4zdo8xzo8ub4calLSwi5Flr5iZUyzYxrqj2raBQ9pH1nCCyczlkH6I1HaHq
nwIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAG2HoDX4zfmk331tp+VCEIpGooUt
1EgwGLf73SD7x7ZH6K0fe44cKECmc//Gdvr3UObckYw/aMgR88eGmWnpkjhGz0kX
IfCqpK5zkoaBihofbs1G8+liuocvnMtKCphH/56GPAxPG/K7breJMGiaEkAq0Axn
ozbvvSBbzILdV7xygSib6D20rvdsNOh7fKzo0bSgBhizuQ4/c0uPCTRzFrOvVVNW
mY1NPF4IkurN2iEhbrGlJbKTki+SNh8oRrLyXDzqJE8QcZHKnO69JECGMTjhCDGI
Kr/rxRB/p7qmlCUqhlVS2A6NhicKvAs+s9gE8BZE4uKXtp5vaOXxlJofpC0=
-----END CERTIFICATE REQUEST-----

Этот код можно раскодировать и посмотреть что в нем зашифровано, например при помощи этих сервисов:

  • sslshopper.com/csr-decoder.html
  • certlogik.com/decoder

Или утилиты openssl и команды:

openssl req -in mycsr.csr -noout -text

После того как центр сертификации убедится в правильности переданных данных (в CSR запросе) Вам будет выдан SSL сертификат. Время проверки зависит от типа сертификата. Сертификаты подтверждающие только доменное имя (самые дешевые сертификаты) выдаются в автоматическом режиме, так как в них не нужно проверять существует ли указанная компания, ее контакты тд. и тп.

Типы SSL сертификатов по проверке

  • Подтверждающие доменное имя (Domain Validation — DV) - выпускаются в автоматическом режиме. Проверка проходит через отправку письма с ссылкой (по которой нужно пройти) или кодом (который нужно где-то ввести). Письмо отправляется по выбору либо на почтовый ящик, который указан во whois-домена, либо на один из ящиков домена, для которого создается сертификат:  admin@, administrator@, hostmaster@, postmaster@, webmaster@.
  • Подтверждающие домен и компанию (Organization Validation — OV) - не для частных лиц. Срок выдачи от 3 до 10 дней. Центр сертификации проверяет действительно ли существует указанная компания, принадлежит ли ей домен и правильны ли указаны контакты этой компании.
  • С расширенной проверкой (Extendet Validation — EV) - самые дорогие сертификаты. Они отличаются от других тем, что в адресной строке написано название компании на зеленом фоне.

Типы SSL сертификатов по свойствам

  • Обычные SSL сертификаты - сертификаты которые подтверждают домен и выпускаются автоматически
  • SGC сертификаты - сертификаты с поддержкой повышения уровня шифрования, актуальны только для старых браузеров, которые по умолчанию поддерживали 40 или 56 битное шифрование.
  • Wildcard сертификаты - сертификаты которые можно установить не только на основной домен, но и на поддомены.
  • SAN сертификаты - сертификат который можно установить сразу на несколько разных доменов, их количество и имена заранее оговариваются.
  • EV сертификаты - сертификаты с расширенной проверкой и названием компании на зеленом фоне в адресной строке.
  • Сертификаты c поддержкой IDN - интернационализованные доменные имена, то есть домена в имени которых есть, например, кириллические символы.

Центры сертификации

Центр сертификации - организация имеющая право выдавать ssl-сертификаты, она проверяет данные, которые присылаются в CSR запросе.

Наиболее популярные центры сертификации:

  • Comodo — работает с 1998. Jersey City, New Jersey, США.
  • Symantec — бывший Verisign в состав которого входит и Geotrust. Купил всех в 2010 году.
    • Geotrust — основан в 2001, в 2006 продан Verisign. Mountain View, California, США
    • Thawte — основан в 1995, продан Verisign в 1999.
  • Trustwave — работает с 1995. Chicago, Illinois, США.

Центры сертификации между собой отличаются ценой самого сертификата и тем, в скольких браузерах предустановленны их корневые сертификаты, а значит купленный сертификат не будет подсвечиваться красным, будет зеленый, то есть доверенный. Какие центры сертификации доверенные именно в вашем браузере можно посмотреть в настройках браузера касающихся https и ssl, во вкладках "доверенные центры сертификации" и "промежуточные центры сертификации". Стоит учитывать что корневые сертификаты центров сертификации также имеют свой срок "действия". Если у Вас старый не обновляемый браузер - то в нем скорее всего предустановленны уже устаревшие корневые сертификаты - повод устанавливать более новые версии браузеров.

Сертификаты перечисленных выше центров сертификации считаются доверенными в 99.99% браузеров. Покупать сертификаты значительно дешевле у партнеров центров сертификации, а не напрямую.

Форматы SSL сертификатов

Различные платформы и устройства требуют SSL сертификаты в различных форматах, например, сервер Windows использует PFX файлы в то время как Apache сервер использует индивидуальный PEM (.crt .cer) файлы. Ниже информация о форматах сертификатов и как преобразовать SSL сертификаты из одного формата в другой.

  • PEM - популярный среди сертификационных центров, имеют расширение .pem, .crt, .cer, и .key. Файлы закодированы в Base64 и обязательно начинаются со строки "----- BEGIN CERTIFICATE -----", заканчиваются строкой "----- END CERTIFICATE -----". Apache и аналогичные серверы используют сертификаты в PEM формате.
  • DER - бинарная форма сертификата в формате PEM. Иногда имеет расширение файла .der но чаще .cer. DER обычно используется в платформах Java.
  • PKCS # 7 / P7B - файлы PKCS # 7 или P7B закодированные Base64, начинаются со строки "----- BEGIN PKCS7 ------" и заканчиваются строкой "----- END PKCS7 -----". P7B файлы содержат только сертификат и промежуточные сертификаты, частный ключ используется как отдельный файл. Платформы поддерживающие P7B файлы: Microsoft Windows и Java Tomcat.
  • PKCS # 12/PFX - бинарная форма, в одном файле хранится сертификат сервера, промежуточные сертификаты и закрытый ключ. PFX файлы обычно имеют расширения .pfx и .p12. Как правило, используется в Windows для импорта и экспорта сертификатов и закрытых ключей. При конвертации PFX-формата в PEM-формат необходимо открыть файл в текстовом редакторе и скопировать каждый сертификат и закрытый ключ (включая BEGIN / END включение) в свои отдельные текстовые файлы, сохранить их как certificate.cer, CACert.cer, и privateKey.key.

OpenSSL команды для конвертации форматов SSL сертификатов

  • PEM --> DER
    openssl x509 -outform der -in certificate.pem -out certificate.der
  • PEM --> P7B
    openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
  • PEM --> PFX
    openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
  • DER --> PEM
    openssl x509 -inform der -in certificate.cer -out certificate.pem
  • P7B --> PEM
    openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
  • P7B --> PFX
    openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
    openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
  • PFX --> PEM
    openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

SEO и SSL

  • Google заявлял о том, что присутствие https на сайте является положительным фактором для ранжирования. То есть из двух абсолютно одинаковых сайтов, в поисковой выдаче выше будет тот, который с https
  • Если некоторые части сайта мигрировали в HTTPS, а некоторые - нет, то позитивный сигнал к ранжированию получат только страницы с https в URL-адресах.
  • Есть слухи что Google Chrome будет помечать сайты без https как не надежные.
  • Необходимо использовать 2048-разрядные ключи для всех сертификатов.
  • Используйте относительные URL адреса, это облегчит переход с http на https
  • Для перехода с http на https можно использовать редирект в файле htaccess
  • Убедитесь что в теге rel="canonical" используются ссылки с http, а не https
  • Убедитесь что в индексе поисковиков не присутствуют одновременно и http и htpps версии одной страницы - это может восприниматься как дублированный контент
  • CSS, JS, изображения и прочие файлы также должны использовать https

Переход на HTTPS, SSL

Если у Вас WordPress, то рекомендую прочесть статью "WordPress: переход на https" - в ней этот вопрос подробно рассматривается.

Указать канонические url через https.

Изменить все внутренние ссылки с http на https: Это тоже можно сделать через запрос в базе данных

Настроить 301-ю переадресацию с http-версии на https-версию через .htaccess:

Вариантов кодов редиректа с http на https существует большое количество, для примера приведу два из них:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R,L]
</IfModule>

Или еще один код:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursite.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.yoursite.com [NC]
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [L,R=301,NC]
</IfModule>

Не всегда такая переадресация работает, у меня например выбивало ошибку "ERR_TOO_MANY_REDIRECTS", то есть происходило зацикливание.

В этом случае может помочь 301 редирект через php-код:

<?php
 if ( !$_SERVER['HTTPS'] ) {
  $host = $_SERVER['HTTP_HOST'];
  $request_uri = $_SERVER['REQUEST_URI'];
  $good_url = "https://" . $host . $request_uri;
  header( "HTTP/1.1 301 Moved Permanently" );
  header( "Location: $good_url" );
  exit;
 }
?>

Полезная информация

Получить сертификат Active Directory можно при помощи ввода команды на контролере домена:

certutil -ca.cert cacert.bin

Генерация приватного 2048-битного ключа при помощи openssl:

openssl genrsa -out privat.key 2048

Пример config-файла утилиты OpenSSL для генерации SAN сертификата:

[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = UA
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Kiev
localityName = Locality Name (eg, city)
localityName_default = Kiev
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = IT
commonName = Common Name
commonName_max = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.domain.com.ua
DNS.2 = server.domain2.com.ua
DNS.3 = server
IP.1 = 192.168.1.1
IP.2 = 192.168.2.2

Команда для генерации CSR запроса через OpenSSL

openssl req -new -out request.csr -key privat.key -config config.cfg

Не доверенный сертификат сайта для браузера в android

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

Связано это с тем, что браузеры на компьютерах при проверке сертификата умеют проходить весь "путь сертификации": от сертификата сайта, до корневого сертификата, проверяя кем подписан сертификат каждого промежуточного узла. В android устройствах браузеры проверяют лишь кто подписал сертификат сайта и если они не увидят корневой сертификат доверенного центра сертификации, то будут считать такой сертификат не доверенным.

При установке ssl сертификата на сайт укажите не только свой сертификат, но и сертификаты всех промежуточных центров сертификации включая с корневым сертификатом центра сертификации.

Например в настройках хостинга "Украина", в поле где указывается SSL-сертификат моего сайта я прописал:

-----BEGIN CERTIFICATE-----
Тут сертификат для elims.org.ua
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Тут сертификат промежуточного центра сертификации - Comodo RSA Domain Validation Secure Server CA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
Тут корневой сертификат центра сертификации - COMODO RSA Certification Authority
-----END CERTIFICATE-----

Как проверить соответствие SSL сертификата и CSR к приватному ключу

Нужно преобразовать приватный ключ, SSL сертификата и CSR в md5 хэши:

Вывести md5 хэш модуля SSL сертификата :

$ openssl x509 -noout -modulus -in CERTIFICATE.crt | openssl md5

Вывести md5 хэш модуля приватного ключа :

$ openssl rsa -noout -modulus -in PRIVATEKEY.key | openssl md5

Вывести md5 хэш модуля CSR :

$ openssl req -noout -modulus -in CSR.csr | openssl md5

Если полученные md5 хэши одинаковы, значит файлы (сертификат, приватный ключ и CSR) соответствую друг другу.

Полезные ссылки:

Понравилось? =) Поделись с друзьями:

Обсуждение записи “HTTPS, SSL сертификаты и форматы сертификатов”

  1. Architect says:

    Владельцам онлайн-бизнеса пора побеспокоиться, поскольку с 2017 в Chrome сайты, которые принимают карты или пароли (читай: практически все сайты сети), будут выдавать предупреждение, если не установлен SSL-сертификат. Времени не так много осталось, чтобы осуществить переход.

  2. Петр says:

    Здравствуйте, Владимир.
    Хочу перевести свои сайты на https. Какие нюансы с приобритением Сертификата Wildcard (которые выдаются на все поддомены одного домена) и на что нужно обратить внимание. Для того чтобы писало в строке так как у вас (зеленым цветом Надежный) нужно выбирать сертификат с подтверждением организации, как тут поступать если у меня нет зарегистрированной организации?

  3. Владимир Демянович (elims.org.ua) says:

    Здравствуйте, с wildcard не приобретал, не подскажу. Но в настройке отличия от простого сертификата не должно быть.

    «Надежный» — это с недавних пор chrome начал сообщать если установлен любой https сертификат (не самоподписанный), у меня обычный сертификат без потверждения организации.

    С потверждением организации сертификат выглядит вот так: https://www.privat24.ua/

  4. Петр says:

    спасибо, прояснили ситуацию…
    хотел ещё спросить, у кого заказывали и сколько стоит сертификат в год?

  5. Владимир Демянович (elims.org.ua) says:

    gogetssl.com — 13$ за три года

  6. Петр says:

    благодарю, ситуация с этими SSL-сертификатами — это как обязательная автостраховка для владельца авто ;)

Обсудить