ここの手順に従いました: https://www.microsoft.com/net/core#ubuntu
そしてそれはの出力です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)
したがって、dotnetコアは使用しlibcurl
ますが、明らかに使用しません.curlrc
。
編集:2016年6月21日
証明書データベースも mozroots で更新しようとしましたが、効果がありませんでした。(ドットネットコアの構築ページで言及されていても、ドットネットコアよりもモノに関連しているようです)。
corefx コードを掘り下げた後、System.Net.Http の Curl ハンドラーは、すべての場合に適切な ssl オプションを設定していないようです ( Simple Curl SSL サンプルのように)。
タイラーのソリューションを試しました:
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バージョンについて説明されているため(そしてそれらは相互に排他的であるため))ちなみに、libcurlのnssビルドとdotnet restoreをまだ使用しようとしました失敗します。
IMHO、問題は証明書の登録が悪いこととは関係ありませんが、curl 組み込み証明書の検証が適切に無効にされていないという事実に関連しています (証明書の検証は System.Net.Http で行われ、クライアント コードに次の機能を提供することが必須であるため)。この検証をカスタマイズします)。
他の場所ではなく、自分のマシンで発生しているのはなぜですか? 私のバージョンのlibcurlに関連している必要があります。
ただし、これらはすべて現時点での仮定にすぎません。
編集 22/05/2016:
特に master ブランチと 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 コアで処理することですが、マスターの現在のコードではまだそうではなく、両方の混合のようなものです)。
根本的な原因については、私は特定のセットアップにいると思います:
- デフォルトの証明書バンドル パスなしでビルドされた libcurl。
curlconfig --ca
空の文字列を返します。CURL_CA_BUNDLE
また、環境変数または.curlrc
ファイルを読み取りません。 - System.Net.Http (dotnet-core の) は、ca の既定値を設定することも、証明書の検証を無効にすることもありません。