1

ここの手順に従いました: 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 の既定値を設定することも、証明書の検証を無効にすることもありません。
4

3 に答える 3

2

Open 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

これを修正する動機を維持するのを手伝ってくれたTylerに感謝します。

于 2016-06-23T10:40:49.400 に答える
1

現在、証明書がインポートされている場所は、建設中/停止中のページにリダイレクトされます。メンテナンスが完了したら、もう一度お試しください。これは、Mozilla または mozroots メンテナーのどちらかにとって、ちょっとした失敗だと思います。コンソール出力に表示されるのは、スタック トレースかCouldn't retrieve the file using the supplied information.、mozroots のビルドに応じたものだけです。

悲しみ

回避策は、何らかの形で certmgr を使用して正しい CA 証明書をインポートしてから、エンドポイント証明書をインポートすることです (を使用certmgr -ssl -m https://api.nuget.org)。証明書の CA が見つからない場合、証明書は無効と見なされます。証明書が無効であると見なされた場合は、それらをインポートできますが、復元は依然としてパニックになり、一致する発行者 CA 証明書が証明書にないことを示します。

私はまだそれを行うことを推奨する安全な方法を見つけていないので、どういうわけか言います. 私は間違いなく、私がビルドする次の mono+dotnet docker イメージに適切な mozroots 証明書を焼き付けます。

新しいビルドの mozroots には、証明書データ エンドポイントを置き換えるコマンド ライン パラメーターがあります。今のところ、代わりにweb.archive.org のコピーを使用しmozroots --url ...ます。これを使用できるか代わりにこれを使用できるか、または Mozilla の公式の mercurial リポジトリから別のものを使用できるかどうかを確認します。certdata.txt

于 2016-06-21T04:15:48.837 に答える