воскресенье, 27 ноября 2016 г.

Как создавать и администрировать цепочки сертификатов X.509, часть I

Перевод: How to create and administer X.509 Certificate chains, Part I
Автор: Дитер Клюнтер (Dieter Klünter)

Сертификаты X.509 широко используются для обеспечения безопасной передачи данных и проверки целостности. Первая часть описывает создание частного удостоверяющего центра и сертификатов узла, а вторая часть имеет дело с администрированием сертификатов. Третья часть позволит вам создать собственные инструменты администрирования на основе Bash и Perl. Приведённые ниже примеры основаны на OpenSSL. В этой части мы опишем шаги, необходимые для генерации:
  • корневого ключа для подписания,
  • частного удостоверяющего центра,
  • ключа узла и частного подписанного сертификата,
  • ключа пользователя и частного подписанного сертификата.
Если у вас имеется доступ к доверенному общедоступному удостоверяющему центру, вы можете пропустить шаги инструкции по созданию своего собственного удостоверяющего центра и перейти к инструкции по созданию сертификата узла или пользователя.

Создание удостоверяющего центра

Для подписания сертификатов нужно сначала обзавестись корневым ключом для подписания.
Важно! Этот корневой ключ нужно оберегать
Сначала приготовим файл с паролем:
$ touch myPassfile
$ chmod 0600 myPassfile
$ echo 'secret' > myPassfile
Теперь создадим корневой ключ для подписания:
$ openssl genrsa \
  -des3 \
  -passout file:myPassfile \
  -out privateRoot.key \
  2048
Эта команда создаст ключ для подписания с именем privateRoot.key размером 2048 бит, защищённый паролем. На странице руководства genrsa(1) можно найти дополнительную информацию о доступных параметрах.

Перед созданием удостоверяющего центра и цепочки сертификатов нужно предпринять ряд шагов, которые облегчат дальнейшие действия.
  • Файл конфигурации с параметрами для инициирования удостоверяющего центра, myCA.conf
  • Файл конфигурации с параметрами для инициирования сертификата узла, host.conf
  • Файл конфигурации с дополнительными параметрами X.509 для инициирования удостоверяющего центра, myCA.ext
  • Файл конфигурации с дополнительными параметрами X.509 для инициирования сертификата узла, host.ext
  • Последовательный файл для административных нужд, myCA.serial
Для создания последовательного файла просто выполните следующие команды:
$ touch myCA.serial
$ chmod 0644 myCA.serial
$ echo '00' > myCA.serial
Теперь подготовим необходимые файлы конфигурации для инициации удостоверяющего центра.

myCA.conf:
[req]
default_bits                   = 2048
distinguished_name             = req_DN
string_mask                    = nombstr

[req_DN]
countryName                    = "1. Название страны (двухбуквенный код)"
countryName_default            = DE
countryName_min                = 2
countryName_max                = 2
stateOrProvinceName            = "2. Название штата или провинции (полное название)"
#stateOrProvinceName_default =
localityName                   = "3. Название местности (например, город)"
localityName_default           = Гамбург
0.organizationName             = "4. Название организации (например, компания)"
0.organizationName_default     = Моя организация
organizationalUnitName         = "5. Название подразделения (например, отдел)"
organizationalUnitName_default = Центр сертификации
commonName                     = "6. Простое имя (например, название центра сертификации)"
commonName_max                 = 64
commonName_default             = Мой собственный центр сертификации
emailAddress                   = "7. Адрес электронной почты (например, имя@полное_доменное_имя)"
emailAddress_max               = 40
emailAddress_default           = admin@example.com
myCA.ext:
extensions            = x509v3

[x509v3]
basicConstraints      = CA:true,pathlen:0
crlDistributionPoints = URI:http://example.com/ca/myca.crl
nsCertType            = sslCA,emailCA,objCA
nsCaPolicyUrl         = "http://example.com/ca/policy.html"
nsCaRevocationUrl     = "http://example.com/ca/myca.crl"
nsComment             = "Мой собственный центр сертификации"
Для облегчения администрирования любой удостоверяющий центр должен предоставлять информацию о точках распространения, политике URL и URL списка отозванных сертификатов.

Чтобы создать запрос на сертификат, нужно предоставить некоторую информацию удостоверяющему центру, для чего надо создать myCA.conf. В этом файле конфигурации задаются значения по умолчанию, что позволяет изменять значения в соответствии с требованиями. Создадим запрос на подпись сертификата (Certificate Signing Request) на основе предоставленной информации:
$ openssl req \
  -config myCA.conf \
  -new \
  -key privateRoot.key \
  -passin file:myPassfile \
  -out myPrivateCA.csr
Для подписания этого запроса на сертификат приготовим файл конфигурации с дополнительными параметрами удостоверяющего центра myCA.ext, как это было описано выше.
$ openssl x509 \
  -days 3650 \
  -extfile myCA.ext \
  -signkey privateRoot.key \
  -CAserial myCA.serial \
  -passin file:myPassfile \
  -in myPrivateCA.csr \
  -req \
  -out myPrivateCA.crt
Теперь у нас есть удостоверяющий центр в формате PEM, который можно использовать для подписания сертификатов узлов и пользователей.

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

Веб-сервер, SMTP-сервер, IMAP-сервер, LDAP-сервер и многие другие требуют безопасный транспортный слой (Transport Layer Security), проверку целостности клиентских приложений и служебных узлов. Чтобы включить это требование, сертификат узла должен быть соответствующим образом подписан удостоверяющим центром. В этой главе описано создание:
  • приватного ключа узла
  • сертификата узла
  • файла конфигурации host.conf
  • файл конфигурации host.ext
Сначала приготовим файл host.conf.

host.conf:
[req]
default_bits                   = 2048
distinguished_name             = req_DN
string_mask                    = nombstr

[req_DN]
countryName                    = "1. Название страны (двухбуквенный код)"
countryName_default            = DE
countryName_min                = 2
countryName_max                = 2
stateOrProvinceName            = "2. Название штата или провинции (полное название)"
#stateOrProvinceName_default =
localityName                   = "3. Название местности (например, город)"
localityName_default           = Гамбург
0.organizationName             = "4. Название организации (например, компания)"
0.organizationName_default     = Моя организация
organizationalUnitName         = "5. Название подразделения (например, отдел)"
organizationalUnitName_default = Мой сервер
commonName                     = "6. Простое имя (например, название центра сертификации)"
commonName_max                 = 64
commonName_default             = host.example.com
emailAddress                   = "7. Адрес электронной почты (например, имя@полное_доменное_имя)"
emailAddress_max               = 40
emailAddress_default           = admin@example.com
host.ext:
extensions       = x509v3

[x509v3]
nsCertType       = server
keyUsage         = digitalSignature,nonRepudiation,keyEncipherment
extendedKeyUsage = msSGC,nsSGC,serverAuth
subjectAltName   = DNS:ldap.example.com

Атрибут типа commonName принимает в качестве значения полное имя узла. Атрибут типа subjectAltName позволяет указать несколько псевдонимов узлов, разделённых запятыми.

Сначала создадим приватный ключ узла:
$ touch hostPassfile
$ chmod 0600 hostPassfile
$ echo 'secret' > hostPassfile
$ openssl genrsa \
  -des3 \
  -passout file:hostPassfile \
  -out myHost.key \
  2048
Совет. Если вы не хотите использовать ключ узла, защищённый паролем, воспользуйтесь такой командой:
$ openssl genrsa -out myHost.key 2048
Следующая команда создаст запрос на подпись сертификата:
$ openssl req \
  -config host.conf \
  -new \
  -key myHost.key \
  -passin file:hostPassfile \
  -out MyHost.csr
И наконец, можно подписать сертификат узла:
$ openssl x509 \
  -days 1825 \
  -extfile host.ext \
  -CA myPrivateCA.crt \
  -CAkey privateRoot.key
  -passin file:myPassfile \
  -CAserial myCA.serial \
  -in MyHost.csr \
  -req \
  -out myHost.crt
Теперь у нас есть сертификат узла, ключ сертификата узла и удостоверяющий центр. Далее мы подготовим сертификат пользователя.

Создание сертификата пользователя

Обычно сертификаты пользователя используются для аутентификации и подписания электронных писем. Как и в прошлый раз, для создания ключа пользователя и сертификата пользователя нужны те же шаги. Дополнительно в файл pkcs12 можно поместить полную цепочку сертификатов. Как и в случае сертификатов узлов, нужны несколько подготовительных шагов:
  • файл user.conf
  • файл user.ext
  • ключ пользователя
  • сертификат пользователя
Сначала создадим файл user.conf.

user.conf:
[req]
default_bits                   = 2048
distinguished_name             = req_DN
string_mask                    = nombstr

[req_DN]
countryName                    = "1. Название страны (двухбуквенный код)"
countryName_default            = DE
countryName_min                = 2
countryName_max                = 2
stateOrProvinceName            = "2. Название штата или провинции (полное название)"
#stateOrProvinceName_default =
localityName                   = "3. Название местности (например, город)"
localityName_default           = Гамбург
0.organizationName             = "4. Название организации (например, компания)"
0.organizationName_default     = Моя организация
organizationalUnitName         = "5. Название подразделения (например, отдел)"
organizationalUnitName_default = Люди
commonName                     = "6. Простое название (например, название центра сертификации)"
commonName_max                 = 64
commonName_default             = Пол Смит
emailAddress                   = "7. Адрес электронной почты (например, имя@полное_доменное_имя)"
emailAddress_max               = 40
emailAddress_default           = paul@example.com

Этот набор данных создаст сертификат с выделенным именем:
dn: cn=Пол Смит,ou=Люди,o=Моя организация,c=DE
user.ext:
extensions = x509v3

[x509v3]
nsCertType = client,email,objsign
keyUsage   = digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
Сначала создадим файл с приватным паролем и с приватным ключом:
$ touch userPassfile
$ chmod 0600 userPassfile
$ echo 'secret' > userPassfile
$ openssl genrsa \
  -des3 \
  -passout file:userPassfile \
  -out myUser.key \
  2048
Далее создадим запрос на подписание сертификата пользователя:
$ openssl req \
  -config user.conf \
  -new \
  -key myUser.key \
  -passin file:userPassfile \
  -out MyUser.csr
И наконец, подпишем сертификат пользователя:
$ openssl x509 \
  -days 1825 \
  -extfile user.ext \
  -CA myPrivateCA.crt \
  -CAkey privateRoot.key
  -passin file:myPassfile \
  -CAserial myCA.serial \
  -in MyUser.csr \
  -req \
  -out myUser.crt
Теперь у нас есть правильная цепочка сертификатов, которая позволит нам создать архив pkcs12:
$ openssl pkcs12 \
  -export \
  -in myUser.crt \
  -inkey myUser.key \
  -passin file:userPassfile \
  -CAfile myPrivateCA.crt \
  -name MyUsercertificate \
  -out myUser.pkcs12
В части II будет рассмотрено администрирование сертификатов, обслуживание серийного файла и файла индекса.

Примечание переводчика: Вторая часть пока не опубликована автором, поэтому пока не будет и её перевода. Зато я нашёл другое более подробное руководство по администрированию собственного удостоверяющего центра на основе OpenSSL. Перевод этого руководства будет опубликован в дальнейших заметках этого блога. Следите за обновлениями.

Комментариев нет: