2015-03-17 2 views
0

Скачан Win32OpenSSL_Light-1_0_2.exe с Shining Light Productions и установил его по умолчанию C:\OpenSSL-Win32. Я скопировал файл ca-bundle.crt в C:\OpenSSL-Win32\bin и побежал:Ошибка проверки сертификата s_client в Windows для login.live.com

C:\OpenSSL-Win32\bin>openssl s_client -connect login.live.com:443 -CAfile ca-bundle.crt 

Проверка цепочки сертификатов завершается с сообщением:

Verify return code: 20 (unable to get local issuer certificate) 

Используя ту же команду с тем же ca-bundle.crt файлом на Debian свистящих с OpenSSL версии 1.0.1e возвращается:

Verify return code: 0 (ok) 

Если изменить имя хоста к api.onedrive.com (запятая же nd) Я получаю Verify return code: 0 (ok) как на Windows, так и на Linux.

Я делаю что-то неправильно или есть известная ошибка? Как я могу заставить его работать в Windows для login.live.com?

(Сначала я наткнулся на эту проблему, когда trying to connect to login.live.com with PHP's cURL extension under Windows XAMPP, но теперь это больше похоже на вопрос OpenSSL.)

+0

Этот вопрос не соответствует теме, поскольку речь идет не о программировании и разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, [Super User] (http://superuser.com/) будет лучше спросить. – jww

ответ

2

s_client имеет недокументированные свойства (или, возможно, более давнюю ошибку), что если вы даете -CAfile он будет не только проверять этот файл CA, но также и по умолчанию для систем (/usr/lib/ssl/certs на Debian). Если вы запустите openssl s_client с strace, чтобы проверить, какие файлы используются в ходе проверки вы увидите следующее:

$ strace -e open openssl s_client -connect login.live.com:443 -CAfile ca-bundle.crt 
... 
open("ca-bundle.crt", O_RDONLY)   = 3 
open("/usr/lib/ssl/cert.pem", O_RDONLY) = -1 ENOENT (No such file or directory) 
... 
open("/usr/lib/ssl/certs/415660c1.0", O_RDONLY) = 4 
open("/usr/lib/ssl/certs/415660c1.1", O_RDONLY) = 4 

Из этого выхода вы можете видеть, что он не только использует данный файл CA для проверки, но и пытаетесь используйте /usr/lib/ssl/cert.pem (не существует), а затем просмотрите /usr/lib/ssl/certs, чтобы найти требуемый СА по теме хеш 415660c1. Там он, наконец, находит корневой центр сертификации, который ищет в 415660c1.1:

$ openssl x509 -in /usr/lib/ssl/certs/415660c1.1 -text 
... 
Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority 
... 
Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority 

Поскольку нет системы по умолчанию на Windows, используемые на OpenSSL (он не может использовать хранилище Windows, CA) проверка утратит там.

Что касается api.onedrive.com: у этого есть другая цепочка доверия и может быть полностью проверена с помощью данного пакета СА. Выходной сигнал от strace показывает, что он не пытается получить доступ к файлам внутри /usr/lib/ssl/certs.

+0

Спасибо, это ответило на мой первоначальный вопрос! Однако есть еще две вещи, которые я не понимаю: (1) Оба сертификата, VeriSign Class 3 Public Primary Certification Authority' (415660c1.0) и 'VeriSign Class 3 Public Primary Certification Authority 2' (415660c1.1) подтверждают подключение к login.live.com с помощью s_client в Windows. Почему обе работают? (2) Firefox показывает, что VeriSign Class 3 Public Primary Certification Authority - G5' является корневым сертификатом для login.live.com. Экспорт этого сертификата и передача его в s_client не подтверждают соединение. Почему нет? –

+0

Оба эти сертификата имеют один и тот же объект и, таким образом, один и тот же предметный хеш. Но у них разные открытые ключи, и только один из этих ключей можно использовать для проверки сети доверия. –

+1

И для другого вопроса, почему власть G5 не может использоваться для проверки login.live.com ... Это длинная и уродливая история, и в конце я считаю ошибку с OpenSSL. Подробнее см. Http://kriscience.blogspot.de/2013/03/supporting-trusted-but-untrusted.html –

Смежные вопросы