Почему мой код SSL не работает только с моим веб-сервером? - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть веб-сервер, на котором я веду небольшой бизнес (www.trailmyx.com). Недавно я начал разрабатывать некоторый базовый код сокета SSL (на C ++) и написал небольшую тестовую программу, которая подключается к OpenSSl и выполняет http GET. Я могу успешно использовать свой клиент против www.google.com через порт 443 (или любой другой сайт), кроме своего собственного.

Когда я пытаюсь выполнить SSL_get_verify_result (ssl) для моего собственного сервера, я получаю ответ: X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT.

Теперь, когда я захожу на свой веб-сайт в браузере (https://www.trailmyx.com), я могу проверить сертификат, и все выглядит хорошо ... Он не отображается как самоподписанный.

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

У меня такое чувство, что мой сайт неправильно настроен, но если это так, как браузеры могут это сделать? Есть ли какая-то другая последовательность вызовов OpenSSL, о которых знают браузеры?

Примечание. Когда wget возвращается к моему серверу, он выводит некоторую информацию из сертификата. Ничто из этой информации не является действительным (например: / C = - / ST = SomeState / L = SomeCity / O = SomeOrganization / OU = SomeOrganizationalUnit) Я сильно подозреваю, что по некоторым причинам, при определенных обстоятельствах apache возвращает самоподписанный сертификат ... но почему? И как это делают браузеры? Кстати, CURL работает просто отлично.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2012

Я пробовал openssl s_client -connect www.trailmyx.com:443 -showcerts, и он действительно показывает ваш сертификат как самоподписанный:

Server certificate subject=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/emailAddress=root@ip-97-74-119-124.ip.secureserver.net issuer=/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=ip-97-74-119-124.ip.secureserver.net/emailAddress=root@ip-97-74-119-124.ip.secureserver.net

Возможно, ваш сервер использует Индикация имени сервера (SNI), чтобы разрешить использование виртуальных хостов на основе имен в SSL?

Обновление: моя догадка была верна: вам нужно использовать SNI и TLS, чтобы он работал.Эта команда показывает ожидаемый сертификат:

openssl s_client -connect www.trailmyx.com:443 -servername www.trailmyx.com -tls1

0 голосов
/ 22 февраля 2012

Согласно документации :

X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT: самоподписанный сертификат

переданный сертификат самоподписан, и тот же сертификат не может быть найден в списке доверенных сертификатов.

Что звучит для меня так: может означать, что оно не доверяет вашему СА. Это странно, так как GoDaddy стар и доверяют почти всем .

Вы можете попробовать запустить его для другого списка CA с помощью опции -CAFile .

РЕДАКТИРОВАТЬ: Возможно также, что вы пропустили промежуточный сертификат. См. этот вопрос . В основном, если у вас есть:

  • A доверяет B
  • B доверяет вам

И у вас есть сертификат А и ваш сертификат, тогда вам все еще нужен сертификат Б. для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...