Подтвердить что ты не робот

Openssl s_client -cert: подтверждение сертификата клиента было отправлено на сервер

Фон

Я застрял в указательном пальце с поставщиком услуг с API, защищенным сертификатами SSL сервера и .

  • Я создал CSR, получив сертификат от открытого CA (в данном случае GoDaddy) и предоставил поставщику услуг сертификат и CA-цепочку.
  • Они предположительно загрузили сертификат CA и моего клиента в их шлюз.
  • Я работаю с самыми базовыми уровнями тестов, используя openssl s_client -connect ... -cert ... -key ...
  • Поставщик сообщает мне, что их журналы указывают, что мои запросы не включают сертификат SSL клиента вообще.
  • Как ни странно, соответствующий сертификат CA для моего сертификата отображается в списке "Идентификационные имена CA приемлемого клиента", предоставленные во время установления связи SSL.
  • Для справки, самозаверяющий сертификат, который я создал и предоставленный им для тестирования, действительно работает правильно.

Запрос образца (неудачный)

[shell ~]$ openssl s_client -connect host:443 -cert cert_and_key.pem -key cert_and_key.pem -state -quiet
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
depth=2 **SNIP**
verify return:1
depth=1 **SNIP**
verify return:1
depth=0 **SNIP**
verify return:1
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write certificate verify A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL3 alert read:fatal:unknown CA
SSL_connect:failed in SSLv3 read finished A
140011313276744:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1197:SSL alert number 48
140011313276744:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

Мое чтение ошибки SSL3 alert read:fatal:unknown CA заключается в том, что сервер не распознает эмитента сертификата, который я (фактически) предоставляю. Однако поставщик "заверяет" меня, что сертификаты ЦС загружаются должным образом, и я не смог их убедить в противном случае.

Вопрос

Итак, добавив другие (обширные) шаги по устранению неполадок, мне хотелось бы знать:

Есть ли какой-либо вывод, доступный из openssl s_client, который окончательно показывает, что сертификат клиента не просто запрашивался сервером, а фактически был передан на сервер во время установления связи SSL?

Я экспериментировал с параметрами -state, -msg, -debug и -trace, но не имел фона, необходимого для интерпретации вывода.

Ответ EJP предполагает, что предоставленный образец вывода яв ляется достаточным доказательством с помощью write client certificate A, но этот вывод появляется независимо от того, использовались ли опции -cert в командной строке или нет, поэтому это не указывает на то, что сертификат послал.

4b9b3361

Ответ 1

Чтобы проверить, что клиентский сертификат отправляется на сервер, вам необходимо проанализировать вывод из комбинации флагов -state и -debug.

Сначала как базовый уровень, попробуйте запустить

$ openssl s_client -connect host:443 -state -debug

Вы получите тонну вывода, но интересующие нас строки выглядят так:

SSL_connect:SSLv3 read server done A
write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
0000 - 16 03 01 00 07 0b 00 00-03                        .........
000c - <SPACES/NULS>
SSL_connect:SSLv3 write client certificate A

Что здесь происходит:

  • Флаг -state отвечает за отображение конца предыдущего раздела: "SSL_connect: протокол чтения SSLv3 A" . Это важно только для того, чтобы помочь вам найти свое место на выходе.
  • Затем флаг -debug показывает необработанные байты, отправляемые на следующем шаге: "записать в...", "0000 -...", "000c -..." .
  • Наконец, флаг -state еще раз сообщает результат шага, что -debug просто эхо-сигнал: "SSL_connect: сертификат клиента SSLv3 для записи" .

Итак, другими словами: s_client закончил считывать данные, отправленные с сервера, и отправил на сервер 12 байтов (как я полагаю) - сообщение "no client certificate".


Если вы повторите тест, но на этот раз включите флаги -cert и -key, например:

$ openssl s_client -connect host:443 \
   -cert cert_and_key.pem \
   -key cert_and_key.pem  \
   -state -debug`

ваш вывод между строкой "read server done" и линией "write client certificate" будет намного длиннее, представляя двоичную форму вашего сертификата клиента:

SSL_connect:SSLv3 read server done A
write to 0x7bd970 [0x86d890] (1576 bytes => 1576 (0x628))
0000 - 16 03 01 06 23 0b 00 06-1f 00 06 1c 00 06 19 31   ....#..........1
(*SNIP*)
0620 - 95 ca 5e f4 2f 6c 43 11-                          ..^%/lC.
SSL_connect:SSLv3 write client certificate A

"1576 байт" является отличным показателем сам по себе, что сертификат был передан, но кроме того, в правом столбце будут отображаться части сертификата, которые можно прочитать на языке: вы должны уметь распознавать CN и строки эмитента вашего сертификата.

Ответ 2

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

Yourhostname here -vvvvvvvvvv s_client -connect <hostname>:443 -cert client.pem -key cckey.pem -CAfile rootcert.pem -cipher ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH -tls1 -state

Когда я оставляю часть команды "-cert client.pem", квитирование не выполняется на стороне сервера, а команда s_client завершается с сообщением об ошибке. Я все еще получаю отчет "Нет имен сертификатов CA клиента", но я думаю, что здесь был дан ответ.

Короткий ответ заключается в том, что сервер определяет, будет ли сертификат отправлен клиентом при нормальных рабочих условиях (s_client не является нормальным), а сбой связан с тем, что сервер не распознает ЦС в представленном сертификате. Я не знаком со многими ситуациями, в которых выполняется двухсторонняя аутентификация, хотя это требуется для моего проекта.

Вы явно отправляете сертификат. Сервер явно отвергает его.

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