OpenSSL отказывается работать с самоподписанным сертификатом, созданным с помощью утилиты SelfSSL.exe из IIS 6.0 Resource Kit. В чем может быть дело?
Говорит мол Код (Text): SSL_connect() failed: error:00000001:lib(0):func(0):reason(1) error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
А может он вообще его получить не может, шоб проверить??? Сам запрос-то срабатывает? Я просто не пойму че код делает... вернее кусок.
Берем иис, делаем сайт, на сайт втыкаем селф-сайнет сертификат, созданный SelfSSL.exe. Берем OpenSSL и идем на этот сайт (openssl.exe s_client -host localhost -port 443). Получаем: Код (Text): D:\...>openssl.exe s_client -host localhost -port 443 Loading 'screen' into random state - done CONNECTED(00000758) depth=0 /CN=... verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 /CN=... verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/CN=... i:/CN=... --- Server certificate -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- subject=/CN=... issuer=/CN=... --- No client certificate CA names sent --- SSL handshake has read 606 bytes and written 338 bytes --- New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA Server public key is 1024 bit Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : DES-CBC3-SHA Session-ID: ... Session-ID-ctx: Master-Key: ... Key-Arg : None Start Time: 1209127253 Timeout : 300 (sec) Verify return code: 21 (unable to verify the first certificate) --- Кстати если дальше сделать http get, то мы получим респонс. По какому каналу мы его получим, по секъюрному или нет, пока не понял (соединение не рвется).
Код (Text): unable to get local issuer certificate кто такой этот локал issuer? Я так понимаю чел, который коннектиться к сайту... Т.е. типа у него нет сертификата. В данном случ у тебя... (или это понимать как "не могу получить сертификат с сайта"?) Код (Text): unable to verify the first certificate Это вообще загадка... Код (Text): Server certificate -----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- subject=/CN=... issuer=/CN=... --- No client certificate CA names sent там, где многоточие, я так понял было содержание сертификата!!? И далее: сообщение о том, что не получено информации с "client certificate CA names". такое чувство, что клиент должен что-то посылать, что похожее на имя сертификата, но не послал... Ну, это можно посмотреть и сниффером.
wvlg Да, локально там нет серта, тут моя ошибка, надо перепроверить. Короче серт сервака и серт клиента - один и тот же. Самоподписаный серт проверяет сам себя. Точечки - да, там содержание. Ты хочешь взглянуть на сертификат? Я перерыл гору майл-листов на эту тему и в одном из обсуждений была высказана такая мысль. Мол в такой ситуации нельзя выяснить, trusted сертификат или нет (можно ли доверят серверу), поэтому SSL_connect завершится с ошибкой, при этом SSL-соединиение все-таки будет установлено, но вопрос доверия серверу оставляется всецело на совесть клиента. Это похоже на правду?
ЭЭЭ, ну вопрос доверия, думаю всецело лежит на клиенте(человеке), но вот какая штука: для SSL соединения разве не нужен сертификат??? (Просто надо смотреть нужны ли сертификаты для установления SSL-соединения или нет. Мои знания вопроса подсказывают, что нет, а получается как в анекдоте, нутром чую, что нужны). Дело в том, что SSL соединение, как я понимаю, просто зашифрованная передача пакетов. Шифрование, естественно, по всем здравомыслящим соображениям асинхронное. А следовательно идет обмен публичными (открытыми) ключами. А эти ключи где? Как передаются? Наверное, сначала надо "принять" сам сертификат, в котором описаны (или с которым связаны) публичные ключи. (Я тут не силен в терминологии, но думаю, представление дал). => сертификат нужен для SSL подключения. Хотя, думаю, в частном случае, возможно они и не нужны. Нужно смотреть сам SSL-стандарт(протокол или что это, вообще)
wvlg Значит так. Берем самоподписанный сертификат, полученный утилитой SelfSSL, отдаем его иису. С ним нифига не работает. Берем самоподписанный сертификат, полученный OpenSSL.exe, отдаем его иису. С все работает. Разница в сертификатах заключается в том, что SelfSSL не создает в сертификате поле "Key Usage". OpenSSL создает и дает ему значение "Чо-то там сертификат можно юзать для подписывания сертификатов". Валиден ли сертификат, если у него нет такого Key Usage? Т.е. это бага SelfSSL или все же OpenSSL?
А ты не пробовал изучить стандарты этого самого SSL, как он работает, его принципы и т.п.??? думаю прочитав одну-2 статьи будет сразу все ясно. А поле Key Usage, наверное, как раз и имеет отношение либо к самому ключу шифрования, либо эта опция (типо юзать\не юзать). Вот и смотри что в этих самых сертах должно быть. Какие поля. Какие существуют версии и т.п. (м\б у тя не совпадение версий или утилитка не работает, версий SSL есть несколько, насколько мне известно (ну, принципиально отличающихся)
гг, а ты как хотел? И рыбку съесть и на.... Тут, млин, вместо тя никто и не буит читать, могем тока советы дать!!! Тем более, если у тебя основная часть SSL, ТО надо бы в этом шарить.
wvlg Да в том-то и дело, что не основная. У меня тут вообще по-моему сборник всех технологий, когда-либо придуманных человеком, поэтому уделять много времени одной отдельно взятой просто не реально... Ладно, попробую погуглить/почитать, как что - сообщу.
Вообщем так. OpenSSL ругаецо, что у SelfSSL-ного сертификата в экстеншене Key Usage нету Certificate Signing. Если я правильно понимаю RFC, то наличие Key Usage имеет ограничительный характер. То есть если есть Key Usage, то сертификат предназначен только для того, что перечислено в этом Key Usage и ничего более. Далее, логично, что если у самоподписанного серта есть Key Usage, в котором нету Certificate Signing, то получается несходняк. Сертификат самоподписанный (подписан сам собой), но его изначально нельзя было использовать для подписывания сертификатов. Получается что сертификат не валиден?