"восстановление 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.