"восстановление dotnet" завершается неудачно с "SSL сертификат сертификата или удаленный ключ SSH не был в порядке"

Я только что выполнил процедуру здесь: https://www.microsoft.com/net/core

и это вывод dotnet restore

log  : Restoring packages for /home/test/project.json...
error: Unable to load the service index for source https://api.nuget.org/v3/index.json.
error:   An error occurred while sending the request.
error:   SSL peer certificate or SSH remote key was not OK

Я добавил соответствующие сертификаты в доверенные, чтобы сделать curl работать, но ошибка остается для dotnet restore,

Я попытался покопаться в основном источнике, чтобы выяснить, как Nuget проверяет сертификаты SSL без удачи.Версии, которые я пробовал:

  • 1.0.0-preview1-002702
  • 1.0.0-preview2-003100

Я настроил curl используя .curlrc:

cacert=/etc/ssl/certs/ca-certificates.crt

Это исправило curl -I https://api.nuget.org призывание.

тем не мение dotnet restore -v Debug по-прежнему не удается:

trace: Running restore with 8 concurrent jobs.
trace: Reading project file /home/user/test/project.json.
log  : Restoring packages for /home/user/test/project.json...
trace: Restoring packages for .NETCoreApp,Version=v1.0...
error: Unable to load the service index for source https://api.nuget.org/v3/index.json.
error:   An error occurred while sending the request.
error:   SSL peer certificate or SSH remote key was not OK
trace: System.AggregateException: One or more errors occurred. (Unable to load the service index for source https://api.nuget.org/v3/index.json.) ---> NuGet.Protocol.Core.Types.FatalProtocolException: Unable to load the service index for source https://api.nuget.org/v3/index.json. ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.CurlException: SSL peer certificate or SSH remote key was not OK
trace:    at System.Net.Http.CurlHandler.ThrowIfCURLEError(CURLcode error)

Так что дотнет ядро ​​использует libcurl но он не использует .curlrc очевидно.

РЕДАКТИРОВАТЬ: 21/06/2016

Попытался обновить базу данных сертификатов с помощью mozroots, но это не помогло. (Похоже, больше относится к моно, чем к dotnetcore, даже если об этом упоминает страница сборки ядра dotnet).

После копания в коде corefx обработчик Curl в System.Net.Http, похоже, не устанавливает правильные параметры ssl во всех случаях (как в примере простого Curl SSL).

Я пробовал решения TylerY86:

certmgr -ssl -m https://api.nuget.org

Это не добавляет последний сертификат, даже если я наберу 'y', 'yes', '1', 'true' или что угодно.

mozroots --url https://hg.mozilla.org/mozilla-central/raw-file/tip/security/nss/lib/ckfw/builtins/certdata.txt --sync --import

Это что-то делает:

Importing certificates into user store...
194 new root certificates were added to your trust store.
Import process completed.

Я не уверен, что ядро ​​dotnet использовало сборку libcurl nss (только потому, что их страница разработки рассказывает о версии openssl (и они взаимоисключающие). Кстати, я пытался использовать сборку nss из libcurl и dotnet restore до сих пор выходит из строя.

ИМХО, проблема не в неправильной регистрации сертификатов, а в том, что встроенная проверка сертификатов curl неправильно отключена (так как проверка сертификатов выполняется в System.Net.Http, и это обязательно для предоставления клиенту кода возможности настроить эту проверку).

Почему это происходит на моей машине, а не в другом месте? Это должно быть связано с моей версией libcurl.

Однако на данный момент это всего лишь предположения.

ИЗМЕНИТЬ 22/05/2016:

При более тщательном рассмотрении кода, особенно при сравнении основной ветви и выпуска RC2, становится ясно, что код обработки SSL все еще сильно меняется.

Поэтому я просто беру код RC2 и модифицирую его, чтобы отразить, что делает основная ветка:

easy.SetCurlOption(Interop.Http.CURLoption.CURLOPT_SSL_VERIFYHOST, 0);

Тем не менее, это ничего не изменило... Но предсказал, что это было. так вот код, который я использовал:

easy.SetCurlOption(Interop.Http.CURLoption.CURLOPT_SSL_VERIFYPEER, 0);

а затем замените System.Net.Http.dll с отключенной проверкой сертификатов ssl. Не безопасно, но разблокирует меня на данный момент.

Я не добавил это как ответ, потому что это скорее взлом, чем исправление.

(реальным решением было бы полностью отключить проверки сертификатов, выполненные curl, и всегда обрабатывать их в ядре.Net, но в текущем коде на master это по-прежнему не так, это скорее своего рода сочетание обоих).

Для основной причины, я думаю, что я на конкретной установке:

  • libcurl собран без какого-либо пути к пакету сертификатов по умолчанию. curlconfig --ca вернуть пустую строку. И это не читает CURL_CA_BUNDLE переменная среды или .curlrc файл.
  • System.Net.Http (из dotnet-core) не устанавливает и не отключает проверку сертификата.

2 ответа

Решение

Откройте SSL отсутствующих сертификатов пакета

Основной причиной является отсутствие конфигурации openssl,
Если вы запустите следующую команду (или аналогичную):

openssl verify /usr/share/ca-certificates/nuget.crt

и вы получите следующий результат:

/usr/share/ca-certificates/nuget.crt: C = US, ST = Washington, L = Redmond, O = Microsoft Corporation, OU = Microsoft IT, CN = Microsoft IT SSL SHA2
error 2 at 1 depth lookup:unable to get issuer certificate
140075910137504:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
140075910137504:error:0B06F009:x509 certificate routines:X509_load_cert_file:PEM lib:by_file.c:162:

Это потому что openssl (на котором dotnet / libcurl в конечном итоге полагается делать проверки ssl) не знал, где найти пакет ca. Я не видел связанных параметров в /etc/ssl/openssl.cnf так даже

export OPENSSL_CONF=/etc/ssl/openssl.cnf

не поможет при сбое проверки openssl.

Однако следующее исправило обе проблемы (openssl и nuget)

export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt

Теперь выход для openssl:

zsh/2 906 [1] # openssl verify /usr/share/ca-certificates/nuget.crt
/usr/share/ca-certificates/nuget.crt: OK

и для dotnet restore:

zsh 904 # dotnet restore
log  : Restoring packages for /home/user/test/project.json...
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.netcore.dotnethostresolver/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.netcore.dotnethostresolver/index.json 412ms
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.netcore.dotnethost/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.netcore.dotnethost/index.json 409ms
info : Committing restore...
log  : Lock file has not changed. Skipping lock file write. Path: /home/user/test/project.lock.json
log  : /home/user/test/project.json
log  : Restore completed in 4412ms.

NuGet Config files used:
    /home/user/.nuget/NuGet/NuGet.Config

Feeds used:
    https://api.nuget.org/v3/index.json

Особая благодарность TylerY86, который помогает мне сохранить мотивацию, чтобы это исправить.

Если у вас возникла эта ошибка в контейнере докеров, запустите

  • docker system prune --volumes.

Затем остановите приложение Docker на своем компьютере. Перезагрузите вашу машину и запустите все с самого начала.

Место, откуда импортируются сертификаты, в настоящее время перенаправляет на страницу незавершенного строительства / отключения. После завершения обслуживания попробуйте еще раз. Я думаю, что это небольшая ошибка как для Mozilla, так и для сопровождающего mozroots. Все, что вы видите в выводе консоли, это либо трассировка стека, либо Couldn't retrieve the file using the supplied information. в зависимости от вашей сборки mozroots.

печаль

Обходной путь должен каким-то образом использовать certmgr для импорта правильных сертификатов CA, а затем импортировать сертификаты конечной точки (используйте certmgr -ssl -m https://api.nuget.org). Если CA для сертификатов отсутствует, сертификаты считаются недействительными. Если сертификаты считаются недействительными, вы можете импортировать их, но восстановление все равно будет вызывать панику, вызывая отсутствие сертификатов в сертификате CA соответствующего эмитента.

Я говорю как-то, потому что я еще не нашел хороший безопасный способ рекомендовать это сделать. Я определенно собираюсь приготовить правильные сертификаты mozroots в следующем образе моно +dotnet docker, который я создаю.

Более новые сборки mozroots имеют параметры командной строки для замены конечной точки данных сертификата. Собирается использовать копию web.archive.org вместо mozroots --url ... теперь. Посмотрим, смогу ли я просто использовать это или, может, вместо этого, или, возможно, другое certdata.txt из официального ртутного репозитория Mozilla.

Другие вопросы по тегам