Автор: Реми ван Элст (Remy van Elst)
Содержание:
- Корневой удостоверяющий центр
- Создание промежуточного удостоверяющего центра 1
- Настройка промежуточного удостоверяющего центра 1
- Создание конечных пользовательских сертификатов
- Проверка сертификата
Мы создадим наш собственный корневой удостоверяющий центр. Мы воспользуемся этим корневым удостоверяющим центром для создания промежуточного удостоверяющего центра. Мы воспользуемся этим промежуточным удостоверяющим центром, чтобы подписать сертификаты конечных пользователей.
Корневой удостоверяющий центр
Создадим и переместим в каталог корневой удостоверяющий центр:mkdir ~/SSLCA/root/ cd ~/SSLCA/root/Создадим ключ SHA-256 RSA длиной 8192 бит для нашего корневого удостоверяющего центра:
openssl genrsa -aes256 -out rootca.key 8192Пример вывода:
Generating RSA private key, 8192 bit long modulus # Создание приватного ключа, с модулем длиной 8192 бит .........++ ....................................................................................................................++ e is 65537 (0x10001) # e равно 65537 (0x10001)Если хотите защитить этот ключ паролем, добавьте опцию -passout pass:пароль или -passout file:файл_с_паролем.
Создадим самозаверенный сертификат удостоверяющего центра ca.crt. Нужно предоставить идентификационные данные вашего корневого удостоверяющего центра:
openssl req -sha256 -new -x509 -days 1826 -key rootca.key -out rootca.crtПример вывода:
You are about to be asked to enter information that will be incorporated # У вас будет запрошена информация, которая будет вставлена into your certificate request. # в ваш запрос сертификата. What you are about to enter is what is called a Distinguished Name or a DN. # То, что вы введёте, называется Distinquised Name - Отличительное Имя или DN. There are quite a few fields but you can leave some blank # Далее следует несколько полей, но некоторые из них можно не заполнять For some fields there will be a default value, # У некоторых полей есть значение по умолчанию, If you enter '.', the field will be left blank. # Если ввести '.', то поле останется пустым. ----- Country Name (2 letter code) [AU]:NL # Название страны (двухбуквенный код) [AU]:NL State or Province Name (full name) [Some-State]:Zuid Holland # Название штата или провинции (полное название) [Некий-штат]:Южная Голландия Locality Name (eg, city) []:Rotterdam # Название местности (например, город) []:Роттердам Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sparkling Network # Название организации (например, компания) [ООО Интернет-виджеты]:Искрящая сеть Organizational Unit Name (eg, section) []:Sparkling CA # Название подразделения (например, отдел) []:Искрящий удостоверяющий центр Common Name (e.g. server FQDN or YOUR name) []:Sparkling Root CA # Общее имя (например, полное доменное имя сервера или ваше имя) []:Искрящий корневой удостоверяющий центр Email Address []: # Адрес электронной почты []:Создадим несколько файлов, в которых удостоверяющий центр будет хранить серийные номера:
touch certindex echo 1000 > certserial echo 1000 > crlnumberСоздадим файл конфигурации удостоверяющего центра. Этот файл содержит заглушки для конечных точек CRL - списка отозванных сертификатов и OCSP - протокола интерактивного статуса сертификата.
# vim ca.conf
[ca] default_ca = myca [crl_ext] issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always [myca] dir = ./ new_certs_dir = $dir unique_subject = no certificate = $dir/rootca.crt database = $dir/certindex private_key = $dir/rootca.key serial = $dir/certserial default_days = 730 default_md = sha1 policy = myca_policy x509_extensions = myca_extensions crlnumber = $dir/crlnumber default_crl_days = 730 [myca_policy] commonName = supplied stateOrProvinceName = supplied countryName = optional emailAddress = optional organizationName = supplied organizationalUnitName = optional [myca_extensions] basicConstraints = critical,CA:TRUE keyUsage = critical,any subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign extendedKeyUsage = serverAuth crlDistributionPoints = @crl_section subjectAltName = @alt_names authorityInfoAccess = @ocsp_section [v3_ca] basicConstraints = critical,CA:TRUE,pathlen:0 keyUsage = critical,any subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign extendedKeyUsage = serverAuth crlDistributionPoints = @crl_section subjectAltName = @alt_names authorityInfoAccess = @ocsp_section [alt_names] DNS.0 = Sparkling Intermidiate CA 1 # DNS.0 = Искрящий промежуточный удостоверяющий центр 1 DNS.1 = Sparkling CA Intermidiate 1 # DNS.1 = Искрящий удостоверяющий центр промежуточный 1 [crl_section] URI.0 = http://pki.sparklingca.com/SparklingRoot.crl URI.1 = http://pki.backup.com/SparklingRoot.crl [ocsp_section] caIssuers;URI.0 = http://pki.sparklingca.com/SparklingRoot.crt caIssuers;URI.1 = http://pki.backup.com/SparklingRoot.crt OCSP;URI.0 = http://pki.sparklingca.com/ocsp/ OCSP;URI.1 = http://pki.backup.com/ocsp/Если нужно задать определённые даты начала или завершения действия сертификата, добавьте в секцию [myca] следующие строки:
# формат: ГГГГММДДЧЧММСС default_enddate = 20191222035911 default_startdate = 20181222035911
Создание промежуточного удостоверяющего центра 1
Создание приватного ключа промежуточного удостоверяющего центра:openssl genrsa -out intermediate1.key 4096Создание CSR - запроса на подписание сертификата промежуточного удостоверяющего центра 1:
openssl req -new -sha256 -key intermediate1.key -out intermediate1.csrПример вывода:
You are about to be asked to enter information that will be incorporated # У вас будет запрошена информация, которая будет вставлена into your certificate request. # в ваш запрос сертификата. What you are about to enter is what is called a Distinguished Name or a DN. # То, что вы введёте, называется Distinquised Name - Отличительное Имя или DN. There are quite a few fields but you can leave some blank # Далее следует несколько полей, но некоторые из них можно не заполнять For some fields there will be a default value, # У некоторых полей есть значение по умолчанию, If you enter '.', the field will be left blank. # Если ввести '.', то поле останется пустым. ----- Country Name (2 letter code) [AU]:NL # Название страны (двухбуквенный код) [AU]:NL State or Province Name (full name) [Some-State]:Zuid Holland # Название штата или провинции (полное название) [Некий-штат]:Южная Голландия Locality Name (eg, city) []:Rotterdam # Название местности (например, город) []:Роттердам Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sparkling Network # Название организации (например, компания) [ООО Интернет-виджеты]:Искрящая сеть Organizational Unit Name (eg, section) []:Sparkling CA # Название подразделения (например, отдел) []:Искрящий удостоверяющий центр Common Name (e.g. server FQDN or YOUR name) []:Sparkling Intermediate CA # Общее имя (например, полное доменное имя сервера или ваше имя) []:Искрящий промежуточный удостоверяющий центр Email Address []: # Адрес электронной почты []: Please enter the following 'extra' attributes # Пожалуйста, введите следующие дополнительные атрибуты, to be sent with your certificate request # которые будут отправлены в составе запроса сертификата A challenge password []: # Пароль вызова []: An optional company name []: # Не обязательное название компании []:Удостоверьтесь, что Общее Имя (Common Name - CN) промежуточного сертификата отличается от корневого.
Подпишем корневым удостоверяющим центром запрос на подписание сертификата промежуточного удостоверяющего центра:
openssl ca -batch -config ca.conf -notext -in intermediate1.csr -out intermediate1.crtПример вывода:
Using configuration from ca.conf # Используется конфигурация из ca.conf Check that the request matches the signature # Проверка соответствия подписи запросу Signature ok # Подпись в порядке The Subject's Distinguished Name is as follows # Содержимое Отличительного Имени показано ниже countryName :PRINTABLE:'NL' stateOrProvinceName :ASN.1 12:'Zuid Holland' localityName :ASN.1 12:'Rotterdam' organizationName :ASN.1 12:'Sparkling Network' organizationalUnitName:ASN.1 12:'Sparkling CA' commonName :ASN.1 12:'Sparkling Intermediate CA' Certificate is to be certified until Mar 30 15:07:43 2017 GMT (730 days) # Сертификат был удостоверен до 30 марта 2017 года 15:07:43 по Гринвичу (730 дней) Write out database with 1 new entries # В базу данных записана 1 новая запись Data Base Updated # База данных обновленаСоздадим CRL - список отозванных сертификатов в форматах PEM и DER:
openssl ca -config ca.conf -gencrl -keyfile rootca.key -cert rootca.crt -out rootca.crl.pem openssl crl -inform PEM -in rootca.crl.pem -outform DER -out rootca.crlСоздавайте CRL - список отозванных сертификатов после каждого подписания сертификата удостоверяющим центром.
Если когда-нибудь понадобится отозвать этот промежуточный сертификат:
openssl ca -config ca.conf -revoke intermediate1.crt -keyfile rootca.key -cert rootca.crt
Настройка промежуточного удостоверяющего центра 1
Создадим новый каталог и переместим промежуточный удостоверяющий центр:mkdir ~/SSLCA/intermediate1/ cd ~/SSLCA/intermediate1/Скопируем сертификат промежуточного удостоверяющего центра и ключ из каталога корневого удостоверяющего центра:
cp ~/SSLCA/root/intermediate1.key ./ cp ~/SSLCA/root/intermediate1.crt ./Создадим файлы индекса:
touch certindex echo 1000 > certserial echo 1000 > crlnumberСоздадим новый файл ca.conf:
# vim ca.conf
[ca] default_ca = myca [crl_ext] issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always [myca] dir = ./ new_certs_dir = $dir unique_subject = no certificate = $dir/intermediate1.crt database = $dir/certindex private_key = $dir/intermediate1.key serial = $dir/certserial default_days = 365 default_md = sha1 policy = myca_policy x509_extensions = myca_extensions crlnumber = $dir/crlnumber default_crl_days = 365 [myca_policy] commonName = supplied stateOrProvinceName = supplied countryName = optional emailAddress = optional organizationName = supplied organizationalUnitName = optional [myca_extensions] basicConstraints = critical,CA:FALSE keyUsage = critical,any subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer keyUsage = digitalSignature,keyEncipherment extendedKeyUsage = serverAuth crlDistributionPoints = @crl_section subjectAltName = @alt_names authorityInfoAccess = @ocsp_section [alt_names] DNS.0 = example.com DNS.1 = example.org [crl_section] URI.0 = http://pki.sparklingca.com/SparklingIntermidiate1.crl URI.1 = http://pki.backup.com/SparklingIntermidiate1.crl [ocsp_section] caIssuers;URI.0 = http://pki.sparklingca.com/SparklingIntermediate1.crt caIssuers;URI.1 = http://pki.backup.com/SparklingIntermediate1.crt OCSP;URI.0 = http://pki.sparklingca.com/ocsp/ OCSP;URI.1 = http://pki.backup.com/ocsp/Отредактируйте секцию [alt_names] так, чтобы она содержала необходимые альтернативные имена. Если альтернативные имена не нужны, то удалите эту секцию и строку subjectAltName = @alt_names.
Если нужно задать определённые даты начала или завершения действия сертификата, добавьте в секцию [myca] следующие строки:
# формат: ГГГГММДДЧЧММСС default_enddate = 20191222035911 default_startdate = 20181222035911Создадим пустой CRL - список отозванных сертификатов в форматах PEM и DER:
openssl ca -config ca.conf -gencrl -keyfile rootca.key -cert rootca.crt -out rootca.crl.pem openssl crl -inform PEM -in rootca.crl.pem -outform DER -out rootca.crl
Создание конечных пользовательских сертификатов
Воспользуемся новым промежуточным удостоверяющим центром для создания конечного пользовательского сертификата. Повторим эти шаги для каждого конечного пользовательского сертификата, который нужно подписать этим удостоверяющим центром.mkdir enduser-certsСоздадим приватный ключ конечного пользователя:
openssl genrsa -out enduser-certs/enduser-example.com.key 4096Создадим CSR - запрос на подписание сертификата конечного пользователя:
openssl req -new -sha256 -key enduser-certs/enduser-example.com.key -out enduser-certs/enduser-example.com.csrПример вывода:
You are about to be asked to enter information that will be incorporated # У вас будет запрошена информация, которая будет вставлена into your certificate request. # в ваш запрос сертификата. What you are about to enter is what is called a Distinguished Name or a DN. # То, что вы введёте, называется Distinquised Name - Отличительное Имя или DN. There are quite a few fields but you can leave some blank # Далее следует несколько полей, но некоторые из них можно не заполнять For some fields there will be a default value, # У некоторых полей есть значение по умолчанию, If you enter '.', the field will be left blank. # Если ввести '.', то поле останется пустым. ----- Country Name (2 letter code) [AU]:NL # Название страны (двухбуквенный код) [AU]:NL State or Province Name (full name) [Some-State]:Noord Holland # Название штата или провинции (полное название) [Некий-штат]:Северная Голландия Locality Name (eg, city) []:Amsterdam # Название местности (например, город) []:Амстердам Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc # Название организации (например, компания) [ООО Интернет-виджеты]:АО Пример Organizational Unit Name (eg, section) [например, отдел]:IT Dept # Название подразделения (например, отдел) []:Отдел информационных технологий Common Name (e.g. server FQDN or YOUR name) []:example.com # Общее имя (например, полное доменное имя сервера или ваше имя) []:example.com Email Address []: # Адрес электронной почты []: Please enter the following 'extra' attributes # Пожалуйста, введите следующие дополнительные атрибуты, to be sent with your certificate request # которые будут отправлены в составе запроса сертификата A challenge password []: # Пароль вызова []: An optional company name []: # Не обязательное название компании []:Подпишем CSR - запрос на подписание сертификата конечного пользователя в промежуточном удостоверяющем центре 1:
openssl ca -batch -config ca.conf -notext -in enduser-certs/enduser-example.com.csr -out enduser-certs/enduser-example.com.crtПример вывода:
Using configuration from ca.conf # Используется конфигурация из ca.conf Check that the request matches the signature # Проверка соответствия подписи запросу Signature ok # Подпись в порядке The Subject's Distinguished Name is as follows # Содержимое Отличительного Имени показано ниже countryName :PRINTABLE:'NL' stateOrProvinceName :ASN.1 12:'Noord Holland' localityName :ASN.1 12:'Amsterdam' organizationName :ASN.1 12:'Example Inc' organizationalUnitName:ASN.1 12:'IT Dept' commonName :ASN.1 12:'example.com' Certificate is to be certified until Mar 30 15:18:26 2016 GMT (730 days) # Сертификат был удостоверен до 30 марта 2016 года 15:18:26 по Гринвичу (365 дней) Write out database with 1 new entries # В базу данных записана 1 новая запись Data Base Updated # База данных обновленаСоздадим CRL - список отозванных сертификатов в форматах PEM и DER:
openssl ca -config ca.conf -gencrl -keyfile intermediate1.key -cert intermediate1.crt -out intermediate1.crl.pem openssl crl -inform PEM -in intermediate1.crl.pem -outform DER -out intermediate1.crlСоздавайте CRL - список отозванных сертификатов после каждого подписания сертификата удостоверяющим центром.
Если когда-то понадобится отозвать этот сертификат конечного пользователя:
openssl ca -config ca.conf -revoke enduser-certs/enduser-example.com.crt -keyfile intermediate1.key -cert intermediate1.crtПример вывода:
Using configuration from ca.conf # Используется конфигурация из ca.conf Revoking Certificate 1000. # Отзыв сертификата 1000. Data Base Updated # База данных обновленаСоздадим файл с цепочкой сертификатов, соединив вместе сертификаты корневого и промежуточного удостоверяющего центра 1.
cat ../root/rootca.crt intermediate1.crt > enduser-certs/enduser-example.com.chainОтправим следующие файлы конечному пользователю:
- enduser-example.com.crt
- enduser-example.com.key
- enduser-example.com.chain
Проверка сертификата
Вы можете проверить сертификат конечного пользователя по цепочке при помощи следующей команды:openssl verify -CAfile enduser-certs/enduser-example.com.chain enduser-certs/enduser-example.com.crt enduser-certs/enduser-example.com.crt: OKВы также можете проверить его по CRL - списку отозванных сертификатов. Сначала соедините вместе CRL в формате PEM и цепочку:
cat ../root/rootca.crt intermediate1.crt intermediate1.crl.pem > enduser-certs/enduser-example.com.crl.chainПроверим сертификат:
openssl verify -crl_check -CAfile enduser-certs/enduser-example.com.crl.chain enduser-certs/enduser-example.com.crtЕсли не отозван, будет выведено:
enduser-certs/enduser-example.com.crt: OKЕсли отозван, будет выведено:
enduser-certs/enduser-example.com.crt: CN = example.com, ST = Noord Holland, C = NL, O = Example Inc, OU = IT Dept error 23 at 0 depth lookup:certificate revoked # ошибка 23 на глубине просмотра 0:сертификат отозван
Комментариев нет:
Отправить комментарий