К какой технологии относится стандарт x 509. Используем сертификаты x.509 в apache. Область применения ключа

OS: Linux Debian/Ubuntu.
Application: OpenSSL, Nginx, Apache2.

Здесь простейшая шпаргалка процедуры подготовки к приобретению SSL/TLS-сертификата, проверки его корректности и применения в web-сервисе, расширенная некоторыми пояснениями.

Генерируем закрытый и открытый ключи.

Работы с компонентами сертификата очень желательно проводить в месте, закрытом от доступа посторонних:

$ mkdir -p ./make-cert


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

$ cd ./make-cert
$ openssl genrsa -des3 -out ./example.net.key 2048


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


Для ознакомления с содержимым блоков контейнера ключей его код можно раскрыть в более структурированном виде:

$ openssl rsa -noout -text -in ./example.net.key


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

Надо отметить, что на практике, когда SSL-сертфикат применяется всего лишь для перевода на HTTPS ряда сайтов, большинство предпочитает не возиться с запароленным контейнером ключей, а сразу освобождает его от этой защиты, создавая рядом ещё один - "беспарольный":

$ cd ./make-cert
$ openssl rsa -in ./example.net.key -out ./example.net.key.decrypt


Создаем запрос на выпуск X.509-сертификата (CSR).

Сама по себе подсистема защиты потока трафика посредством SSL/TLS обычно реализуется на сессионных симметричных ключах, вырабатываемых web-сервером и браузером клиента при первичном согласовании соединения, и какие-то особые предустановленные ключи шифрования для этого не требуются (хотя и облегчают процедуру согласования - DH-key, например). Сертификат же (стандарта X.509), набор компонентов которого мы здесь поэтапно формируем, предназначен для своего рода подтверждения подлинности web-ресурса в интернет-инфраструктуре, где условно доверенный центр сертификации гарантирует связь указанных в сертификате "открытого" ключа и описания ресурса посредством электронной подписи содержимого такового.

Для передачи центру сертификации нашего "публичного" ключа (не всего содержимого "приватного" ключа, а лишь его блока "modulus"!) и сведений о ресурсе, подлинность которого мы подтверждаем, предназначен специальный CSR-контейнер (Certificate Signing Request). Создаём его, указывая в качестве источника "открытого" ключа контейнер таковых:

$ cd ./make-cert
$ openssl req -new -key ./example.net.key -out ./example.net.csr


В процессе потребуется указать данные о собственнике ресурса, для которого запрашивается сертификат, такие как:

"Country Name" - двухсимвольный код страны согласно ISO-3166 (RU - для России);
"State or Province Name" - название области или региона;
"Locality Name" - название города или населённого пункта;
"Organization Name" - название организации;
"Organizational Unit Name" - название подразделения (необязательное поле);
"Common Name" - полностью определённое доменное имя ресурса (FQDN), для которого запрашивается сертификат;
"Email Address" - контактный e-mail адрес администратора доменного имени (необязательное поле);
"A challenge password" - (необязательное поле, не заполняется);
"An optional company name" - альтернативное имя компании (необязательное поле, не заполняется).


Обращаю внимание, что если действие сертификата должно распространяться на поддомены удостоверяемого ресурса, то FQDN в поле "Common Name" потребуется дополнить маской "*." ("*.example.net" - например).

Любопытствующие могут посмотреть, что скрыто в коде CSR-контейнера:

$ openssl req -noout -text -in ./example.net.csr


CSR-файл "example.net.csr" отправляем в удостоверяющий центр, у которого мы приобретаем сертификат.

Приобретение SSL/TLS-сертификата (X.509).

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

Генерирование самоподписанного X.509-сертификата (опционально).

Как вариант, для использования исключительно в локальной сети, можно создать требуемый сертификат самостоятельно, подписав его своим "закрытым" ключём вместо доверенного центра сертификации - так называемый "self-signed" (самоподписанный):

$ cd ./make-cert
$ openssl x509 -req -days 1095 -in ./example.net.csr -signkey ./example.net.key -out ./example.net.crt


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

Проверка корректности сертификатов и ключей.

В полученном SSL/TLS-сертификате зафиксирована как минимум следующая информация:

Версия сертификата;
Серийный номер сертификата;
Алгоритм подписи;
Полное (уникальное) имя владельца сертификата;
Открытый ключ владельца сертификата;
Дата выдачи сертификата;
Дата окончания действия сертификата;
Полное (уникальное) имя центра сертификации;
Цифровая подпись издателя.


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

$ cd ./make-cert
$ openssl x509 -noout -text -in ./example.net.crt


На практике часто случается так, что некомпетентные клиенты или коллеги предоставляют для применения непосредственно в web-сервисах перепутанные сертификаты и ключи, не связанные между собой. Попытка применения таковых в web-сервере вызовет ошибку вроде "x509 key value mismatch".

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

$ openssl rsa -noout -modulus -in ./example.net.key | openssl md5
$ openssl req -noout -modulus -in ./example.net.csr | openssl md5
$ openssl x509 -noout -modulus -in ./example.net.crt | openssl md5


Строка MD5-хеша короткая, и выявление различий между ними не составит труда.

Формируем типовой набор файлов сертификатов и ключей.

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

В общем, в процессе у нас может скопиться несколько файлов, которые я именую соответственно их функционалу, примерно так:

"example.net.key" - контейнер с "закрытым" и "открытым" ключами (защищённый паролем);
"example.net.key.decrypt" - незащищённый паролем контейнер с "закрытым" и "открытым" ключами;
"example.net.csr" - CSR-запрос, использовавшийся при заказе сертификата;
"example.net.crt" - непосредственно наш X.509-сертификат;
"intermediate.crt" - сертификат (или цепочка таковых) центра сертификации;
"root.crt" - сертификат корневого центра, от которого начинается цепь доверия.


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

$ cd ./make-cert
$ cat ./example.net.crt >> ./example.net-chain.crt
$ сat ./intermediate.crt >> ./example.net-chain.crt
$ cat ./root.crt >> ./example.net-chain.crt


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

В Linux-е для сертификатов и ключей шифрования уже предусмотрены места в файловой системе. Распределяем файлы и защищаем их от доступа посторонних:

# mkdir -p /etc/ssl/certs
# mkdir -p /etc/ssl/private

# cp ./example.net-chain.crt /etc/ssl/certs/
# cp ./example.net.key.decrypt /etc/ssl/private/

# chown -R root:root /etc/ssl
# chmod -R o-rwx /etc/ssl


SSL-сертификат в web-сервере Nginx.

В самом простом случае применение SSL-сертификата в web-сервере "Nginx" реализуется примерно следующим образом:

# vi /etc/nginx/sites-enabled/example.net.conf


....

server {
listen 443 ssl;
server_name example.net;
....


ssl on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES256-SHA:RC4:HIGH:!aNULL:!MD5:!kEDH;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:30m;
ssl_session_timeout 1h;


ssl_certificate /etc/ssl/certs/example.net-chain.crt;
ssl_certificate_key /etc/ssl/private/example.net.key.decrypt;
....
}
....


SSL-сертификат в web-сервере Apache.

В web-сервере "Apache" SSL-сертификат применяется примерно так:

# vi /etc/apache2/sites-enabled/example.net.conf


....
# Описание рабочего окружения доступного по HTTPS web-сайта

ServerName example.net
....


# Рекомендуемые обобщённые настройки протокола
SSLEngine on
SSLProtocol all -SSLv2
SSLHonorCipherOrder on
SSLCipherSuite HIGH:MEDIUM:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!aECDH:+SHA1:+MD5:+HIGH:+MEDIUM
SSLOptions +StrictRequire
SSLCompression off

# Файлы сертификатов и ключей
SSLCertificateFile /etc/ssl/certs/example.net-chain.crt
SSLCertificateKeyFile /etc/ssl/certs/example.net.key.decrypt

....

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

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

Несимметричные системы устроены так, что в них существует два числа:

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

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

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

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

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

Цифровая подпись

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

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

Еще раз подчеркнем, что условие доступности данного закрытого ключа только его владельцу, играет очень важную роль: если оно выполняется, то пользователь не может отказаться от своей цифровой подписи. Это называется non-repudiation.

Одно из применений цифровой подписи — аутентификация объекта. Аутентификация — это процесс установления «личности» объекта. Понятно, что если объект может поставить цифровую подпись, то эта подпись может быть проверена, а объект связан со своим открытым ключом. Последний ингридиент, которого не хватает в этой схеме для аутентификации — это момент связывания открытого ключа и самого объекта: мы должны точно знать, кто именно владеет этим открытым ключом.

Удостоверяющий центр (Certification Authority)

Проблема связывания открытого ключа и некоего объекта может решаться разными способами. Один из самых простых подходов — это составить список соответствия открытых ключей и »имен« объектов. В качестве имени может выступать любой идентификатор, например доменное имя машины, полные имя, фамилия и отчество человека и т.д.; проблема уникальности имен, которая обязательно должна появляется — это отдельная трудность, которая обычно решается административными способами типа иерархической системы пространства имен и некоторой системы разрешения конфликтов имен внутри одного подпространства имен. Здесь эта проблема более освещаться не будет.

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

Поэтому были введены понятия X.509-сертификата и удостоверяющего центра. X.509-сертификат (далее, просто сертификат) — это конгломерат из открытого ключа пользователя, пользовательской информации, имени сертификата, называемого Distungiushed Name (DN) и цифровой подписи удостоверяющего центра, которая скрепляет все эти данные друг с другом. То есть появляется возможность связать открытый ключ и DN пользователя, что может служить искомым ингридиентом процесса аутентификации, если в качестве идентификатора пользователя используется Distinguished Name его сертификата. Кстати говоря, у сертификата есть срок действия, который ограничивает срок соответствия, создаваемого удостоверяющим центром.

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

Зачем нужна аутентификация? Одного шифрования недостаточно?

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

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

То есть введение удостоверяющего центра позволяет нам аутентфифцировать обеъкт, который владеет данным сертификатом. Естественно, перед этим мы должны довериться открытому ключу удостоверяющего центра. Это подразумевает две вещи:

  1. доверие удостоверяющему центру вообще, то есть доверие его репутации,
  2. уверенность в том, что тот открытый ключ, который к вам попал, действительно является открытым ключом данного удостоверяющего центра.
Из последнего пункта видно, что опять появляется проблема аутентификации открытых ключей удостоверяющих центров. Но поскольку этих центров существенно меньше, чем пользователей, то можно прибегать к административным мерам:
  • звонить в удостоверяющий центр и сверять содержимое открытого ключа по телефону,
  • приезжать в сам удостоверяющий центр и забирать открытый ключ на каком-то носителе,
  • доверяться тем открытым ключам удостоверяющих центров, которые уже присутствуют в составе какого-то программного пакета
  • и множество других способов, которые еще неудобнее уже названных;))

Proxy-сертификаты

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

Что же еще? В многокомпонентных системах очень удобно то, что называется Single Sign-On — возможность аутентифицироваться вручную только один раз, а все остальные операции аутентификации будут проводиться автоматически. Обычно это актуально в системах, которые первоначально вас аутентифицируют, а потом система начинает выполнять действия от вашего лица, например, получать данные, запускать задачи, публиковать их результаты и т.д. Это называется делегированием.

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

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

  1. Проверяется подпись, созданная сервисом. При этом используется открытый ключ, который был передан вместе с подписью.
  2. Аутентифицируется открытый ключ, которым была проверена подпись. Сначала проверяется подпись на proxy-сертификате, которая была создана с помощью закрытого ключа пользователя. Это делается с помощью открытого ключа пользователя.
  3. Таким же образом аутентифицируется открытый ключ самого пользователя, но здесь уже используются данные об удостоверяющем центре.
В результате этого строится то, что называется цепочкой доверия (chain of trust), которая начинается на какой-то цифровой подписи и заканчивается на цифровой подписи удостоверяющего центра.

С помощью такого же механизма, сервис, которому первоначально был выдан proxy-сертификат, может подписать еще один proxy-сертификат, делегировав полномочия пользователя пользователя по цепочке другому сервису. Именно так и реализуется Single Sign-On.

  • X.509 Style Guide , написанный Питером Гутманном. Там много технических деталей, но некоторым почитать вполне стоит.

Формат сертификата Х.509

Х.509 - это другой очень распространённый формат. Все сертификаты Х.509 соответствуют международному стандарту ITU-T X.509; таким образом (теоретически), сертификат Х.509, созданный для одного приложения, может быть использован в любом другом, поддерживающем этот стандарт. На практике, однако, сложилась ситуация, что разные компании создают собственные расширения для Х.509, не все из которых между собой совместимы.

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

Сертификат Х.509 - это набор стандартных полей, содержащих сведения о пользователе или устройстве, и их соответствующий открытый ключ. Стардарт Х.509 определяет, какие сведения входят в сертификат и как они кодируются (формат данных).

Сертификат Х.509 содержит следующие сведения:

Версия Х.509 - указывает, на основе какой версии стандарта Х.509 построен данный сертификат, что определяет, какая информация может в нём содержаться.

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

Серийный номер сертификата - организация-издатель сертификата обязана присвоить ему уникальный серийный (порядковый) номер для его опознавания среди прочих сертификатов, выданных данной организацией. Эта информация применяется в ряде случаев; например, при аннулировании сертификата, его серийный номер помещается в список аннулированных сертификатов (Certificate Revocation List, CRL).

Уникальный опознаватель владельца ключа (или DN, distinguished name - уникальное имя) - это имя должно быть уникальным и единственным во всём Интернете. DN состоит из нескольких подпунктов и может выглядеть примерно так:

CN=Bob Davis, [email protected], OU=PGP Engineering,

O=PGP Corporation, C=US

(Что обозначает Понятное имя субъекта, Электронную почту, Подразделение организации, Организацию и Страну соответственно.)

Период действия сертификата - дата начала действия сертификата и дата окончания его действия; указывает на то, когда сертификат станет недействителен.

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

ЭЦП издателя - электронная подпись, созданная закрытым ключом организации, выдавшей сертификат. Идентификатор алгоритма подписи - указывает алгоритм, использованный ЦС для подписания сертификата.

Существует ряд фундаментальных различий между форматами сертификатов Х.509 и PGP:

вы можете лично создать собственный сертификат PGP;

вы должны запросить и получить сертификат Х.509 от Центра сертификации; сертификаты Х.509 содержат только одно имя владельца сертификата;

сертификаты Х.509 содержат только одну ЭЦП, подтверждающую подлинность сертификата.

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

Формат сертификата Х.509

Х.509 - это другой очень распространённый формат. Все сертификаты Х.509 соответствуют международному стандарту ITU-T X.509; таким образом (теоретически), сертификат Х.509, созданный для одного приложения, может быть использован в любом другом, поддерживающем этот стандарт. На практике, однако, сложилась ситуация, что разные компании создают собственные расширения для Х.509, не все из которых между собой совместимы.

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

Сертификат Х.509 - это набор стандартных полей, содержащих сведения о пользователе или устройстве, и их соответствующий открытый ключ. Стардарт Х.509 определяет, какие сведения входят в сертификат и как они кодируются (формат данных).

Сертификат Х.509 содержит следующие сведения:

Версия Х.509 - указывает, на основе какой версии стандарта Х.509 построен данный сертификат, что определяет, какая информация может в нём содержаться.

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

Серийный номер сертификата - организация-издатель сертификата обязана присвоить ему уникальный серийный (порядковый) номер для его опознавания среди прочих сертификатов, выданных данной организацией. Эта информация применяется в ряде случаев; например, при аннулировании сертификата, его серийный номер помещается в список аннулированных сертификатов (Certificate Revocation List, CRL).

Уникальный опознаватель владельца ключа (или DN, distinguished name - уникальное имя) - это имя должно быть уникальным и единственным во всём Интернете. DN состоит из нескольких подпунктов и может выглядеть примерно так:

CN=Bob Davis, [email protected], OU=PGP Engineering,

O=PGP Corporation, C=US

(Что обозначает Понятное имя субъекта, Электронную почту, Подразделение организации, Организацию и Страну соответственно.)

Период действия сертификата - дата начала действия сертификата и дата окончания его действия; указывает на то, когда сертификат станет недействителен.

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

ЭЦП издателя - электронная подпись, созданная закрытым ключом организации, выдавшей сертификат. Идентификатор алгоритма подписи - указывает алгоритм, использованный ЦС для подписания сертификата.

Существует ряд фундаментальных различий между форматами сертификатов Х.509 и PGP:

вы можете лично создать собственный сертификат PGP;

вы должны запросить и получить сертификат Х.509 от Центра сертификации; сертификаты Х.509 содержат только одно имя владельца сертификата;

сертификаты Х.509 содержат только одну ЭЦП, подтверждающую подлинность сертификата.

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

Вы можете представить сертификат Х.509, как обычный бумажный сертификат или аттестат с приклеенным к нему открытым ключом. На нём указано ваше имя, а также некоторые сведения о вас, плюс подпись издателя сертификата.

Вероятно, наибольшая польза от сертификатов Х.509, это их применение в Веб-браузерах.

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

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

Из книги Инфраструктуры открытых ключей автора Полянская Ольга Юрьевна

Создание собственного сертификата Наиболее быстрым способом создания собственного цифрового сертификата является использование программы SelfCert.exe, входящей в состав Microsoft Office 2000/ХР. Запустив эту утилиту, мы получим диалоговое окно, позволяющее задать имя создаваемого

Из книги Яндекс для всех автора Абрамзон М. Г.

Дополнения сертификата Важная информация находится также в дополнениях сертификата. Они позволяют включать в сертификат информацию, которая отсутствует в основном содержании, определять валидность сертификата и наличие у владельца сертификата прав доступа к той или

Из книги Введение в криптографию автора Циммерманн Филипп

Онлайновый протокол статуса сертификата Онлайновый протокол статуса сертификата OCSP - относительно простой протокол (типа "запрос-ответ") для получения информации об аннулировании от доверенного субъекта, называемого OCSP-респондером. OCSP-запрос состоит из номера версии

Из книги Операционная система UNIX автора Робачевский Андрей М.

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

Из книги автора

Проверка срока действия сертификата Эта проверка завершается успешно, если текущие дата и время на момент валидации находятся в пределах срока действия

Из книги автора

Проверка статуса сертификата Эта проверка завершается успешно, если издатель не аннулировал данный сертификат. Основным средством проверки статуса сертификата являются списки САС, но могут использоваться и другие альтернативные средства

Из книги автора

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

Из книги автора

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

Из книги автора

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

Из книги автора

3.3.1. Формат RSS Читать новости сайтов можно по-разному. Самый простой способ - заходить время от времени на сайт и просматривать новые сообщения. Можно поставить программу, которая подключается к новостному каналу и сама получает заголовки или аннотации новостей, по

Из книги автора

Формат сертификата Х.509 Х.509 - это другой очень распространённый формат. Все сертификаты Х.509 соответствуют международному стандарту ITU-T X.509; таким образом (теоретически), сертификат Х.509, созданный для одного приложения, может быть использован в любом другом,

Из книги автора

Аннулирование сертификата Применение сертификата допустимо только пока он достоверен. Опасно полагаться на то, что сертификат будет защищён и надёжен вечно. В большинстве организаций и во всех PKI сертификат имеет ограниченный срок "жизни". Это сужает период, в который

Из книги автора

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

Из книги автора

Формат ELF Формат ELF имеет файлы нескольких типов, которые до сих пор мы называли по-разному, например, исполняемый файл или объектный файл. Тем не менее стандарт ELF различает следующие типы:1. Перемещаемый файл (relocatable file), хранящий инструкции и данные, которые могут быть

Создание сертификатов

Первое, что сделаем, это создадим серверный и клиентские сертификаты. Нужна програмка openssl.exe (у меня установлен xampp , в нём есть всё, что нужно – вам его тоже советую). Итак, в папке /сервер/apache/bin находим openssl.exe и создаём файлы ca.config и openssl.cnf. Также, создадим папку db, а в ней папки certs, newcerts, пустые текстовые файлы index.txt и serial (внутри этого файла написать “01” без ковычек.)

Содержимое файла ca.config

[ ca ]
default_ca = CA_CLIENT # При подписи сертификатов
# использовать секцию CA_CLIENT

[ CA_CLIENT ]
dir = ./db # Каталог для служебных файлов
certs = $dir/certs # Каталог для сертификатов
new_certs_dir = $dir/newcerts # Каталог для новых сертификатов
database = $dir/index.txt # Файл с базой данных
# подписанных сертификатов
serial = $dir/serial # Файл содержащий серийный номер
# сертификата
# (в шестнадцатиричном формате)
certificate = ./ca.crt # Файл сертификата CA
private_key = ./ca.key # Файл закрытого ключа CA

default_days = 365 # Срок действия подписываемого
# сертификата
default_crl_days = 7 # Срок действия CRL (см. $4)
default_md = md5 # Алгоритм подписи

policy = policy_anything # Название секции с описанием
# политики в отношении данных
# сертификата

[ policy_anything ]
countryName = optional # Код страны – не обязателен
stateOrProvinceName = optional # ……
localityName = optional # ……
organizationName = optional # ……
organizationalUnitName = optional # ……
commonName = supplied # …… – обязателен
emailAddress = optional # ……

Содержимое файла openssl.cnf

# =================================================
# OpenSSL configuration file
# =================================================
RANDFILE = .rnd
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = .
certs = $dir
new_certs_dir = $dir
crl_dir = $dir
database = $dir/db/index.txt
private_key = $dir/ca.key
certificate = $dir/ca.crt
serial = $dir/db/serial
crl = $dir/crl.pem
RANDFILE = $dir/db/private/.rand
default_days = 365
default_crl_days = 30
default_md = sha1
preserve = no
policy = policy_anything
name_opt = ca_default
cert_opt = ca_default
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 1024
default_md = sha1
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
x509_extensions = v3_ca
string_mask = nombstr
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, YOUR name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ usr_cert ]
basicConstraints = CA:FALSE
# nsCaRevocationUrl = https://url-to-exposed-clr-list/crl.pem
[ ssl_server ]
basicConstraints = CA:FALSE
nsCertType = server

extendedKeyUsage = serverAuth, nsSGC, msSGC
nsComment = «OpenSSL Certificate for SSL Web Server»
[ ssl_client ]
basicConstraints = CA:FALSE
nsCertType = client
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
nsComment = «OpenSSL Certificate for SSL Client»
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
[ v3_ca ]
basicConstraints = critical, CA:true, pathlen:0
nsCertType = sslCA
keyUsage = cRLSign, keyCertSign
extendedKeyUsage = serverAuth, clientAuth
nsComment = «OpenSSL CA Certificate»
[ crl_ext ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
nsComment = «OpenSSL generated CRL»

открываем cmd.exe (Пуск –> Выполнить –> cmd –> enter), далее запускаем через cmd программу openssl.exe и приступаем непосредственно к созданию наших сертификатов.

1) создаём серверный ключ и сертификат

req -new -x509 -days 365 -sha1 -newkey rsa:1024 -nodes -keyout server.key -out server.crt -subj ‘/O=НазваниеКомпании/OU=Подразделение/CN=localhost’

Укажите здесь название вашей компании, подразделения, а также доменное имя.

req -config openssl.cnf -new -x509 -days 3652 -sha1 -newkey rsa:1024 -keyout ca.key -out ca.crt -subj ‘/O=Организация/OU=Подразделение’

Укажите здесь название вашей компании, подразделения.

3) создаём пользовательские сертификаты

  • req -new -sha1 -newkey rsa:1024 -nodes -keyout server.key -out request.pem -subj ‘/O=Skif Grid/OU=PSI RAS/CN=localhost’
  • ca -config openssl.cnf -policy policy_anything -extensions ssl_server -out signed.pem -infiles request.pem
  • x509 -in signed.pem -out server.crt
  • openssl pkcs12 -export –in signed.pem –inkey server.key -certfile ca.crt -name «Имя\Отчество» -out user.p12

Получившееся ca.crt и user.p12 импортируем в браузер. С сертификатами покончено, теперь пришло время Apach’a.

Настройка Apache

Открываем файл /сервер/apache/conf/extra/httpd-ssl.conf, стираем всё, что там есть и копируем туда следующее:

ErrorLog D:/www/apache/logs/ssl_error.log
LogLevel warn

AddType application/x-x509-ca-cert .crt .pem
AddType application/x-pkcs7-crl .crl
AddType application/x-pkcs12-cert .p12

SSLPassPhraseDialog builtin
SSLSessionCache dbm:logs/ssl.scache
SSLSessionCacheTimeout 300
SSLMutex default
SSLOptions +StdEnvVars +ExportCertData +StrictRequire

NameVirtualHost *:443

AddDefaultCharset utf-8
AddCharset utf-8 *

DocumentRoot «D:/www/htdocs»
ServerName http://www.youhost.ru:443
ServerAdmin [email protected]
ErrorLog D:/www/apache/logs/ssl_error1.log

SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLProtocol all -SSLv2
SSLOptions +StdEnvVars +ExportCertData

SSLCertificateFile conf/ssl/server.crt
SSLCertificateKeyFile conf/ssl/server.key
SSLCACertificateFile conf/ssl/ca/ca.crt

SSLVerifyClient require
SSLVerifyDepth 1

SSLProxyEngine off


SetEnvIf User-Agent ..*MSIE.*. nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

Если мы хотим сделать авторизацию не обязательной (скажем, чтобы, если у пользователя не будет сертификата, то показать ему красивую страничку с надписью, скажем – получите сначала сертификат), то SSLVerifyClient поставьте как optional.




Top