Ещё один блог сисадмина: OpenSSL: Ручная проверка сертификата по CRL

Ещё один блог сисадмина: OpenSSL: Ручная проверка сертификата по CRL Сертификаты

Основные команды openssl для работы с ssl. у нас можно купить ssl сертификат, сертификат с подтверждением домена, компании, субдоменов, codesign сертификат программного кода, для pdf…

Проверка версии OpenSSL

Определение используемой версии OpenSSL является важным первым шагом в подготовке генерации приватного ключа и запроса CSR. Ваша версия OpenSSL диктует криптографический алгоритм, который может использовать для генерации ключей и поддерживаемый протокол. К примеру, OpenSSL version 1.0.1 является первой версией, поддерживающей TLS 1.1 и TLS 1.2. Знание используемой версииf OpenSSL также важно когда вы решаете возникшие в процессе проблемы.

Команда для определения версии OpenSSL:

openssl version -a

В этой команде, ” -a ” включит отображение следующей информации:

При вводе команды openssl version -a появится информация такого вида:

OpenSSL 1.0.2g  1 Mar 2021
built on: reproducible build, date unspecified
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) 
compiler: cc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -
D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-
strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-
Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -
DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -
DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -
DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/usr/lib/ssl"

OpenSSL and CSR Creation

Первым шагом к получению SSL-сертификата является использование OpenSSL для создания запроса подписи сертификата (CSR), который может быть отправлен в центр сертификации (CA) (например, DigiCert). CSR содержит общее имя (ы), которое вы хотите, чтобы ваш сертификат был защищен, информация о вашей компании и ваш открытый ключ. Чтобы создать CSR, он должен иметь закрытый ключ, из которого извлекается открытый ключ. Это можно сделать, используя существующий закрытый ключ или создав новый закрытый ключ.

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

Выбор вариантов генерации ключей

При создании ключа вы должны решить три вещи:

Алгоритм ключа

Для ключевого алгоритма вам необходимо учитывать его совместимость. По этой причине мы рекомендуем использовать RSA. Однако, если у вас есть конкретная необходимость использовать другой алгоритм (например, ECDSA), вы также можете использовать его, но помните о проблемах совместимости, с которыми вы можете столкнуться.

Примечание. В этом руководстве рассматриваются только генераторы ключей с использованием алгоритма RSA.

Размер ключа

Для размера ключа вам необходимо выбрать длину бита не менее 2048 при использовании RSA и 256 при использовании ECDSA; это самый маленький размер ключа, разрешенные для сертификатов SSL. Если вам не нужен более крупный размер ключа, мы рекомендуем придерживаться 2048 с RSA и 256 с ECDSA.

Примечание. В старых версиях OpenSSL, если не задан размер ключа, используется размер ключа по умолчанию 512. Любой размер ключа ниже 2048 считается незащищенным и никогда не должен использоваться.

Passphrase

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

Создание приватного ключа

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

Используйте следующую команду для генерации вашего закрытого ключа с использованием алгоритма RSA:

openssl genrsa -out yourdomain.key 2048

Эта команда генерирует закрытый ключ в вашем текущем каталоге с именем yourdomain.key (-out yourdomain.key) с использованием алгоритма RSA (genrsa) с длиной ключа 2048 бит (2048). Сгенерированный ключ создается с использованием формата OpenSSL под названием PEM.

Используйте следующую команду для просмотра необработанного, закодированного содержимого (формат PEM) закрытого ключа:

cat yourdomain.key

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

openssl rsa -text -in yourdomain.key -noout

Переключатель -noout отключает вывод кодированной версии закрытого ключа.

Извлечение открытого ключа

Файл закрытого ключа содержит как закрытый ключ, так и открытый ключ. Вы можете извлечь свой открытый ключ из своего файла закрытого ключа, если это необходимо.

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

openssl rsa -in yourdomain.key -pubout -out yourdomain_public.key

Создание CSR

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

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

openssl req -new -key yourdomain.key -out yourdomain.csr

После ввода команды вам будет задан ряд вопросов. Ваши ответы на эти вопросы будут включены в CSR. Ответьте на вопросы, как описано ниже:

Некоторые из вышеуказанных вопросов CSR имеют значения по умолчанию, которые будут использоваться, если вы оставите пустой ответ и нажмите Enter. Эти значения по умолчанию извлекаются из файла конфигурации OpenSSL, расположенного в OPENSSLDIR (см. Проверка версии OpenSSL). Если вы хотите оставить вопрос пустым, не используя значение по умолчанию, введите «.». (период) и нажмите Enter.

Использование переключателя -subj

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

Используйте следующую команду, чтобы отключить приглашения к запросам при создании CSR:

openssl req -new -key yourdomain.key -out yourdomain.csr 
-subj "/C=US/ST=Utah/L=Lehi/O=Your Company, Inc./OU=IT/CN=yourdomain.com"

This command uses your private key file (-key yourdomain.key) to create a new CSR (-out yourdomain.csr) and disables question prompts by providing the CSR information (-subj).

Создание CSR с помощью одной команды

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

Используйте следующую команду для создания как закрытого ключа, так и CSR:

openssl req -new 
-newkey rsa:2048 -nodes -keyout yourdomain.key 
-out yourdomain.csr 
-subj "/C=US/ST=Utah/L=Lehi/O=Your Company, Inc./OU=IT/CN=yourdomain.com"

Эта команда генерирует новый закрытый ключ (-newkey) с использованием алгоритма RSA с длиной ключа 2048 бит (rsa: 2048) без использования парольной фразы (-nodes), а затем создает файл ключа с именем yourdomain.key (- keyout yourdomain.key). Затем команда cгенерирует CSR с именем файла yourdomain.csr (-out yourdomain.csr),  информация для CSR предоставляется (-subj).

Примечание. Хотя возможно добавление альтернативного имени объекта (SAN) в CSR с использованием OpenSSL, процесс немного сложнее. Если вам нужно добавить SAN в свой сертификат, это легко сделать, добавив их в виде примечания в форму заказа при покупке вашего сертификата  ssl.

Проверка информации CSR

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

Используйте следующую команду для просмотра информации в вашей CSR перед отправкой ее в сертификационный центр.

openssl req -text -in yourdomain.csr -noout -verify

Переключатель -noout отключает вывод кодированной версии CSR. Переключатель -verify проверяет подпись файла, чтобы убедиться, что он не был изменен. Выполнение этой команды дает вам следующий результат:

verify OK

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=US, ST=Utah, L=Lehi, O=Your Company, Inc., OU=IT, CN=yourdomain.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:bb:31:71:40:81:2c:8e:fb:89:25:7c:0e:cb:76:
                    [...17 lines removed]
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         0b:9b:23:b5:1f:8d:c9:cd:59:bf:b7:e5:11:ab:f0:e8:b9:f6:
         [...14 lines removed]

В первой строке выведенного выше вы увидите, что CSR была проверена (verify OK).

В четвертой строке поле Subject: содержит информацию, предоставленную вами при создании CSR. Убедитесь, что эта информация верна.

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

Отправка CSR в CA

Когда вы подготовите запрос CSR для оформления сертификата SSL, вам нужно использовать формат PEM – необработанный, закодированный текст CSR, который вы увидите при открытии его в текстовом редакторе.

Для того, чтобы просмотреть исходный вывод CSR:

cat yourdomain.csr

Вам надо скопировать содержимое (включая —–BEGIN CERTIFICATE REQUEST—– и —–END CERTIFICATE REQUEST—– вместе с черточками) вставить в текстовый документ и направить в компанию, которая оформляет для вас сертификат ssl.

Про сертификаты:  ✔️ 13 лучших курсов IT-юриста [2021] бесплатно и платно

Просмотр информации о сертификате

После получения сертификата от CA (например, DigiCert) мы рекомендуем убедиться, что информация в сертификате верна и соответствует вашему закрытому ключу. Вы делаете это, используя команду x509.

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

openssl x509 -text -in yourdomain.crt -noout

Проверка соответствия ваших ключей

Чтобы проверить соответствие ваших общих и закрытых ключей, используйте ключ -modulus для генерации хэша вывода для всех трех файлов (закрытый ключ, CSR и сертификат).

Используйте следующие команды для генерации хэша модуля каждого файла:

openssl rsa -modulus -in yourdomain.key -noout | openssl sha256
openssl req -modulus -in yourdomain.csr -noout | openssl sha256
openssl x509 -modulus -in yourdomain.crt -noout | openssl sha256

Примечание. Вышеприведенные команды должны вводиться один за другим для генерации трех отдельных выходов.

Каждая команда выведет (stdin) =, а затем строку символов. Если результат каждой команды соответствует, то ключи для каждого файла одинаковы.

Однако, если есть какое-либо несоответствие, то ключи не совпадают, и сертификат не может быть установлен.

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

Преобразование форматов сертификатов

По умолчанию OpenSSL генерирует ключи и CSR, используя формат PEM. Однако могут быть случаи, когда вам нужно преобразовать свой ключ или сертификат в другой формат, чтобы экспортировать его в другую систему.

PEM для PKCS # 12

Формат PKCS # 12 представляет собой архивный файл, в котором хранятся как сертификат, так и закрытый ключ. Этот формат полезен для переноса сертификатов и ключей из одной системы в другую, так как содержит все необходимые файлы. Файлы PKCS # 12 используют либо расширение .pfx, либо .p12.

Используйте следующую команду для преобразования вашего ключа PEM и сертификата в формат PKCS # 12 (т. Е. Один файл .pfx):

openssl pkcs12 -export -name "yourdomain-digicert-(expiration date)" 
-out yourdomain.pfx -inkey yourdomain.key -in yourdomain.crt

Примечание. После ввода команды вам будет предложено указать пароль для шифрования файла. Поскольку формат PKCS # 12 часто используется для миграции системы, мы рекомендуем шифровать файл с помощью очень надежного пароля. Эта команда объединяет ваш закрытый ключ (-inkey yourdomain.key) и ваш сертификат (-in yourdomain.crt) в один файл .pfx (-out yourdomain.pfx) с дружественным именем (-name «yourdomain-digicert- (expiration дата) “), где дата истечения срока действия сертификата истекает.

PKCS № 12 для PEM

Поскольку формат PKCS # 12 содержит как сертификат, так и закрытый ключ, вам нужно использовать две отдельные команды для преобразования файла .pfx в формат PEM.

Используйте следующую команду, чтобы извлечь закрытый ключ из файла PKCS # 12 (.pfx) и преобразовать его в закрытый ключ, закодированный PEM:

openssl pkcs12 -in yourdomain.pfx -nocerts -out yourdomain.key -nodes

Используйте следующую команду для извлечения сертификата из файла PKCS # 12 (.pfx) и преобразования его в сертификат, закодированный PEM:

openssl pkcs12 -in yourdomain.pfx -nokeys -clcerts -out yourdomain.crt

Примечание. Вам необходимо указать пароль, используемый для шифрования файла .pfx, чтобы преобразовать ключ и сертификат в формат PEM.

PEM to DER

Формат DER использует кодировку ASN.1 для хранения сертификата или ключевой информации. Подобно формату PEM, DER хранит информацию о ключах и сертификатах в двух отдельных файлах и обычно использует те же расширения файлов (то есть .key, .crt и .csr). Расширение файла .der было использовано в приведенных ниже примерах для ясности.

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

openssl x509 -inform PEM -in yourdomain.crt -outform DER -out yourdomain.der

Используйте следующую команду для преобразования закрытого ключа, закодированного в PEM, в закрытый закрытый ключ DER:

openssl rsa -inform PEM -in yourdomain.key -outform DER -out yourdomain_key.der

DER to PEM Используйте следующую команду для преобразования закодированного DER сертификата в сертификат, закодированный PEM:

openssl x509 -inform DER -in yourdomain.der -outform PEM -out yourdomain.crt

Используйте следующую команду для преобразования закрытого ключа с кодировкой DER в закрытый секретный ключ PEM:

openssl rsa -inform DER -in yourdomain_key.der -outform PEM -out yourdomain.key

Квалифицированный сертификат

Выполните простую программу сервера SSL / TLS, используя сертификат SSL, его закрытый ключ и промежуточные сертификаты.

$ openssl s_server -no_dhe -accept 8282 -www -key example.com.key -cert example.com.crt -CAfile example.com.intermediate.crt

Выполните простую клиентскую программу SSL / TLS, чтобы проверить этот сертификат.

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=example.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
 2 s:/O=Digital Signature Trust Co./CN=DST Root CA X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFGzCCBAOgAwIBAgISA8J1sgvKsx7iOY1ME0atryKhMA0GCSqGSIb3DQEBCwUA
[...]
ncpOI1U724 /U6vTitOoSAHb83qroLAmXl0OF0SBl5xawTSMhAf44UEIvV6x2iJT
Ul9lKA4Qgyrl3tiXrOZu
-----END CERTIFICATE-----
subject=/CN=example.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4012 bytes and written 451 bytes
---
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 469596E7A4616EEF91EA3D2344AE9C0FBD4D0E96C4CB0130BC7BCDA7F7DA020E
    Session-ID-ctx: 
    Master-Key: D4DF9C8D2324F51A58EEB5E7D3774F1EE54C9E8E0AB69F7F4EC9E3D3B3A9239992AE832F4C638732B2327ADD35F772CE
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 66 78 90 a9 98 12 11 40-b8 03 44 58 03 1e 92 32   fx.....@..DX...2
    0010 - da 55 0f c7 26 d7 5e 60-94 56 02 4a ba ae c5 16   .U..&.^`.V.J....
    0020 - b7 c6 9e 1c ed 3f 3b 2a-16 31 87 10 1b f6 1e 44   .....?;*.1.....D
    0030 - e5 b4 b8 5c d5 b7 66 0d-b3 44 1d c3 cd 73 26 14   .....f..D...s&.
    0040 - 93 aa 00 f9 32 45 84 e5-bc e4 cf c8 3e 4e f9 b0   ....2E......>N..
    0050 - b7 f9 53 5a 0c 36 60 8f-bb 4b 90 20 ef 67 30 21   ..SZ.6`..K. .g0!
    0060 - 26 49 83 94 04 e4 81 9d-76 bf 44 96 d3 6f 5e 3b   &I......v.D..o^;
    0070 - 49 c6 80 f3 ea d5 e8 06-4c db 8b 74 fa ed 7e df   I.......L..t..~.
    0080 - 85 b5 ae 91 97 e6 72 36-39 f6 e4 6e 9e 9a 6a a1   ......r69..n..j.
    0090 - 48 d5 2a ee b1 48 6d fb-4b 91 1e 28 70 cd 07 98   H.*..Hm.K..(p...
    00a0 - 2c 66 fa 19 33 2d 15 7f-5c 23 31 ff 38 97 12 13   ,f..3-..#1.8...

    Start Time: 1510259115
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

Проверьте код возврата – вы можете безопасно использовать этот сертификат.

Используйте подробный вывод для дальнейшей проверки всего процесса.

* Added example.com:8282:127.0.0.1 to DNS cache                                       
* Hostname example.com was found in DNS cache                                         
*   Trying 127.0.0.1...                                                                                
* TCP_NODELAY set                                                                                      
* Connected to example.com (127.0.0.1) port 8282 (#0)                                 
* ALPN, offering http/1.1                                                                              
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH                         
* successfully set certificate verify locations:                                                       
*   CAfile: /etc/ssl/certs/ca-certificates.crt                                                         
  CApath: /etc/ssl/certs                                                                               
* TLSv1.2 (OUT), TLS header, Certificate Status (22):                                                  
} [5 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Client hello (1):  
} [512 bytes data]       
* TLSv1.2 (IN), TLS handshake, Server hello (2):   
{ [94 bytes data]        
* TLSv1.2 (IN), TLS handshake, Certificate (11):   
{ [3347 bytes data]      
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):                                               
{ [333 bytes data]       
* TLSv1.2 (IN), TLS handshake, Server finished (14):                                                   
{ [4 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):                                              
} [70 bytes data]        
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):                                                  
} [1 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Finished (20):     
} [16 bytes data]        
* TLSv1.2 (IN), TLS change cipher, Client hello (1):                                                   
{ [1 bytes data]         
* TLSv1.2 (IN), TLS handshake, Finished (20):      
{ [16 bytes data]        
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384                                           
* ALPN, server did not agree to a protocol         
* Server certificate:    
*  subject: CN=example.com        
*  start date: Oct 28 19:55:12 2021 GMT            
*  expire date: Jan 26 19:55:12 2021 GMT           
*  subjectAltName: host "example.com" matched cert's "example.com"   
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3                                        
*  SSL certificate verify ok.                      
} [5 bytes data]         
> GET :/ HTTP/1.1         
> Host: example.com:8282          
> User-Agent: curl/7.55.1
> Accept: */*            
>                        
{ [5 bytes data]
* HTTP 1.0, assume close after body
< HTTP/1.0 200 ok
< Content-type: text/html
<
{ [7670 bytes data]
* Closing connection 0
} [5 bytes data]
* TLSv1.2 (OUT), TLS alert, Client hello (1):
} [2 bytes data]

Пакет сертификатов haproxy

После проверки сертификата необходимо создать комплект сертификатов domain.pem, который включает сертификат domain.crt, промежуточные сертификаты domain.intermediate.crt и закрытый ключ domain.key.

Именно в таком порядке.

Там больше ничего нет.

Дополнительные примечания

Вы можете использовать веб-браузер вместо curl для проверки локально сохраненного сертификата, но это не очень удобно.

Про сертификаты:  Широгоров

Я отключил эфемерные комплекты алгоритмов DH, но вы можете указать файл параметров DH для использования.

Вы можете использовать openssl s_server для обслуживания файлов по сети, но это просто еще один лакомый кусочек.

Проверьте код возврата (он отличается от кода выхода), так как он четко покажет, что с предоставленными промежуточными сертификатами что-то не так.

Код возврата не является кодом выхода.

Коды возврата описаны на странице руководства verify.

0 X509_V_OK: ok
    the operation was successful.

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: unable to get issuer certificate
    the issuer certificate of a looked up certificate could not be found. This normally means the list of trusted certificates is not complete.

3 X509_V_ERR_UNABLE_TO_GET_CRL: unable to get certificate CRL
    the CRL of a certificate could not be found.

4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: unable to decrypt certificate's signature
    the certificate signature could not be decrypted. This means that the actual signature value could not be determined rather than it not matching the expected value, this is only meaningful for RSA
    keys.

5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: unable to decrypt CRL's signature
    the CRL signature could not be decrypted: this means that the actual signature value could not be determined rather than it not matching the expected value. Unused.

6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: unable to decode issuer public key
    the public key in the certificate SubjectPublicKeyInfo could not be read.

7 X509_V_ERR_CERT_SIGNATURE_FAILURE: certificate signature failure
    the signature of the certificate is invalid.

8 X509_V_ERR_CRL_SIGNATURE_FAILURE: CRL signature failure
    the signature of the certificate is invalid.

9 X509_V_ERR_CERT_NOT_YET_VALID: certificate is not yet valid
    the certificate is not yet valid: the notBefore date is after the current time.

10 X509_V_ERR_CERT_HAS_EXPIRED: certificate has expired
    the certificate has expired: that is the notAfter date is before the current time.

11 X509_V_ERR_CRL_NOT_YET_VALID: CRL is not yet valid
    the CRL is not yet valid.

12 X509_V_ERR_CRL_HAS_EXPIRED: CRL has expired
    the CRL has expired.

13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: format error in certificate's notBefore field
    the certificate notBefore field contains an invalid time.

14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: format error in certificate's notAfter field
    the certificate notAfter field contains an invalid time.

15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: format error in CRL's lastUpdate field
    the CRL lastUpdate field contains an invalid time.

16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: format error in CRL's nextUpdate field
    the CRL nextUpdate field contains an invalid time.

17 X509_V_ERR_OUT_OF_MEM: out of memory
    an error occurred trying to allocate memory. This should never happen.

18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: self signed certificate
    the passed certificate is self signed and the same certificate cannot be found in the list of trusted certificates.

19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: self signed certificate in certificate chain
    the certificate chain could be built up using the untrusted certificates but the root could not be found locally.

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate
    the issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found.

21 X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: unable to verify the first certificate
    no signatures could be verified because the chain contains only one certificate and it is not self signed.

22 X509_V_ERR_CERT_CHAIN_TOO_LONG: certificate chain too long
    the certificate chain length is greater than the supplied maximum depth. Unused.

23 X509_V_ERR_CERT_REVOKED: certificate revoked
    the certificate has been revoked.

24 X509_V_ERR_INVALID_CA: invalid CA certificate
    a CA certificate is invalid. Either it is not a CA or its extensions are not consistent with the supplied purpose.

25 X509_V_ERR_PATH_LENGTH_EXCEEDED: path length constraint exceeded
    the basicConstraints pathlength parameter has been exceeded.

26 X509_V_ERR_INVALID_PURPOSE: unsupported certificate purpose
    the supplied certificate cannot be used for the specified purpose.

27 X509_V_ERR_CERT_UNTRUSTED: certificate not trusted
    the root CA is not marked as trusted for the specified purpose.

28 X509_V_ERR_CERT_REJECTED: certificate rejected
    the root CA is marked to reject the specified purpose.

29 X509_V_ERR_SUBJECT_ISSUER_MISMATCH: subject issuer mismatch
    the current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate. Only displayed when the -issuer_checks option is set.

30 X509_V_ERR_AKID_SKID_MISMATCH: authority and subject key identifier mismatch
    the current candidate issuer certificate was rejected because its subject key identifier was present and did not match the authority key identifier current certificate. Only displayed when the
    -issuer_checks option is set.

31 X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH: authority and issuer serial number mismatch
    the current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate. Only
    displayed when the -issuer_checks option is set.

32 X509_V_ERR_KEYUSAGE_NO_CERTSIGN:key usage does not include certificate signing
    the current candidate issuer certificate was rejected because its keyUsage extension does not permit certificate signing.

50 X509_V_ERR_APPLICATION_VERIFICATION: application verification failure
    an application specific error. Unused.

Самоподписанный сертификат ssl

Это простейший возможный пример, который предназначен для сбоев, поскольку нет способа проверить какой-либо случайный самаподписанный сертификат SSL.

Выполните простую программу сервера SSL / TLS, используя самоподписанный сертификат SSL и его закрытый ключ.

$ openssl s_server -no_dhe -accept 8282 -www -key example.org.key -cert example.org.crt

Выполните простую клиентскую программу SSL / TLS, чтобы проверить этот сертификат.

CONNECTED(00000003)
depth=0 C = PL, ST = pomorskie, O = personal, L = Gdansk, CN = example.org, OU = IT, emailAddress = admin@example.org
verify error:num=18:self signed certificate
verify return:1
depth=0 C = PL, ST = pomorskie, O = personal, L = Gdansk, CN = example.org, OU = IT, emailAddress = admin@example.org
verify return:1
---
Certificate chain
 0 s:/C=PL/ST=pomorskie/O=personal/L=Gdansk/CN=example.org/OU=IT/emailAddress=admin@example.org
   i:/C=PL/ST=pomorskie/O=personal/L=Gdansk/CN=example.org/OU=IT/emailAddress=admin@example.org
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFkjCCA3oCCQCza lCDud16jANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMC
[...]
2QZm3C 8jOxDR n1b6bwtrrVl7fD7L0I4iLPDlTBZgzHHibLQbysWzJKQVsuvmbW
QEkCajRYUX0lSHABrIJtgTu5QgJfPOc4Rjzo0LEsoIHonUBiXWc=
-----END CERTIFICATE-----
subject=/C=PL/ST=pomorskie/O=personal/L=Gdansk/CN=example.org/OU=IT/emailAddress=admin@example.org
issuer=/C=PL/ST=pomorskie/O=personal/L=Gdansk/CN=example.org/OU=IT/emailAddress=admin@example.org
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2361 bytes and written 451 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: C1B33BCF1F8A611EE106E7E9D9DED34FD634FFE45C516B716DB14C771F02D32C
    Session-ID-ctx:
    Master-Key: 22C05CC82AA56345C7E13937A4E7C884A3D6B4CC7C954B54A79C04141CD09DDAF760852D9E31D20900DA20865A42BE52
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 6c d9 32 c1 a9 7b 97 c7-7d 86 75 49 05 10 3b d8   l.2..{..}.uI..;.
    0010 - 9e 2c 6b 26 ac 11 b6 d6-2a 4b 7b de 07 1d 71 b0   .,k&....*K{...q.
    0020 - 19 25 66 5b 88 39 ab 51-c8 c6 ad ed 79 c0 15 b2   .%f[.9.Q....y...
    0030 - 3f ae db 35 5a b6 95 52-1a a6 34 1e 89 bb dc be   ?..5Z..R..4.....
    0040 - 54 15 3c 92 c0 55 7e e0-c0 4a 2c dd 6b 8b b3 3d   T.<..U~..J,.k..=
    0050 - e6 1b 53 3f 4d 30 2f 72-bd 9c 18 0d 3d 62 17 a0   ..S?M0/r....=b..
    0060 - 08 a8 32 64 d9 65 06 54-d4 f4 cc 8a 05 8b de 6a   ..2d.e.T.......j
    0070 - 8c d0 8e a9 9d 68 95 52-ed 71 fa 93 c8 8a b5 a8   .....h.R.q......
    0080 - 58 1a 38 47 9d a6 9f 23-f5 c2 42 b6 5f aa 7e a2   X.8G...#..B._.~.
    0090 - dc f4 ea 29 d5 8c 1d b6-92 43 4d 09 79 2e 74 1f   ...).....CM.y.t.
    00a0 - 37 79 2b b8 1a 8a 91 f3-a3 06 c9 4f 54 0e a8 fb   7y ........OT...

    Start Time: 1510239128
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
DONE

Проверьте код возврата – вы не можете использовать этот сертификат, не отключив проверку SSL-сертификата.

curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.

Все как и должно быть.

Квалифицированный сертификат

Выполните простую программу сервера SSL / TLS, используя сертификат SSL, его закрытый ключ и промежуточные сертификаты.

$ openssl s_server -no_dhe -accept 8282 -www -key example.com.key -cert example.com.crt -CAfile example.com.intermediate.crt

Выполните простую клиентскую программу SSL / TLS, чтобы проверить этот сертификат.

CONNECTED(00000003)
---
Certificate chain
 0 s:/CN=example.com
   i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
 1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
 2 s:/O=Digital Signature Trust Co./CN=DST Root CA X3
   i:/O=Digital Signature Trust Co./CN=DST Root CA X3
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFGzCCBAOgAwIBAgISA8J1sgvKsx7iOY1ME0atryKhMA0GCSqGSIb3DQEBCwUA
[...]
ncpOI1U724 /U6vTitOoSAHb83qroLAmXl0OF0SBl5xawTSMhAf44UEIvV6x2iJT
Ul9lKA4Qgyrl3tiXrOZu
-----END CERTIFICATE-----
subject=/CN=example.com
issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4012 bytes and written 451 bytes
---
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 469596E7A4616EEF91EA3D2344AE9C0FBD4D0E96C4CB0130BC7BCDA7F7DA020E
    Session-ID-ctx: 
    Master-Key: D4DF9C8D2324F51A58EEB5E7D3774F1EE54C9E8E0AB69F7F4EC9E3D3B3A9239992AE832F4C638732B2327ADD35F772CE
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 66 78 90 a9 98 12 11 40-b8 03 44 58 03 1e 92 32   fx.....@..DX...2
    0010 - da 55 0f c7 26 d7 5e 60-94 56 02 4a ba ae c5 16   .U..&.^`.V.J....
    0020 - b7 c6 9e 1c ed 3f 3b 2a-16 31 87 10 1b f6 1e 44   .....?;*.1.....D
    0030 - e5 b4 b8 5c d5 b7 66 0d-b3 44 1d c3 cd 73 26 14   .....f..D...s&.
    0040 - 93 aa 00 f9 32 45 84 e5-bc e4 cf c8 3e 4e f9 b0   ....2E......>N..
    0050 - b7 f9 53 5a 0c 36 60 8f-bb 4b 90 20 ef 67 30 21   ..SZ.6`..K. .g0!
    0060 - 26 49 83 94 04 e4 81 9d-76 bf 44 96 d3 6f 5e 3b   &I......v.D..o^;
    0070 - 49 c6 80 f3 ea d5 e8 06-4c db 8b 74 fa ed 7e df   I.......L..t..~.
    0080 - 85 b5 ae 91 97 e6 72 36-39 f6 e4 6e 9e 9a 6a a1   ......r69..n..j.
    0090 - 48 d5 2a ee b1 48 6d fb-4b 91 1e 28 70 cd 07 98   H.*..Hm.K..(p...
    00a0 - 2c 66 fa 19 33 2d 15 7f-5c 23 31 ff 38 97 12 13   ,f..3-..#1.8...

    Start Time: 1510259115
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

Проверьте код возврата – вы можете безопасно использовать этот сертификат.

Про сертификаты:  Как добавить цепочку в сертификат pkcs12 (p12, pfx), как конвертировать его в crt/cer -

Используйте подробный вывод для дальнейшей проверки всего процесса.

* Added example.com:8282:127.0.0.1 to DNS cache                                       
* Hostname example.com was found in DNS cache                                         
*   Trying 127.0.0.1...                                                                                
* TCP_NODELAY set                                                                                      
* Connected to example.com (127.0.0.1) port 8282 (#0)                                 
* ALPN, offering http/1.1                                                                              
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH                         
* successfully set certificate verify locations:                                                       
*   CAfile: /etc/ssl/certs/ca-certificates.crt                                                         
  CApath: /etc/ssl/certs                                                                               
* TLSv1.2 (OUT), TLS header, Certificate Status (22):                                                  
} [5 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Client hello (1):  
} [512 bytes data]       
* TLSv1.2 (IN), TLS handshake, Server hello (2):   
{ [94 bytes data]        
* TLSv1.2 (IN), TLS handshake, Certificate (11):   
{ [3347 bytes data]      
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):                                               
{ [333 bytes data]       
* TLSv1.2 (IN), TLS handshake, Server finished (14):                                                   
{ [4 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):                                              
} [70 bytes data]        
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):                                                  
} [1 bytes data]         
* TLSv1.2 (OUT), TLS handshake, Finished (20):     
} [16 bytes data]        
* TLSv1.2 (IN), TLS change cipher, Client hello (1):                                                   
{ [1 bytes data]         
* TLSv1.2 (IN), TLS handshake, Finished (20):      
{ [16 bytes data]        
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384                                           
* ALPN, server did not agree to a protocol         
* Server certificate:    
*  subject: CN=example.com        
*  start date: Oct 28 19:55:12 2021 GMT            
*  expire date: Jan 26 19:55:12 2021 GMT           
*  subjectAltName: host "example.com" matched cert's "example.com"   
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3                                        
*  SSL certificate verify ok.                      
} [5 bytes data]         
> GET :/ HTTP/1.1         
> Host: example.com:8282          
> User-Agent: curl/7.55.1
> Accept: */*            
>                        
{ [5 bytes data]
* HTTP 1.0, assume close after body
< HTTP/1.0 200 ok
< Content-type: text/html
<
{ [7670 bytes data]
* Closing connection 0
} [5 bytes data]
* TLSv1.2 (OUT), TLS alert, Client hello (1):
} [2 bytes data]

Пакет сертификатов haproxy

После проверки сертификата необходимо создать комплект сертификатов domain.pem, который включает сертификат domain.crt, промежуточные сертификаты domain.intermediate.crt и закрытый ключ domain.key.

Именно в таком порядке.

Там больше ничего нет.

Дополнительные примечания

Вы можете использовать веб-браузер вместо curl для проверки локально сохраненного сертификата, но это не очень удобно.

Я отключил эфемерные комплекты алгоритмов DH, но вы можете указать файл параметров DH для использования.

Вы можете использовать openssl s_server для обслуживания файлов по сети, но это просто еще один лакомый кусочек.

Проверьте код возврата (он отличается от кода выхода), так как он четко покажет, что с предоставленными промежуточными сертификатами что-то не так.

Код возврата не является кодом выхода.

Коды возврата описаны на странице руководства verify.

0 X509_V_OK: ok
    the operation was successful.

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT: unable to get issuer certificate
    the issuer certificate of a looked up certificate could not be found. This normally means the list of trusted certificates is not complete.

3 X509_V_ERR_UNABLE_TO_GET_CRL: unable to get certificate CRL
    the CRL of a certificate could not be found.

4 X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE: unable to decrypt certificate's signature
    the certificate signature could not be decrypted. This means that the actual signature value could not be determined rather than it not matching the expected value, this is only meaningful for RSA
    keys.

5 X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE: unable to decrypt CRL's signature
    the CRL signature could not be decrypted: this means that the actual signature value could not be determined rather than it not matching the expected value. Unused.

6 X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: unable to decode issuer public key
    the public key in the certificate SubjectPublicKeyInfo could not be read.

7 X509_V_ERR_CERT_SIGNATURE_FAILURE: certificate signature failure
    the signature of the certificate is invalid.

8 X509_V_ERR_CRL_SIGNATURE_FAILURE: CRL signature failure
    the signature of the certificate is invalid.

9 X509_V_ERR_CERT_NOT_YET_VALID: certificate is not yet valid
    the certificate is not yet valid: the notBefore date is after the current time.

10 X509_V_ERR_CERT_HAS_EXPIRED: certificate has expired
    the certificate has expired: that is the notAfter date is before the current time.

11 X509_V_ERR_CRL_NOT_YET_VALID: CRL is not yet valid
    the CRL is not yet valid.

12 X509_V_ERR_CRL_HAS_EXPIRED: CRL has expired
    the CRL has expired.

13 X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD: format error in certificate's notBefore field
    the certificate notBefore field contains an invalid time.

14 X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD: format error in certificate's notAfter field
    the certificate notAfter field contains an invalid time.

15 X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD: format error in CRL's lastUpdate field
    the CRL lastUpdate field contains an invalid time.

16 X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: format error in CRL's nextUpdate field
    the CRL nextUpdate field contains an invalid time.

17 X509_V_ERR_OUT_OF_MEM: out of memory
    an error occurred trying to allocate memory. This should never happen.

18 X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: self signed certificate
    the passed certificate is self signed and the same certificate cannot be found in the list of trusted certificates.

19 X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN: self signed certificate in certificate chain
    the certificate chain could be built up using the untrusted certificates but the root could not be found locally.

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: unable to get local issuer certificate
    the issuer certificate could not be found: this occurs if the issuer certificate of an untrusted certificate cannot be found.

21 X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE: unable to verify the first certificate
    no signatures could be verified because the chain contains only one certificate and it is not self signed.

22 X509_V_ERR_CERT_CHAIN_TOO_LONG: certificate chain too long
    the certificate chain length is greater than the supplied maximum depth. Unused.

23 X509_V_ERR_CERT_REVOKED: certificate revoked
    the certificate has been revoked.

24 X509_V_ERR_INVALID_CA: invalid CA certificate
    a CA certificate is invalid. Either it is not a CA or its extensions are not consistent with the supplied purpose.

25 X509_V_ERR_PATH_LENGTH_EXCEEDED: path length constraint exceeded
    the basicConstraints pathlength parameter has been exceeded.

26 X509_V_ERR_INVALID_PURPOSE: unsupported certificate purpose
    the supplied certificate cannot be used for the specified purpose.

27 X509_V_ERR_CERT_UNTRUSTED: certificate not trusted
    the root CA is not marked as trusted for the specified purpose.

28 X509_V_ERR_CERT_REJECTED: certificate rejected
    the root CA is marked to reject the specified purpose.

29 X509_V_ERR_SUBJECT_ISSUER_MISMATCH: subject issuer mismatch
    the current candidate issuer certificate was rejected because its subject name did not match the issuer name of the current certificate. Only displayed when the -issuer_checks option is set.

30 X509_V_ERR_AKID_SKID_MISMATCH: authority and subject key identifier mismatch
    the current candidate issuer certificate was rejected because its subject key identifier was present and did not match the authority key identifier current certificate. Only displayed when the
    -issuer_checks option is set.

31 X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH: authority and issuer serial number mismatch
    the current candidate issuer certificate was rejected because its issuer name and serial number was present and did not match the authority key identifier of the current certificate. Only
    displayed when the -issuer_checks option is set.

32 X509_V_ERR_KEYUSAGE_NO_CERTSIGN:key usage does not include certificate signing
    the current candidate issuer certificate was rejected because its keyUsage extension does not permit certificate signing.

50 X509_V_ERR_APPLICATION_VERIFICATION: application verification failure
    an application specific error. Unused.

Оцените статью
Мой сертификат
Добавить комментарий