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

Перевод статьи: How to create and administer X.509 Certificate chains, Part I

Автор: Дитер Клюнтер (Dieter Klünter)

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

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

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

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

Важно! Этот корневой ключ нужно оберегать

Сначала приготовим файл с паролем:

$ touch myPassfile
$ chmod 0600 myPassfile
$ echo 'secret' > myPassfile

Теперь создадим корневой ключ для подписания:

$ openssl genrsa \
  -des3 \
  -passout file:myPassfile \
  -out privateRoot.key \
  2048

Эта команда создаст ключ для подписания с именем privateRoot.key размером 2048 бит, защищённый паролем. На странице руководства genrsa(1) можно найти дополнительную информацию о доступных параметрах.

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

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

$ 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, который можно использовать для подписания сертификатов узлов и пользователей.

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

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

Сначала приготовим файл 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

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

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

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

Сначала создадим файл 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 будет рассмотрено администрирование сертификатов, обслуживание серийного файла и файла индекса.

4. Примечание переводчика

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

Написать автору перевода