SHA-1 в сертификате корневого ЦС, критично? — Хабр Q&A

SHA-1 в сертификате корневого ЦС, критично? — Хабр Q&A Сертификаты
Содержание
  1. Что такое сертификат ssl? как работает ssl?
  2. Введение в семейство sha
  3. Что такое запрос на подпись сертификата (csr)?
  4. Что такое хеш?
  5. Apache
  6. Nginx
  7. Sha-1 в сертификате корневого цс, критично?
  8. Sha-3 уже здесь, но стоит ли его использовать?
  9. Windows (iis)
  10. Атаки на хеши
  11. Вариант 1: создать csr
  12. Вариант 3. создание csr для существующего сертификата и закрытого ключа
  13. Вариант 4: генерация самоподписанного(self-signed) сертификата
  14. Вариант 5: генерация самоподписанного сертификата из существующего закрытого ключа и csr
  15. Закрытый ключ
  16. Как изменить алгоритм sha1 на sha256 в windows ca
  17. Как создать csr
  18. Как создать сертификат ssl
  19. Команды openssl для конвертации csr
  20. Модели перехода иок
  21. Обработка устаревших хэшей sha-1
  22. Опасный алгоритм sha-1 убирают из библиотек ssh
  23. План перехода иок с sha-1 на sha-2
  24. Преобразовать pem csr и закрытый ключ в pkcs12 (.pfx .p12)
  25. Проверить версию openssl
  26. Продление сертификата – не используйте старые csr повторно
  27. Семейство sha-2
  28. Система не извлекает закрытый ключ автоматически
  29. Установка openssl в debian и ubuntu
  30. Установка openssl в red hat и centos
  31. Часть 1. самоподписанный сертификат
  32. Расширенная проверка (ev ssl – extended validation)
  33. Заключение

Что такое сертификат ssl? как работает ssl?

Сертификат Secure Socket Layer (SSL) – это протокол безопасности, который защищает данные между двумя компьютерами с использованием шифрования.

Проще говоря, сертификат SSL – это файл данных, который в цифровом виде связывает криптографический ключ с сервером или доменом, а также с названием и местонахождением организации.

Как правило, сертификаты SSL используются на веб-страницах, которые передают и получают конфиденциальные данные конечного пользователя, такие как номер социального страхования, данные кредитной карты, домашний адрес или пароль. Онлайн формы оплаты являются хорошим примером и обычно шифруют вышеупомянутую деликатную информацию с использованием 128 или 256-битной технологии SSL.

Сертификаты SSL обеспечивают идентификацию удаленного компьютера, чаще всего сервера, но также подтверждают идентификацию вашего компьютера с удаленным компьютером для установления безопасного соединения. Обеспечение безопасности в Интернете всегда было улицей с двусторонним движением, и благодаря SSL-шифрованию сервер «пожимает руку» вашему персональному компьютеру, и обе стороны знают, с кем они общаются.

Введение в семейство sha

Алгоритм SHA-1 был разработан Агентством национальной безопасности США (АНБ) и опубликован Национальным институтом стандартов и технологий США (NIST) в качестве федерального стандарта в 1995 году. Выпущенные NIST криптографические стандарты пользуются доверием по всему миру и как правило требуются на всех компьютерах, используемых правительством или вооружёнными силами Соединённых Штатов. SHA-1 заменил предыдущие ослабевшие хеш-функции, например, MD5.

Со временем несколько непрерывных криптографических атак на SHA-1 уменьшили эффективность длины ключа. Из-за этого в 2002 году АНБ и NIST выбрали SHA-2 новым рекомендуемым стандартом хеширования. Это случилось задолго до того, как SHA-1 начали считать взломанным.

Отличное обсуждение взлома SHA-1 и пример документации можно найти здесь.

Что такое запрос на подпись сертификата (csr)?

Запрос на подпись сертификата (CSR – Certificate Signing Request) содержит наиболее важную информацию о вашей организации и домене. Это зашифрованный блок текста, который включает информацию о вашей организации, такую как страна, адрес электронной почты, полное доменное имя и так далее Он отправляется в центр сертификации при подаче заявки на сертификат SSL.

Обычно вы генерируете пару CSR и ключ локально на сервере, где будет установлен сертификат SSL. Однако это не строгое правило. Вы можете сгенерировать пару CSR и ключ на одном сервере и установить сертификат на другом. Однако это усложняет ситуацию. Мы рассмотрим и этот сценарий.

SSL использует две длинные строки случайно сгенерированных чисел, которые известны как закрытые и открытые ключи. Открытый ключ доступен для публичного домена, так как он является частью вашего SSL-сертификата и сообщается вашему серверу.

Закрытый ключ должен соответствовать CSR, с которым он был создан, и, в конечном счете, он должен соответствовать сертификату, созданному из CSR. Если закрытый ключ отсутствует, это может означать, что сертификат SSL не установлен на том же сервере, который сгенерировал запрос на подпись сертификата.

CSR обычно содержит следующую информацию:

Что такое хеш?

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

Службы центра сертификации (ЦС) ИОК используют криптографические хеш-функции для подтверждения идентификационных данных и запросов цифровых сертификатов. Кроме этого, хеши используются для подтверждения цифровых сертификатов (например, цифровой подписью) и списка аннулированных сертификатов (CRL, certificate revocation list), которые выдают другие доверенные стороны.

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

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

Apache

При использовании библиотеки OpenSSL в Apache закрытый ключ по умолчанию сохраняется в /usr/local/ssl. Запустите openssl version –a, команду OpenSSL, которая определяет, какую версию OpenSSL вы используете.

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

OpenSSL 1.0.2g  1 Dec 2021

built on: reproducible build, date unspecified

platform: debian-amd64

options: bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)

compiler: cc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -

D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-

strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-

Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -

DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -

DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -

DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM

OPENSSLDIR: "/usr/lib/ssl"

Последняя строка OPENSSLDIR определяет путь к файлу. В приведенном примере это местоположение по умолчанию /usr/lib/ssl.

Nginx

Вы сможете найти местоположение личного ключа вашего сервера в файле виртуального хоста вашего домена.

Перейдите к местоположению корневого сервера сайта (обычно это каталог /var/www/) и откройте основной файл конфигурации сайта. Найдите директиву ssl_certificate_key, которая предоставит путь к файлу закрытого ключа.

Если вы не можете найти директиву ssl_certificate_key, возможно, существует отдельный файл конфигурации для деталей SSL. Ищите что-нибудь вроде ssl.conf.

Sha-1 в сертификате корневого цс, критично?

Добрый день!

1. В связи с массовым уходом от алгоритма шифрования sha-1 в ssl-сертификатах, важен ли алгоритм шифрования сертификата корневого центра сертификации?

В моем случае: конечный ssl-сертификат зашифрован sha256, сертификат промежуточного ЦС – sha256, корневого – sha1.

2. Насколько я понял из форумов, браузеры не проводят проверку алгоритма шифрования сертификата корневого ЦС, лишь проверяют его в списке доверенных, всё верно?

Sha-3 уже здесь, но стоит ли его использовать?

Хотя в SHA-2 не обнаружено существенных криптографических слабостей, он считается алгоритмически схожим с SHA-1. Большинство экспертов думают, что его время жизни будет схожим с SHA-1. В августе 2021 NIST утвердило новый алгоритм криптографического хеширования SHA-3.

К сожалению, люди, откладывающие свой переход на SHA-2 в надежде сразу перейти на SHA-3, будут очень расстроены. Общемировое принятие стандарта SHA-3 может затянуться на долгие годы, а переход на SHA-2 следует сделать уже сейчас. Если вы перейдёте на SHA-3 сейчас, то большинство, если не все, ваших криптографически-зависимых приложений или устройств, скорее всего, сообщат об ошибке (не смогут распознать цифровой сертификат).

Итак, если вы ещё не перешли на SHA-2, то переходите сейчас. И когда SHA-2 начнёт ослабевать, мы все вместе перейдём на SHA-3.

Перевод статьи «All you need to know about the move from SHA-1 to SHA-2 encryption»

Варвара Николаева

Windows (iis)

На серверах, работающих под управлением Windows Internet Information Services, операционная система сохраняет закрытый ключ в скрытой папке, так же как любая обычная ОС Windows хранит важные системные данные.

Однако, экспортируя файл .pfx, вы можете получить закрытый ключ и сертификаты. Для этого выполните следующие действия:

  1. Откройте консоль управления MMC (Microsoft Management Console).
  2. Разверните дерево Сертификаты (локальный компьютер), расположенное в корне консоли.
  3. Ваш сертификат находится либо в личной папке, либо в папке веб-хостинга. Вы можете идентифицировать каждый сертификат по его Common name (домену)
  4. Щелкните правой кнопкой мыши сертификат, который вы хотите экспортировать, и выберите Все задачи -> Экспорт.
  5. Следуйте инструкциям мастера для экспорта файла .pfx.

Теперь у вас есть то, что вам нужно, если вы хотите сохранить резервную копию или установить сертификат на другом сервере Windows.

Если вам нужно установить сертификат на другом сервере, который не работает под управлением Windows (например, Apache), вам необходимо сконвертировать файл .pfx и разделить файлы .key и .crt или .cer. Вы можете сделать это с OpenSSL.

Атаки на хеши

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

Общепринятые криптографические хеш-функции изначально считаются криптографически стойкими, но со временем злоумышленники находят математические уловки, ослабляющие их защиту.

Вычислительная сложность криптостойкого хеша равна заявленной эффективной длине последовательности бит минус 1. Таким образом, когда неизвестны его недостатки, 128-битный хеш будет иметь сложность вычисления 2^127. Как только кто-то найдёт математический алгоритм, который позволит взломать хеш за время меньшее, чем эффективная длина бит минус 1, такой хеш будет считаться ослабленным.

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

Взломанные хеши используются вредоносными программами и злоумышленниками для создания якобы законного программного обеспечения с цифровой подписью. Хороший пример такого ПО — Flame malware program. В общем, слабые хеши могут сыграть свою роль и не должны использоваться.

Вариант 1: создать csr

Первое, что нужно сделать, – это создать 2048-битную пару ключей RSA локально. Эта пара будет содержать как ваш закрытый, так и открытый ключ. Вы можете использовать инструмент Java key или другой инструмент, но мы будем работать с OpenSSL.

Чтобы создать открытый и закрытый ключ с запросом на подпись сертификата (CSR), выполните следующую команду OpenSSL:

openssl req –out certificatesigningrequest.csr -new -newkey rsa:2048 -nodes -keyout privatekey.key

Что эта команда означает:

  • openssl – активирует программное обеспечение OpenSSL
  • req – указывает, что мы хотим CSR
  • –out – указывает имя файла, в котором будет сохранен ваш CSR. У нас в примере это certificatesigningrequest.csr
  • –new –newkey – создать новый ключ
  • rsa:2048 – cгенерировать 2048-битный математический ключ RSA
  • –nodes – нет DES, то есть не шифровать закрытый ключ в PKCS#12 файл
  • –keyout – указывает домен, для которого вы генерируете ключ

Далее ваша система должна запустить текстовую анкету для заполнения, которую мы описывали в таблице выше:

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

После завершения работы программы вы сможете найти файл CSR в вашем рабочем каталоге. Запрос на подпись сертификата, сгенерированный с помощью OpenSSL, всегда будет иметь формат файла .csr. Чтобы найти в папке все файлы этого формата используйте команду

ls *.csr

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

Также вы можете открыть файл .csr в текстовом редакторе, например nano, чтобы просмотреть сгенерированный буквенно-цифровой код.

sudo nano your_domain.csr

После того, как вы сгенерировали CSR с парой ключей, сложно увидеть, какую информацию она содержит, поскольку она не будет в удобочитаемом формате. Вы можете легко декодировать CSR на своем сервере, используя следующую команду OpenSSL:

openssl req -in server.csr -noout -text

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

Про сертификаты:  Как вручную установить SSL-сертификат на Exchange Server 2010 | Сертификаты SSL - GoDaddy Справка RU

Вариант 3. создание csr для существующего сертификата и закрытого ключа

openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key

Один маловероятный сценарий, в котором это может пригодиться, – это если вам нужно обновить существующий сертификат, но ни у вас, ни у вашего центра сертификации нет первоначального CSR. Это позволит извлечь информацию о вашем домене и организации из сертификата SSL и использовать его для создания нового CSR, что позволит вам сэкономить время. Параметр -x509toreq преобразует сертификат в запрос сертификата.

Вариант 4: генерация самоподписанного(self-signed) сертификата

Самозаверяющий сертификат обычно используется для сред тестирования и разработки, а также в интрасети. Давайте создадим самозаверяющий сертификат, используя следующую команду OpenSSL:

openssl req -newkey rsa:2048 -nodes -keyout domain.key-x509 -days 365 -out domain.crt

Параметр –days установлен на 365, что означает, что сертификат действителен в течение следующих 365 дней. Параметр x509 указывает, что это будет самозаверяющий сертификат. Временный CSR генерируется, и он используется только для сбора необходимой информации. Если вы не хотите защищать свой закрытый ключ паролем, вы можете добавить параметр –nodes.

Центры сертификации не проверяют самоподписанные сертификаты. Таким образом, они не так безопасны, как проверенные сертификаты. Если ЦС не подписал сертификат, каждый основной браузер отобразит сообщение об ошибке «Ненадежный сертификат», как показано на рисунке ниже.

Вариант 5: генерация самоподписанного сертификата из существующего закрытого ключа и csr

Если у вас уже есть CSR и закрытый ключ и вам нужно создать самозаверяющий сертификат, используйте следующую команду:

openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt

Параметр –days установлен на 365, что означает, что сертификат действителен в течение следующих 365 дней.

Закрытый ключ

Закрытый ключ кодируется и создается в формате PEM на основе Base-64, который не читается человеком. Вы можете открыть его в любом текстовом редакторе, но все, что вы увидите, это несколько десятков строк, которые кажутся случайными символами, заключенными в открывающие и закрывающие заголовки. Ниже приведен пример закрытого ключа:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCVqGpH2S7F0CbEmQBgmbiDiOOGxhVwlG yY/6OBQoPKcx4Jv2h
vLz7r54ngjaIqnqRNP7ljKjFLp5zhnAu9GsdwXbgLPtrmMSB MVFHTJvKjQ eY9p
dWA3NbQusM9uf8dArm 3VrZxNHQbVGXOIAPNHTO08cZHMSqIDQ6OvLma7wIDAQAB
AoGAbxKPzsNh826JV2A253svdnAibeSWBPgl7kBIrR8QWDCtkH9fvqpVmHa 6pO5
5bShQyQSCkxa9f2jnBorKK4 0K412TBM/SG6Zjw DsZd6VuoZ7P027msTWQrMBxg
Hjgs7FSFtj76HQ0OZxFeZ8BkIYq0w 7VQYAPBWEPSqCRQAECQQDv09M4PyRVWSQM
S8Rmf/jBWmRnY1gPPEOZDOiSWJqIBZUBznvOPOOQSH6B vee/q5edQA2OIaDgNmn
AurEtUaRAkEAn7/65w Tewr89mOM0RKMVpFpwNfGYAj3kT1mFEYDq iNWdcSE6xE
2H0w3YEbDsSayxc36efFnmr//4ljt4iJfwJAa1pOeicJhIracAaaa6dtGl/0AbOe
f3NibugwUxIGWkzlXmGnWbI3yyYoOta0cR9fvjhxV9QFomfTBcdwf40FgQJAH3MG
DBMO77w8DK2QfWBvbGN4NFTGYwWg52D1Bay68E759OPYVTMm4o/S3Oib0Q53gt/x
TAUq7IMYHtCHZwxkNQJBAORwE 6qVIv/ZSP2tHLYf8DGOhEBJtQcVjE7PfUjAbH5
lr  9qUfv0S13gXj5weio5dzgEXwWdX2YSL/asz5DhU=
-----END RSA PRIVATE KEY-----

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

Как изменить алгоритм sha1 на sha256 в windows ca

Если результат выполнения команды

SHA256

, перейти к шагу 4.

2. По умолчанию результат выполнения команды SHA1.  Необходимо выполнить команду:

certutil -setreg cacspCNGHashAlgorithm SHA256 

Это перенастроит ваш CA на использование SHA256 для CNG хешей.

3.  Перезапустите Certificate Services: 

net stop CertSvc && net start CertSvc

4.  Перевыпишите ваш корневой сертификат:

certutil -renewCert ReuseKeys

5.  Перезапустите службу Certificate Services: 

net stop CertSvc && net start CertSvc

Эти действия сгенерируют новый корневой сертификат вашего CA с использованием SHA256 в качестве алгоритма подписи. Необходимо будет раздань новый сертификат вашим клиентам. http://technet.microsoft.com/en-us/library/cc730763(v=ws.10).aspx

Как создать csr

Запросы на подпись сертификата (CSR) создаются с помощью пары ключей – открытого и закрытого ключа. Только открытый ключ отправляется в центр сертификации и включается в сертификат SSL, и он работает вместе с вашим личным ключом для шифрования соединения. Любой может иметь доступ к вашему открытому ключу, и он проверяет подлинность SSL-сертификата.

Закрытый ключ – это блок закодированного текста, который вместе с сертификатом проверяет безопасное соединение между двумя компьютерами. Он не должен быть общедоступным, и его не следует отправлять в ЦС.

Целостность сертификата зависит от того, что только вы знаете закрытый ключ. Если вы когда-либо скомпрометированы или утеряны, как можно скорее введите новый сертификат с новым закрытым ключом. Большинство ЦС не взимают плату за эту услугу.

Большинство пар ключей состоят из 2048 битов. Хотя пары ключей длиной 4096 бит более безопасны, они замедляют SSL-рукопожатия и создают нагрузку на серверные процессоры. Из-за этого большинство сайтов по-прежнему используют 2048-битные пары ключей.

Как создать сертификат ssl

То, как сгенерировать запрос на подпись сертификата (CSR), зависит исключительно от платформы, которую вы используете, и конкретного выбранного вами инструмента.

Мы будем генерировать CSR с использованием OpenSSL.

OpenSSL – это широко используемый инструмент для работы с CSR-файлами и SSL-сертификатами, который можно загрузить с официального сайта OpenSSL. Это инструмент реализации с открытым исходным кодом для SSL/TLS, который используется примерно на 65% всех активных интернет-серверов, что делает его неофициальным отраслевым стандартом.

Команды openssl для конвертации csr

Если вы работаете с серверами Apache, запросы на подпись сертификатов (CSR) и ключи хранятся в формате PEM. Но что, если вы хотите перенести CSR на сервер Tomcat или Windows IIS? Вам придется конвертировать стандартный файл PEM в файл PFX. Следующие команды помогут вам сделать это.

Примечание: Используйте параметр -nodes, если вы не хотите шифровать файл .key. Если вы не используете этот параметр, вам нужно будет указать пароль.

Модели перехода иок

Ниже перечислены сценарии для внедрения SHA-2 в компоненты ИОК (для этих примеров используется двухуровневая ИОК — автономная корневая система, онлайн центры сертификации), каждый из которых может быть либо новым компонентом, либо перенесённым:

  • Два ИОК дерева, один полностью SHA-1, другой полностью SHA-2.

Остальные сценарии предполагают одно дерево ИОК:

  • Всё дерево ИОК, от корня до конечных точек, — SHA-1.
  • Всё дерево ИОК, от корня до конечных точек, — SHA-2.
  • Корень — SHA-1, выдающие ЦС — SHA-2, сертификаты конечных точек — SHA-2.
  • Корень — SHA-1, выдающие ЦС — SHA-2, сертификаты конечных точек — SHA-1.
  • Корень — SHA-1, выдающие ЦС — SHA-2 и SHA-1, сертификаты конечных точек — SHA-2 и SHA-1.
  • Корень — SHA-2, выдающие ЦС — SHA-1, сертификаты конечных точек — SHA-1.
  • Корень — SHA-2, выдающие ЦС — SHA-2, сертификаты конечных точек — SHA-1.
  • Корень — SHA-2, выдающие ЦС — SHA-2 и SHA-1, сертификаты конечных точек — SHA-2 и SHA-1.

Также возможно существование выдающего центра сертификации, который переключается между SHA-1 и SHA-2 по необходимости, но это с большой вероятностью вызовет путаницу в службах ИОК (и не особо рекомендуется). Если возможно, для облегчения перехода можно запустить параллельные ИОК, один — с SHA-1, другой — с SHA-2, а потом переводить используемые устройства после того, как позволит тестирование.

Примечание: собственный сертификат ЦС корневого ЦС не нужно переносить на SHA-2, даже если он всё ещё использует SHA-1. Все программы проверки устаревших SHA-1 заботятся обо всём после собственного сертификата корневого ЦС (и будут заботиться, по крайней мере, в обозримом будущем).

Публичные ЦС уже перешли с SHA-1 на SHA-2 для любых сертификатов со сроком жизни, заканчивающимся после 1 января 2021, поэтому вы должны сосредоточить свои усилия на серверах и приложениях с ещё не перешедшими на SHA-2 публичными цифровыми сертификатами.

Обработка устаревших хэшей sha-1

Все крупные поставщики веб-браузеров (например, Microsoft, Google, Mozilla, Apple) и другие доверенные стороны рекомендовали всем клиентам, сервисам и продуктам, в настоящее время использующим SHA-1, перейти на SHA-2, хотя что и когда должно перейти зависит от поставщика.

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

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

К сожалению, переход с SHA-1 на SHA-2 является односторонней операцией в большинстве сценариев сервера. Например, как только вы начнёте использовать цифровой сертификат SHA-2 вместо SHA-1, пользователи, не понимающие сертификаты SHA-2, начнут получать предупреждения и уведомления об ошибках, или даже отказы. Для пользователей приложений и устройств, не поддерживающих SHA-2, переход будет опасным скачком.

Опасный алгоритм sha-1 убирают из библиотек ssh

SHA-1 в сертификате корневого ЦС, критично? — Хабр Q&A
Сложность атак на SHA-1. Стоимость указана из расчёта стоимости аренды одного GTX 1060 в 35 долларов/месяц

Намного позже всех остальных, но разработчики библиотек для SSH приняли решение наконец-то отключить по умолчанию устаревшую криптофункцию SHA-1. Сегодня подбор серверного ключа аутентификации SHA-1, то есть коллизия с выбранным префиксом, на арендованном кластере GPU обойдётся в $45 тыс., как указано в таблице вверху. Это делает атаку доступной не только для государственных спецслужб, но и для коммерческих клиентов.

Об отключении SHA-1 по умолчанию одновременно объявили разработчики опенсорсных библиотек OpenSSH (release notes) и libssh (изменение кода).

Алгоритм SHA (Secure Hash Algorithm) разработан АНБ совместно с NIST. Первую версию SHA-0 представили в 1993 году, но вскоре АНБ отозвало данную версию, сославшись на обнаруженную ими ошибку, которая так и не была раскрыта.

Исправленную версию АНБ опубликовала в 1995 году, она получила название SHA-1.

Криптографическая хеш-функция SHA-1 (Secure Hash Algorithm 1) генерирует строку из 160 бит, которая называется хэш-дайджестом. Теоретически, дайджесты должны быть уникальными для каждого файла, сообщения или другого входного сигнала, подаваемого в функцию. В качестве входного значения SHA-1 принимает сообщение не более $2^{64}-1$ бит, то есть примерно 2 эксабайта.

Понятно, что область значений дайджеста меньше области входных значений. Но на практике дайджест-коллизии должны быть неосуществимы, учитывая возможности производительности имеющихся вычислительных ресурсов. К сожалению, SHA-1 уже не соответствует этому критерию.

В 2021 году сотрудники компании Google и Центра математики и информатики в Амстердаме представили первый способ генерации коллизий для SHA-1.

Они опубликовали и доказательство: два документа PDF с разным содержимым, но одинаковыми цифровыми подписями SHA-1.

  $ls -l sha*.pdf 
  -rw-r--r--@ 1 amichal  staff  422435 Feb 23 10:01 shattered-1.pdf
  -rw-r--r--@ 1 amichal  staff  422435 Feb 23 10:14 shattered-2.pdf
  $shasum -a 1 sha*.pdf
  38762cf7f55934b34d179ae6a4c80cadccbb7f0a  shattered-1.pdf
  38762cf7f55934b34d179ae6a4c80cadccbb7f0a  shattered-2.pdf

SHA-1 в сертификате корневого ЦС, критично? — Хабр Q&A

На сайте shattered.it можно проверить любой файл на предмет того, входит ли он в пространство возможных коллизий. То есть можно ли подобрать другой набор данных (файл) с таким же хешем. Вектор атаки здесь понятен: злоумышленник может подменить «хороший» файл своим экземпляром с закладкой, вредоносным макросом или загрузчиком трояна. И этот «плохой» файл будет иметь такой же хеш или цифровую подпись.

В последние годы множество программ и сервисов перестали использовать SHA-1 после того, как исследователи продемонстрировали практические способы подделки цифровых подписей, использующих SHA-1. Единодушное мнение экспертов состоит в том, что этот алгоритм теперь не безопасен почти во всех контекстах безопасности.

Компания Google давно выразила своё недоверие SHA-1, особенно в качестве использования этой функции для подписи сертификатов TLS. Ещё в 2021 году группа разработчиков Chrome объявила о постепенном отказе от использования SHA-1.

В 2021 году исследователи использовали инфраструктуру Google, чтобы произвести вычисления и проверить теоретические выкладки, сколько займёт поиск коллизии. Разработчики говорят, что это было одно из самых крупных вычислений, которые когда-либо проводила компания Google. В общей сложности было произведено девять квинтиллионов вычислений SHA-1 (9 223 372 036 854 775 808), что потребовало 6500 процессорных лет на первой фазе и 110 лет GPU на второй фазе атаки.

Блоки сообщений с одинаковым хешем SHA-1
SHA-1 в сертификате корневого ЦС, критично? — Хабр Q&A

В 2021 году исследователи Гаэтан Лоран и Томас Пейрин продемонстрировали атаку на отыскание коллизии с выбранным префиксом (chosen-prefix), которая имеет практический смысл для подбора конкретных ключей шифрования PGP/GnuPG. Наконец, в январе 2020 года авторам удалось на порядок оптимизировать атаку и снизить её теоретическую стоимость до коммерчески приемлемой цены (см. таблицу выше и pdf). Для демонстрации они создали пару разных ключей PGP/GnuPG с одинаковыми сертификатами SHA-1.

Про сертификаты:  Няня - профессиональная переподготовка | НАДПО

В качестве защиты от атаки на отыскание коллизий SHA-1 рекомендуется перейти на более качественные криптографические хеш-функции SHA-256 и SHA-3.

На это исследование от января 2020 года ссылаются разработчики OpenSSH, которые написали в примечаниях к последнему релизу: «Теперь можно выполнять атаки с выбранным префиксом по алгоритму SHA-1 менее чем за 50 тысяч долларов США. По этой причине в ближайшем будущем мы будем отключать алгоритм подписи открытого ключа “ssh-rsa” по умолчанию. К сожалению, этот алгоритм всё еще широко используется. Несмотря на существование лучших альтернатив, он долгое время оставался единственным алгоритмом подписи открытого ключа, заданным оригинальными SSH RFC».

В числе лучших альтернатив разработчики OpenSSH называют алгоритмы RFC8332 RSA SHA-2 (поддерживается с версии OpenSSH 7.2 и уже используется по умолчанию, если сервер и клиент его поддерживают), ssh-ed25519 (поддерживается с версии 6.5) и RFC5656 ECDSA (с версии 5.7).

Для проверки, что сервер при генерации открытого ключа для аутентификации использует слабый алгоритм SHA-1, попробуйте подключиться к нему после удаления алгоритма ssh-rsa из списка разрешённых в ssh(1):

ssh -oHostKeyAlgorithms=-ssh-rsa user@host

Если верификация не проходит и другие типа ключей недоступны, то серверное программное обеспечение следует обновить.

В будущих версиях OpenSSH по умолчанию будет включена опция UpdateHostKeys, при которой клиент будет автоматически переходить на лучшие алгоритмы. Её можно активировать вручную.

Судя по всему, полное отключение SHA-1 займёт немало времени. Гаэтан Лоран из Национального института исследований в информатике и автоматике (Франция), один из соавторов январского исследования, не ожидает, что разработчики OpenSSH быстро это сделают: «Когда они полностью отключат SHA-1, будет невозможно подключиться с новой версии OpenSSH к устройству со старым SSH-сервером, — пишет он. — Вероятно, перед этим они предпримут ряд постепенных шагов (с громкими предупреждениями). С другой стороны, во встроенных системах с SSH, которые не обновлялись в течение многих лет, вероятно, много проблем с безопасностью, так что, возможно, не так уж плохо будет нарушить их работу… Во всяком случае, я вполне доволен этим ходом, это именно то, чего мы хотели добиться :-)».

После того как OpenSSH и libssh объявили о планах отключения SHA-1, список пользователей SHA-1 стал короче, но не исчез. Функция всё еще поддерживается в последних версиях библиотеки OpenSSL, которую многие веб-сайты и интернет-службы используют для реализации HTTPS и других протоколов шифрования. Последняя версия компилятора GNU Collection, выпущенная ранее в этом месяце, подписана цифровой подписью с хешем SHA-1.

Линус Торвальдс сказал, что в репозиториях Git коллизии хеша не представляют угрозы безопасности. Он пояснил, что сть большая разница между использованием криптографического хеша для цифровых подписей в системах шифрования и для генерации «идентификации контента» в системе вроде Git. Когда все данные лежат в открытом доступе, то реальная атака практически невозможна. Авторы научной работы приводят пример атаки на документы с идентичным префиксом. Эта атака успешна, потому что сам префикс «закрыт» внутри документа, как блоб. Если же у нас открытые исходники в репозитории, то это совсем другое дело. Вряд ли можно сделать такой префикс из исходного кода (только из блоба). Другими словами, для создания идентичного префикса и последующей генерации веток кода с одинаковыми хешами SHA-1 придётся внедрить в код некие случайные данные, что сразу же будет замечено. Линус говорит, что есть места, куда можно спрятать данные, но git fsck уже вылавливает такие фокусы. Тем не менее, у Линуса есть план, как уйти от использования SHA-1, чтобы никому даже не пришлось конвертировать свои репозитории.

План перехода иок с sha-1 на sha-2

Каждая компания с внутренним ИОК, не использующая SHA-2, должна будет создать ИОК SHA-2 или перевести существующую ИОК с SHA-1 на SHA-2. Для перехода нужно:

  • Обучить вовлечённых членов команды тому, что такое SHA-2 и почему требуется его использование (эта статья будет хорошим началом).
  • Провести инвентаризацию всех критических хешей или цифровых сертификатов, используемых в приложениях или устройствах.
  • Определить, какие критически важные устройства или приложения могут использовать SHA-2, какой размер ключа может быть использован и какие операционные проблемы могут возникнуть (этот этап зачастую включает обращение к поставщику и тестирование).
  • Определить, какие компоненты ИОК могут или должны быть перенесены в SHA-2.
  • Составить план перехода для преобразования компонентов SHA-1 в SHA-2, включая потребителей и компоненты ИОК, плюс резервный план на случай сбоя.
  • Провести PoC-тестирование.
  • Принять управленческий риск и решение о переходе или отказе от него.
  • Внедрить план перехода в производственную среду.
  • Провести тестирование и получить обратную связь.

Самая сложная часть перехода — определение того, какие устройства и приложения работают с SHA-2. Если используемые устройства не понимают SHA-2, вас ждёт неудача или сообщение об ошибке, которое вряд ли будет звучать как «SHA-2 не принят». Вместо этого готовьтесь к:

Подумайте о своей миссии, чтобы определить, какие важные части вашей инфраструктуры будут или не будут работать. Начните с попытки инвентаризации каждого уникального устройства, ОС и приложения, которые должны понимать SHA-2. Затем соберите команду людей, которые протестируют, работает ли SHA-2.

Обновление приложений и устройств — задача не из лёгких, и потребует больше времени, чем кажется. Даже сейчас существует множество устройств и приложений, использующих старые версии OpenSSL, которые следовало бы обновить после атаки Heartbleed, но администраторы серверов этого так и не сделали.

Если у вас есть внутренняя ИОК, вам понадобится подготовить её к переходу на SHA-2. Иногда это означает обновление ваших центров сертификации, получение новых сертификатов или установку полностью новых ИОК. Последнее рекомендуется по множеству причин, в основном потому, что новая ИОК даст вам шанс начать сначала без груза старых ошибок.

Преобразовать pem csr и закрытый ключ в pkcs12 (.pfx .p12)

Файлы FKCS12 используются для экспорта или импорта сертификатов в Windows IIS.

openssl pkcs12 -inkey domain.key -in domain.crt -export -out domain.pfx

Эта команда возьмет закрытый ключ и CSR и преобразует его в один файл .pfx. Вы можете настроить экспортную фразу-пароль, но также можете оставить это поле пустым. Обратите внимание, что, объединив строки символов сертификата в конец одного файла PEM, вы можете экспортировать цепочку сертификатов в формат файла .pfx.

Проверить версию openssl

Эта команда отображает версию OpenSSL, и ее параметры, с которыми она была скомпилирована:

openssl version -a

Получим примерно такой вывод:

OpenSSL 1.0.1f 6 Jan 2021
built on: Mon Apr  7 21:22:23 UTC 2021
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx)
compiler: cc -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

Продление сертификата – не используйте старые csr повторно

То, что некоторые веб-серверы позволяют использовать старые CSR для обновления сертификатов, не означает, что вы должны их использовать. В качестве меры безопасности всегда генерируйте новый CSR и закрытый ключ при обновлении сертификата. Привязка к одному и тому же секретному ключу – это дорога, вымощенная уязвимостями безопасности.

Также рекомендуется обновить SSL-сертификат до истечения срока его действия. В противном случае потребуется покупать новый сертификат.

Семейство sha-2

SHA-2 — стандарт криптографического хеширования, который программное и аппаратное обеспечение должны использовать по крайней мере ближайшие пару лет. SHA-2 очень часто называется семейством хеш-функций SHA-2, поскольку содержит много хешей разных размеров, включая 224-, 256-, 384- и 512-битные последовательности.

Когда кто-то говорит, что использует SHA-2, длина его хеша неизвестна, но сейчас самый популярный — 256-битный. Хотя некоторые математические характеристики SHA-2 совпадают с SHA-1, и в нём обнаружены незначительные недостатки, в криптомире он по-прежнему считается «стойким».

Система не извлекает закрытый ключ автоматически

Некоторые системы не автоматизируют процедуру извлечения закрытого ключа. Кроме того, если вам нужно установить существующий сертификат на другом сервере, вы, очевидно, не можете ожидать, что он получит закрытый ключ. Основная сложность здесь заключается в том, как найти точное местоположение ключа.

Установка openssl в debian и ubuntu

Сначала проверим, установлена ли у нас утилита OpenSSL при помощи команды:

dpkg -l |grep openssl

Если пакет OpenSSL установлен, мы получим следующий результат:

ii libgnutls-openssl27:amd64   2.12.23-12ubuntu2.4   amd64   GNU TLS library - OpenSSL wrapper

ii openssl   1.0.1f-1ubuntu2.16   amd64   Secure Sockets Layer toolkit - cryptographic utility

Если вы не видите такого результата, выполните следующую команду для установки OpenSSL:

apt-get install openssl

Установка openssl в red hat и centos

Red Hat (версия 7.0 и более поздние) должна поставляться с предустановленной ограниченной версией OpenSSL. Он предлагает только ограниченную поддержку для IDEA, RC5 и MDC2, поэтому вы можете установить недостающие функции.

Чтобы проверить, установлен ли OpenSSL на сервере yum (например, Red Hat или CentOS), выполните следующую команду:

rpm -qa | grep -i openssl

Эта команда должна вернуть следующий результат:

openssl-1.0.1e-48.el6_8.1.x86_64
openssl-devel-1.0.1e-48.el6_8.1.x86_64
openssl-1.0.1e-48.el6_8.1.i686

Если ваш формат вывода отличается, это означает, что OpenSSL не установлен на вашем сервере. Выполните следующую команду для установки OpenSSL:

yum install openssl openssl-devel

Часть 1. самоподписанный сертификат


Для начала рассмотрим вариант самоподписанного сертификата корневого уровня.

Для упрощения задачи сгенерируем сертификат, который будет содержать только необходимые параметры:

Сделать это можно с помощью библиотеки Bouncy Castle, следующим образом:

private void button1_Click(object sender, EventArgs e)
        {            

            var KeyGenerate = new RsaKeyPairGenerator();

            KeyGenerate.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

            AsymmetricCipherKeyPair kp = KeyGenerate.GenerateKeyPair();

            var gen = new X509V3CertificateGenerator();

            var certName = new X509Name("CN=CA");
            var serialNo = new BigInteger("1",10);            

            gen.SetSerialNumber(serialNo);
            gen.SetSubjectDN(certName);            
            gen.SetIssuerDN(certName);
            gen.SetNotAfter(DateTime.Now.AddYears(100));
            gen.SetNotBefore(DateTime.Now);
            gen.SetSignatureAlgorithm("SHA1WITHRSA");            
            gen.SetPublicKey(kp.Public);     
            var myCert = gen.Generate(kp.Private);
            byte[] result = DotNetUtilities.ToX509Certificate(myCert).Export(X509ContentType.Cert);

            FileStream fs = new FileStream("D:\test1.crt", FileMode.CreateNew);
            fs.Write(result, 0, result.Length);
            fs.Flush();
            fs.Close();
        }

В результате выполнения данной процедуры будет создан стандартный x.509 сертификат, который, будучи открытым с помощью hex-редактора, выглядит вот таким чудесным образом:

30 82 01 8F 30 81 F9 A0  03 02 01 02 02 01 01 30
0D 06 09 2A 86 48 86 F7  0D 01 01 05 05 00 30 0D
31 0B 30 09 06 03 55 04  03 0C 02 43 41 30 20 17
0D 31 33 30 39 31 35 31  35 33 35 30 32 5A 18 0F
32 31 31 33 30 39 32 32  31 35 33 35 30 32 5A 30
0D 31 0B 30 09 06 03 55  04 03 0C 02 43 41 30 81
9F 30 0D 06 09 2A 86 48  86 F7 0D 01 01 01 05 00
03 81 8D 00 30 81 89 02  81 81 00 8D 80 B5 8E 80
8E 94 D1 04 03 6A 45 1A  54 5E 7E EE 6D 0C CB 0B
82 03 F1 7D C9 6F ED 52  02 B2 08 C3 48 D1 24 70
C3 50 C2 1C 40 BC B5 9D  F8 E8 A8 41 16 7B 0B 34
1F 27 8D 32 2D 38 BA 18  A5 31 A9 E3 15 20 3D E4
0A DC D8 CD 42 B0 E3 66  53 85 21 7C 90 13 E9 F9
C9 26 5A F3 FF 8C A8 92  25 CD 23 08 69 F4 A2 F8
7B BF CD 45 E8 19 33 F1  AA E0 2B 92 31 22 34 60
27 2E D7 56 04 8B 1B 59  64 77 5F 02 03 01 00 01
30 0D 06 09 2A 86 48 86  F7 0D 01 01 05 05 00 03
81 81 00 0A 1C ED 77 F4  79 D5 EC 73 51 32 25 09
61 F7 00 C4 64 74 29 86  5B 67 F2 3D A9 39 34 6B
3C A9 92 B8 BF 07 13 0B  A0 9B DF 41 E2 8A F6 D3
17 53 E1 BA 7F C0 D0 BC  10 B7 9B 63 4F 06 D0 7B
AC C6 FB CE 95 F7 8A 72  AA 10 EA B0 D1 6D 74 69
5E 20 68 5D 1A 66 28 C5  59 33 43 DB EE DA 00 80
99 5E DD 17 AC 43 36 1E  D0 5B 06 0F 8C 6C 82 D3
BB 3E 2B A5 F1 94 FB 53  7B B0 54 22 6F F6 4C 18
1B 72 1C

Тот же самый сертификат, но уже открытый с помощью стандартных средств windows:

Имя сертификата	CA
Издатель	CA
Версия сертификата	3
Серийный номер	0x1
Недействителен до...	15.09.2021 15:35:00 GMT
Недействителен после...	22.09.2113 15:35:00 GMT
Цифровая подпись (SHA-1)	F9 AD 58 B5 50 3D F6 36 5E B8 89 D4 DC C8 5F CC 25 4B 93 A2
Цифровая подпись (SHA-256)	42 02 24 20 4E 8F 3A 3E 31 38 88 E5 C5 E7 C3 03 14 3A A6 52 EA 78 B9 77 42 5B 99 EB 4B BA 23 82
Открытый ключ(1024 битный)		Алгоритм открытого ключа	rsaEncryption
Модуль	
00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
10: EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
20: C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
30: 41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
40: E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
50: 7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
60: 08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
70: 92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
Экспонента	01 00 01                                       

Подпись		Алгоритм подписи	sha1WithRSAEncryption
Подпись	
00: 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09 61 F7 00
10: C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B 3C A9 92
20: B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3 17 53 E1
30: BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B AC C6 FB
40: CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69 5E 20 68
50: 5D 1A 66 28 C5 59 33 43 DB EE DA 00 80 99 5E DD
60: 17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3 BB 3E 2B
70: A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18 1B 72 1C

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

Про сертификаты:  Как получить аттестат 1.0 ФСФР

Прежде всего, нужно отметить, что файл *.crt хранит информацию о сертификате в закодированном виде. Для кодирования применяется особый язык, называемый ASN.1.

ASN.1 — стандарт записи, описывающий структуры данных для представления, кодирования, передачи и декодирования данных. Wikipedia

С помощью языка ASN.1 можно описывать сложные структуры, состоящие из данных различных типов. Типичный пример ASN.1-файла выглядит как-то так:

Однако ASN.1 разрабатывался в те светлые времена, когда «640 КБ должно было хватать каждому» и тратить место на такую громоздкую запись не было никакой возможности. Поэтому, в целях экономии места, а также более удобной обработки хранимой в ASN.1-форме информации, был разработан специальный метод кодирования — DER.

DER-кодировка описывается следующим правилом. Первым записывается байт, характеризующий тип данных, затем последовательность байтов хранящих сведения о длине данных и затем уже записываются сами данные.

К примеру, для кодировки целого числа INTEGER 65537 используется следующая форма: 0203 01 00 01.Здесь первый байт 02, определяет тип INTEGER (полную таблицу типов вы можете найти например тут), второй байт 03 показывает длину блока. А следующие за этим байты 01 00 01, являются шестнадцатеричной записью нашего числа 65537.

В нашем случае, для описание простейшего самоподписаного сертификата, достаточно 9 типов данных. Приведем таблицу кодирования для этих типов:

Зная как кодируется каждый из этих типов, мы можем попытаться распарсить наш *.crt файл.

3082 01 8F3081 F9A0030201 02 0201 01 30
0D0609 2A 86 48 86 F7 0D 01 01 05 0500300D
310B30090603 55 04 03 0C02 43 41 302017
0D 31 33 30 39 31 35 31 35 33 35 30 32 5A 180F
32 31 31 33 30 39 32 32 31 35 33 35 30 32 5A 30
0D310B30090603 55 04 03 0C02 43 41 3081
9F 300D0609 2A 86 48 86 F7 0D 01 01 01 0500
0381 8D 00 3081 890281 81 00 8D 80 B5 8E 80
8E 94 D1 04 03 6A 45 1A 54 5E 7E EE 6D 0C CB 0B
82 03 F1 7D C9 6F ED 52 02 B2 08 C3 48 D1 24 70
C3 50 C2 1C 40 BC B5 9D F8 E8 A8 41 16 7B 0B 34
1F 27 8D 32 2D 38 BA 18 A5 31 A9 E3 15 20 3D E4
0A DC D8 CD 42 B0 E3 66 53 85 21 7C 90 13 E9 F9
C9 26 5A F3 FF 8C A8 92 25 CD 23 08 69 F4 A2 F8
7B BF CD 45 E8 19 33 F1 AA E0 2B 92 31 22 34 60
27 2E D7 56 04 8B 1B 59 64 77 5F 0203 01 00 01
300D0609 2A 86 48 86 F7 0D 01 01 05 050003
81 81 00 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09
61 F7 00 C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B
3C A9 92 B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3
17 53 E1 BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B
AC C6 FB CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69
5E 20 68 5D 1A 66 28 C5 59 33 43 DB EE DA 00 80
99 5E DD 17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3
BB 3E 2B A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18
1B 72 1C


Преобразуя байты-идентификаторы типов и убирая байты описывающие длину блоков получим следующую структуру:

SEQUENCE(3 elem)
	SEQUENCE(7 elem)
		[0](1 elem)
			INTEGER 2
		INTEGER 1
		SEQUENCE(2 elem)
			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
			NULL
		SEQUENCE(1 elem)
			SET(1 elem)
				SEQUENCE(2 elem)
					OBJECT IDENTIFIER 2.5.4.3
					UTF8String CA
		SEQUENCE(2 elem)
			UTCTime 13-09-15 15:35:02 UTC
			GeneralizedTime 2113-09-22 15:35:02 UTC
		SEQUENCE(1 elem)
			SET(1 elem)
				SEQUENCE(2 elem)
					OBJECT IDENTIFIER 2.5.4.3
					UTF8String CA
		SEQUENCE(2 elem)
			SEQUENCE(2 elem)
				OBJECT IDENTIFIER 1.2.840.113549.1.1.1
				NULL
			BIT STRING(1 elem)
				SEQUENCE(2 elem)
					INTEGER 00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
						        EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
						        C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
						        41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
						        E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
						        7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
						        08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
						        92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
					INTEGER 65537
		SEQUENCE(2 elem)
			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
			NULL
	BIT STRING 00: 0A 1C ED 77 F4 79 D5 EC 73 51 32 25 09 61 F7 00
		           C4 64 74 29 86 5B 67 F2 3D A9 39 34 6B 3C A9 92
		           B8 BF 07 13 0B A0 9B DF 41 E2 8A F6 D3 17 53 E1
		           BA 7F C0 D0 BC 10 B7 9B 63 4F 06 D0 7B AC C6 FB
		           CE 95 F7 8A 72 AA 10 EA B0 D1 6D 74 69 5E 20 68
		           5D 1A 66 28 C5 59 33 43 DB EE DA 00 80 99 5E DD
		           17 AC 43 36 1E D0 5B 06 0F 8C 6C 82 D3 BB 3E 2B
		           A5 F1 94 FB 53 7B B0 54 22 6F F6 4C 18 1B 72 1C

Это уже более похоже на то, что мы видим при открытии сертификатов в браузере или Windows. Пробежимся по каждому элементу:

Важным моментом, о котором стоит особенно упомянуть являются данные, для которых вычисляется подпись. Интуитивно может показаться, что подписываются все данные идущие до последнего поля BIT STRING, содержащего подпись. Но на самом деле это не так. В стандарте x.

	SEQUENCE(7 elem)
		[0](1 elem)
			INTEGER 2
		INTEGER 1
		SEQUENCE(2 elem)
			OBJECT IDENTIFIER 1.2.840.113549.1.1.5
			NULL
		SEQUENCE(1 elem)
			SET(1 elem)
				SEQUENCE(2 elem)
					OBJECT IDENTIFIER 2.5.4.3
					UTF8String CA
		SEQUENCE(2 elem)
			UTCTime 13-09-15 15:35:02 UTC
			GeneralizedTime 2113-09-22 15:35:02 UTC
		SEQUENCE(1 elem)
			SET(1 elem)
				SEQUENCE(2 elem)
					OBJECT IDENTIFIER 2.5.4.3
					UTF8String CA
		SEQUENCE(2 elem)
			SEQUENCE(2 elem)
				OBJECT IDENTIFIER 1.2.840.113549.1.1.1
				NULL
			BIT STRING(1 elem)
				SEQUENCE(2 elem)
					INTEGER 00: 8D 80 B5 8E 80 8E 94 D1 04 03 6A 45 1A 54 5E 7E
						        EE 6D 0C CB 0B 82 03 F1 7D C9 6F ED 52 02 B2 08
						        C3 48 D1 24 70 C3 50 C2 1C 40 BC B5 9D F8 E8 A8
						        41 16 7B 0B 34 1F 27 8D 32 2D 38 BA 18 A5 31 A9
						        E3 15 20 3D E4 0A DC D8 CD 42 B0 E3 66 53 85 21
						        7C 90 13 E9 F9 C9 26 5A F3 FF 8C A8 92 25 CD 23
						        08 69 F4 A2 F8 7B BF CD 45 E8 19 33 F1 AA E0 2B
						        92 31 22 34 60 27 2E D7 56 04 8B 1B 59 64 77 5F
					INTEGER 65537


Т.о. если перед вами будет стоять задача проверить ЭЦП x.509 сертификата, то для этого сперва необходимо извлечь TBS-сертификат.

Еще одно замечание относится к отпечатку сертификата. Как видите сам сертификат не содержит никаких сведений об отпечатке. Это объясняется тем, что отпечаток представляет собой обычное хеш-значение SHA-1 от всего файла сертификата, со всеми его полями, включая подпись издателя. Поэтому хранить отпечаток не обязательно, можно просто вычислять хеш при каждом просмотре сертификата.

Расширенная проверка (ev ssl – extended validation)

Центр сертификации проверяет право собственности на домен и проводит тщательное расследование организации, связанной с сертификатом EV. При рассмотрении расширенного запроса проверки соблюдаются строгие правила, и центр сертификации должен проверить следующее:

  1. Информация об организации соответствует официальным данным
  2. Физическое, юридическое и эксплуатационное существование субъекта
  3. Организация имеет исключительные права на использование домена, указанного в сертификате SSL
  4. Организация надлежащим образом санкционировала выдачу сертификата EV SSL

Заключение

Тех усидчивых людей, которые продрались сквозь все эти ASN.1 выражения и шестнадцатеричные наборы данных, я хотел бы поблагодарить за прочтение. Надеюсь вам было хоть немного интересно. И стало чуточку понятнее, что же такое на самом деле X.509 сертификат.

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

  1. RFC5280 — спецификация x.509 сертификата и списка отзывов сертификатов.
  2. Руководство по выживанию — SSL/TLS и сертификаты X.509
  3. ASN.1 простыми словами, вариант статьи для хабра
  4. on-line утилита для декодирования DER-файлов
  5. Первичный стандарт ITU-T X.509 ( русский перевод). Спасибо ystr за ссылку.
Оцените статью
Мой сертификат
Добавить комментарий