Перевод статьи: 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) можно найти дополнительную информацию о доступных параметрах.
Перед созданием удостоверяющего центра и цепочки сертификатов нужно предпринять ряд шагов, которые облегчат дальнейшие действия.
Для создания последовательного файла просто выполните следующие команды:
$ 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.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.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. Перевод этого руководства будет опубликован в дальнейших заметках этого блога. Следите за обновлениями.