Как работает HTTPS.
Сервер создает свой приватный ключ.
С помощью приватного ключа сервер создает запрос на подпись публичного сертификата, который должен будет подписать удостоверяющий центр. В запросе содержится публичный ключ и данные о владельце сервера. Эти данные будут являться частью сертификаты и будут доступными для просмотра.
Запрос на подпись публичного сертификата отправляется в удостоверяющий центр.
Удостоверяющий центр подписывает запрос с помощью своего приватного ключа и создает для сервера его публичный сертификат.
Браузер подключается к серверу через HTTPS.
Сервер отправляет в браузер свой публичный сертификат.
Браузер проверяет в удостоверяющем центре, что полученный публичный сертификат принадлежит серверу.
Если это подтверждается, то браузер зашифровывает публичным сертификатом свой ключ для симметричного шифрования и отправляет его серверу.
Сервер с помощью своего приватного ключа расшифровывает ключ для симметричного шифрования, полученный от браузера.
Далее при обмене данными браузер и сервер будут шифровать их с помощью этого симметричного ключа шифрования, который теперь есть у обоих.
Файл OpenSSL входит в состав Git и находится в папке:
"C:\Program Files\Git\usr\bin\openssl.exe"
openssl.exe version -a
Узнать набор команд OpenSSL:
openssl.exe help
Список всех команд OpenSSL:
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
genpkey genrsa help list
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand rehash
req rsa rsautl s_client
s_server s_time sess_id smime
speed spkac srp storeutl
ts verify version x509
Получить список доступных алгоритмов шифрования:
openssl.exe ciphers -v 'ALL:COMPLEMENTOFALL'
Создание приватного ключа с сохранением его в файл private.key, алгоритмом шифрования RSA, размером ключа 2048 бит, защитой aes-128-cbc:
openssl.exe genpkey \
-out private.key \
-algorithm RSA \
-pkeyopt rsa_keygen_bits:2048 \
-aes-128-cbc
..........................................+++++
...................................................................+++++
Enter PEM pass phrase: ************
Verifying - Enter PEM pass phrase: ************
При создании ключа можно задать пароль для доступа к нему - passphrase, например: 12345.
Для создания ключа лучше использовать алгоритм RSA с размером ключа 2048 бит.
Содержимое созданного приватного ключа в файле private.key выглядит так:
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQInW7GrFjUhUcCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBBn8AErtRKB9p7ii1+g2OhWBIIE
0MnC2dwGznZqpTMX0MYekzyxe4dKlJiIsVr1hgwmjFifzEBs/KvHBV3eIe9wDAzq
[21 lines removed...]
IfveVZzM6PLbDaysxX6jEgi4xVbqWugd9h3eAPeBv9Z5iZ/bZq5hMbt37ElA2Rnh
RfmWSzlASjQi4XAHVLCs6XmULCda6QGvyB7WXxuzbhOv3C6BPXR49z6S1MFvOyDA
2oaXkfS+Ip3x2svgFJj/VpYZHUHwRCzXcDl/CdVg9fxwxcYHuJDH16Qfue/LRtiJ
hqr4fHrnbbk+MZpDaU+h4shLRBg2dONdUEzhPkpdOOkF
-----END ENCRYPTED PRIVATE KEY-----
Посмотреть расшифрованное содержимое приватного ключа из файла private.key можно так:
openssl.exe pkey -in private.key -text -noout
Enter pass phrase for private.key: ****************
RSA Private-Key: (2048 bit, 2 primes)
modulus:
00:be:79:08:22:1a:bc:78:3c:17:34:4a:d3:5f:2b:
[...]
publicExponent: 65537 (0x10001)
privateExponent:
10:20:95:54:b5:e8:d1:51:5d:31:9b:48:4c:5d:90:
[...]
prime1:
00:f5:3f:74:cf:ef:8f:93:e9:54:b3:79:a1:f2:91:
5a:7e:15:13:26:f7:f9:d7:a8:f3:f9:6b:2b:90:93:
57:54:cc:84:c9:ea:6f:9f:39:ad:ad:60:4c:f0:68:
16:db:1a:49:51:56:87:f1:70:ae:c9:42:89:2a:38:
55:3e:17:a0:78:a7:52:49:10:79:cf:99:ae:53:c8:
e0:60:5d:7e:91:26:86:3b:79:d2:70:c0:39:38:dd:
ed:ee:75:c0:15:c6:30:51:00:a8:93:f3:8b:25:01:
04:25:72:fc:9c:e9:73:d0:93:11:2d:82:e2:e3:d0:
66:c0:36:2f:b6:de:de:0d:47
prime2:
00:c6:d2:ce:66:b5:35:6b:35:d7:bb:b0:e3:f4:2d:
[...]
exponent1:
00:e9:2e:e9:b9:5f:f5:2b:54:fa:c5:1f:4c:7d:5f:
[...]
exponent2:
00:83:ea:bc:ad:a2:cf:a5:a9:9c:d0:d8:85:f6:ae:
[...]
coefficient:
68:18:a7:4f:aa:86:a7:e0:92:49:76:8d:24:65:fa:
[...]
Вытаскивание отдельного публичного ключа из приватного ключа файла private.key в отдельный файл public.key:
openssl.exe pkey -in private.key -pubout -out public.key
Enter pass phrase for private.key: ****************
Содержимое извлеченного публичного ключа в файле public.key выглядит так:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvnkIIhq8eDwXNErTXytD
U1JGrYUgFsN8IgFVMJmAuY15dBvSCO+6y9FA0H08utJVtHScyWeOlo1uo0TQ3RWr
Pe7W3O2SaW2gIby2cwzGf/FBExZ+BCNXkN5z8Kd38PXDLt8ar+7MJ3vrb/sW7zs2
v+rtfRar2RmhDPpVvI6sugCeHrvYDGdA/gIZAMMg3pVFivPpHnTH4AR7rTzWCWlb
nCB3z2FVYpvumrY8TvIo5OioD2I+TQyvlxDRo14QWxIdZxvPcCUxXMN9MC8fBtLu
IlllDmah8JzF2CF5IxVgVhi7hyTtSQfKsK91tAvN30F9qkZNEpjNX37M5duHUVPb
tQIDAQAB
-----END PUBLIC KEY-----
Имея приватный ключ можно создать запрос на подпись публичного сертификата. В запросе содержится публичный ключ и данные о владельце сервера. Эти данные будут являться частью сертификаты и будут доступными для просмотра.
Создание запроса на подпись публичного сертификата с использованием приватного ключа private.key и записью публичного сертификата в файл sign-request.csr:
openssl.exe req -new -key private.key -out sign-request.csr
Enter pass phrase for private.key: ****************
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.
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]:US
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:New Yourk
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company Name Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.your-site.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Получившийся запрос на подпись публичного сертификата в файле sign-request.csr можно подписать самому с помощью приватного ключа (в этом случае получится самоподписанный сертификат) или отправить на подпись в удостоверяющий центр, чтобы получить публичный сертификат.
Посмотреть содержимое запроса на подпись публичного сертификата из файла sing-request.csr можно так:
openssl.exe req -text -in sign-request.csr -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C = US, L = New Yourk, O = Your Company Name Ltd, CN = www.your-site.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:8a:d5:de:69:30:c7:77:b0:a0:54:f7:b3:34:9a:
96:1c:23:81:e3:9c:0c:81:a6:8a:a5:14:76:f4:4c:
b3:10:cb:ee:50:d1:ea:70:e9:7f:8f:75:67:f9:12:
83:b0:11:e7:6c:64:de:bc:af:bd:3f:43:da:b8:41:
96:75:34:63:85
ASN1 OID: prime256v1
NIST CURVE: P-256
Attributes:
a0:00
Signature Algorithm: ecdsa-with-SHA256
30:44:02:20:52:b9:cf:ca:d1:25:1c:b7:57:65:fb:24:5d:95:
15:f0:39:79:36:6c:d6:0a:42:6e:26:7c:54:e8:71:17:a5:99:
02:20:5a:e0:cd:b3:60:ec:2c:fc:29:8c:f9:21:01:08:9a:a3:
0d:fc:9a:d3:4f:24:fb:23:4f:c6:d7:a2:14:d1:54:f9
Создание запроса на подпись публичного сертификата на основе уже существующего публичного сертификата из файла public.crt:
openssl.exe x509 -x509toreq -in public.crt -out sign-request.csr -signkey private.key
Данную процедуру удобно выполнить, если вы хотите просто обновить публичный сертификат с истекшим сроком действия.
Создание запроса на подпись публичного сертификата на основе данных из конфигурационного файла config.cnf:
openssl.exe req -new -config config.cnf -key private.key -out sing-request.csr
Данную процедуру удобно выполнить, если вы не хотите создавать запрос на подпись в интерактивном режиме, вводя данные вручную так, как делали это выше по тексту.
Данные, находящиеся в файле config.cnf:
[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = PASSPHRASE
[dn]
CN = www.your-site.com
emailAddress = webmaster@www.your-site.com
O = Your Company Name Ltd
L = New Your
C = US
[ext]
subjectAltName = DNS:www.your-site.com,DNS:your-site.com
Создание самоподписанного публичного сертификата с помощью подписи запроса на подпись из файла sign-request.csr своим же приватным ключом private.key:
openssl.exe x509 -req -days 365 -in sign-request.csr -signkey private.key -out public.crt
Signature ok
subject=C = US, L = New Your, O =Your Company Name Ltd, CN = www.your-site.com
Getting Private key
Enter pass phrase for private.key: ****************
Создание самоподписанного публичного сертификата без промежуточного создания запроса на подпись публичного сертификата, используя только приватный ключ private.key:
openssl.exe req -new -x509 -days 365 -key private.key -out public.crt
Чтобы сразу ввести всю информацию с данными владельца сервера можно выполнить такую команду:
openssl.exe req -new -x509 -days 365 -key private.key -out public.crt \
-subj "/C=US/L=New York/O=Your Company Name Ltd/CN=www.your-site.com"
Создание публичного сертификата, который может использоваться сразу для нескольких сайтов:
Сперва поместите дополнительную информацию об адресах сайтов в файл hostnames.txt:
subjectAltName = DNS:*.your-site.com, DNS:your-site.com
Создайте публичный сертификат с использованием файла hostnames.txt:
openssl.exe x509 -req -days 365 \
-in sign-request.csr -signkey private.key -out public.crt \
-extfile hostnames.ext
Если вы посмотрите на содержимое созданного публичного сертификата в файле public.crt, то так вы увидите новую секцию с данными ваших адресов сайтов:
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.your-site.com, DNS:your-site.com
Просмотр содержимого публичного сертификата из файла public.crt:
openssl x509 -text -in public.crt -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
76:bc:fb:f6:06:0e:61:eb:99:5e:83:ea:ef:92:0b:32:4f:fd:3b:51
Signature Algorithm: ecdsa-with-SHA256
Issuer: C = US, L = New York, O = Your Company Name Ltd, CN = www.your-site.com
Validity
Not Before: Aug 15 09:31:54 2020 GMT
Not After : Aug 15 09:31:54 2021 GMT
Subject: C = US, L = New York, O = Your Company Name Ltd, CN = www.your-site.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:8a:d5:de:69:30:c7:77:b0:a0:54:f7:b3:34:9a:
96:1c:23:81:e3:9c:0c:81:a6:8a:a5:14:76:f4:4c:
b3:10:cb:ee:50:d1:ea:70:e9:7f:8f:75:67:f9:12:
83:b0:11:e7:6c:64:de:bc:af:bd:3f:43:da:b8:41:
96:75:34:63:85
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.your-site.com, DNS:your-site.com
Signature Algorithm: ecdsa-with-SHA256
30:45:02:20:4d:36:34:cd:e9:3e:df:18:52:e7:74:c4:a1:97:
91:6a:e7:c1:6d:12:01:63:d1:fd:90:28:32:70:24:5c:be:35:
02:21:00:bd:02:64:c9:8b:27:8f:79:c7:a4:41:7c:31:2f:98:
29:3e:db:8c:f3:f1:d7:bb:fa:fe:95:48:be:16:e1:ab:1b
Самоподписанные публичные сертификаты содержат в себе меньше данных, чем тем, что были подписаны и созданы удостоверяющим центром.
Приватные ключи и публичные сертификаты могут создаваться в разных форматах.
Самые распространённые форматы:
Binary (DER) certificate - содержит X.509 сертификат в сырой форме, используя кодировку DER ASN.1
ASCII (PEM) certificate(s) - содержит DER-сертификат в кодировке Base64, который начинается с заголовка -----BEGIN CERTIFICATE----- и заканчивается подвалом -----END CERTIFICATE----- . Обычно встречается в виде одного сертификата, находящегося в одном файле.
Legacy OpenSSL key format - содержит приватный ключ в сырой форме, используя кодировку DER ASN.1
ASCII (PEM) key - содержит DER-приватный ключ в кодировке Base64 и иногда некоторые метаданные (например алгоритм, использующийся для защиты паролем). Текст в заголовке и подвале ключа могут отличаться в зависимости от того, какой формат ключа использовался при создании этого ключа.
PKCS#7 certificate(s) - комплексный формат, созданный для транспортировки подписанных и зашифрованных данных, описанный в "RFC 2315". Обычно встречается в виде файлов с расширением ".p7b" и."p7c" и может включать в себя всю цепочку сертификатов при необходимости. Этот формат поддерживается утилитой "Java keytool".
PKCS#8 key - новый формат для хранения приватного ключа, описанный в "RFC 5208". Если вам по какой-либо причине необходимо преобразовать PKCS # 8 в устаревший формат, используйте команду pkcs8.
PKCS#12 (PFX) key and certificate(s) - комплексный формат, который может хранить в себе и защищать серверный приватный ключ вместе со всей цепочкой сертификатов. Он обычно встречается в виде файлов с расширением ".p12" и ".pfx". Этот формат обычно используется в программах Microsoft, но также используется в качестве клиентских сертификатов. В наши дни имя PFX используется как синоним PKCS#12 не смотря на то, что название PFX имеет отношение к другому старому формату (ранней версии PKCS#12). Маловероятно, что вы где-то столкнетесь со старой версией.
Конвертация форматов PEM и DER.
Конвертировать сертификат из формата PEM в DER:
openssl.exe x509 -inform PEM -in public.pem -outform DER -out public.der
Конвертировать сертификат из формата DER в PEM:
openssl.exe x509 -inform DER -in public.der -outform PEM -out public.pem
Конвертировать PEM в PKCS#12PKCS#12 (PFX):
openssl.exe pkcs12 -export \
-name "My Certificate" \
-out public.p12 \
-inkey private.key \
-in public.crt \
-certfile intermediate-certificates-chain.crt
Enter Export Password: ****************
Verifying - Enter Export Password: ****************
Конвертировать PKCS#12PKCS#12 (PFX) в PEM:
openssl pkcs12 -in public.p12 -out public.pem -nodes
После этого нужно открыть в редакторе файл public.pem и вручную отделить индивидуальный приватный ключ, сертификат и файлы промежуточных сертификатов.
OpenSSL также может выделить нужные компоненты для вас с помощью следующих команд:
openssl.exe pkcs12 -in public.p12 -nocerts -out private.key -nodes
openssl.exe pkcs12 -in public.p12 -nokeys -clcerts -out public.crt
openssl.exe pkcs12 -in public.p12 -nokeys -cacerts -out intermediate-certificates-chain.crt
Конвертировать PEM в PKCS#7:
openssl.exe crl2pkcs7 -nocrl -out public.p7b -certfile public.crt -certfile intermediate-certificates-chain.crt
Конвертировать PKCS#7 в PEM:
openssl.exe pkcs7 -in public.p7b -print_certs -out public.pem
Также, как и для конвертации в формат PKCS#12 вы должны будете открыть в редакторе файл public.pem, чтобы вручную отделить индивидуальный приватный ключ, сертификат и файлы промежуточных сертификатов.
Создание собственного удостоверяющего центра.
Процесс создания собственного удостоверяющего центра описан на сайте https://www.feistyduck.com/library/openssl-cookbook/online/ch-openssl.html в разделе "Creating a Root CA".