diff --git a/manuals/README.md b/manuals/README.md index 28fa959..87546a1 100644 --- a/manuals/README.md +++ b/manuals/README.md @@ -5,3 +5,4 @@ ## [initrd (Initial RAM Disk)](src/initrd.md) ## [Базовая настройка подключения к серверу Samba](src/samba.md) ## [Настройка загрузки PXE - EFI и Legacy](src/pxe-efi-legzcy.md) +## [Создание сертификата для сайта](src/certs.md) diff --git a/manuals/src/certs.md b/manuals/src/certs.md new file mode 100644 index 0000000..ef54784 --- /dev/null +++ b/manuals/src/certs.md @@ -0,0 +1,105 @@ +# Создание сертификата для сайта + +## Создание ключа и сертификата Certification Authority + +### Создание приватного ключа CA + +Создание ключа удостоверяющего центра (**Certification Authority**). + +```sh +openssl genrsa -out ca.key 4096 +``` + +Ключ с паролем создаётся с флагом `-des3` + +```sh +openssl genrsa -des3 -out ca.key 4096 +``` + +### Создание сертификата CA + +Для создания сертификата CA необходимо использовать созданный ранее ключ `ca.key` (выше): + +```sh +openssl req -new -x509 -days 365 -key ca.key -out ca.crt +``` + +Ответить на вопросы, где: + +- `Country Name` - код страны двумя символами +- `State or Province Name` - полное наименование страны +- `Locality Name` - наименование города +- `Organization Name` - наименование организации +- `Organizational Unit Name` - наименование отдела (подразделения) в организации +- `Common Name` - наименование адреса веб-страницы +- `Email Address` - электронная почта + +Пример: + +```sh +Country Name (2 letter code) [AU]:RU +State or Province Name (full name) [Some-State]:Russia +Locality Name (eg, city) []:Belgorod +Organization Name (eg, company) [Internet Widgits Pty Ltd]:Miratorg +Organizational Unit Name (eg, section) []:IT +Common Name (e.g. server FQDN or YOUR name) []:test.local +Email Address []:a.zhirov@agrohold.ru +``` + +## Создание ключа и сертификата для сайта + +В качестве примера создать ключ и сертификат для сайта https://test.local + +### Создание ключа для сайта + +Приватный ключ хранится на стороне владельца сервера и не должен никогда никому отдаваться. + +```sh +openssl genrsa -out test.key 4096 +``` + +### Создание Certificate Signing Request + +На базе приватного ключа `test.key` генерится так называемый *запрос на подпись сертификата* (**Certificate Signing Request**), в запросе заполняются параметры субъекта, затем этот файл отправляется CA и тот создаёт сертификат на основе данных из CSR, подписывает его своим приватным ключом, в результате получаем подписанный публичный сертификат. + +Для включения нескольких DNS-имен необходимо использовать файл конфигурации (например, создать файл `openssl-csr.cnf` через текстовый редактор), содержащий данные о сертификате и расширенный запрос на добавление (данных), и в директиве `subjectAltName` указать список необходимых адресов для веб-страницы: + +```conf +[ req ] +default_bits = 4096 +distinguished_name = req_distinguished_name +req_extensions = req_ext + +[ req_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = RU +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Russia +localityName = Locality Name (eg, city) +localityName_default = Belgorod +organizationName = Organization Name (eg, company) +organizationName_default = Miratorg +organizationalUnitName = Organizational Unit Name (eg, section) +organizationalUnitName_default = IT +commonName = Common Name (eg, YOUR name or FQDN) +commonName_max = 64 + +[ req_ext ] +basicConstraints = CA:FALSE +keyUsage = nonRepudiation, digitalSignature, keyEncipherment +subjectAltName = DNS:test.local, DNS:*.test.local +``` + +[Официальный пример конфигурационного файла](https://github.com/openssl/openssl/blob/master/apps/openssl.cnf). + +Создание запроса на подпись сертификата на основе конфигурационного файла: + +```sh +openssl req -new -key test.key -config openssl-csr.cnf -reqexts req_ext -out test.csr +``` + +### Создание сертификата для сайта + +```sh +openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -set_serial 01 -extfile openssl-csr.cnf -extensions req_ext -in test.csr -out test.crt +```