web-dev-qa-db-ja.com

DockerlinuxコンテナへのSSL証明書の追加

予想される動作コンテナ内からHTTPS呼び出しを行うことができる

実際の動作

System.InvalidOperationException: IDX10803: Unable to obtain configuration from: 'https://identity.test/.well-known/openid-configuration'. ---> System.IO.IOException: IDX10804: Unable to retrieve document from: 'https://identity.test/.we
ll-known/openid-configuration'. ---> System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.CurlException: SSL connect error

情報問題は、私のコンテナがこのhttp呼び出しに使用する必要のある証明書についてまったく知らないことだと思います。だから私がやろうとしたのは、次のようなdockerfileを介してコンテナ自体にそれらを提供することです。

FROM Microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

#Copy csproj and restore as distinct layers
COPY PublishOutput/. ./

FROM Microsoft/aspnetcore:2.0
WORKDIR /app
COPY --from=build-env /app .

COPY Certificates/myCertificate.cer /usr/local/share/ca-certificates/myCertificate
RUN update-ca-certificates

ENTRYPOINT ["dotnet", "CaseApi.Web.dll"]

PublishOutputフォルダー内には、Dockerコンテナー内で実行する必要のある.netコアAPIのすべてのdllがあります。

Dockerfileをビルドすると、次のように表示されます。

Step 8/9 : RUN update-ca-certificates
 ---> Running in b025a42f2edc
Updating certificates in /etc/ssl/certs...
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.

使用したい証明書が実際には使用されていないと思います。私は何が間違っているのですか?前もって感謝します!

3
Tarta

おそらく問題はupdate-ca-certificatesにあります。このコマンドは、拡張子が.crtのファイルのみを処理します。そのmanページから:

Update-ca-certificatesに含めるには、証明書の拡張子が.crtである必要があります。

したがって、Dockerfileで証明書をコピーするときに、この拡張機能を追加するだけです。

COPY Certificates/myCertificate.cer /usr/local/share/ca-certificates/myCertificate.crt
1
Ignacio Millán

従う手順:

1)証明書の拡張子が.crtであることを確認します

2)Notepad ++などで証明書を開きます

3)証明書を/ usr/local/share/ca-certificates /にコピーします。 update-ca-certificatesコマンドは、そのフォルダーから証明書を読み取ります: http://manpages.ubuntu.com/manpages/trusty/ man8/update-ca-certificates.8.html

4)これらの手順の後、dockerfileをビルドすると、0が追加され、0が削除され、1が追加されたとは表示されなくなります。 、0が削除されました;または同様のもの、追加した証明書の数に応じて

5)解決策がまだない可能性があります。証明書は、他の証明書の階層に依存します。私はウィンドウズにいて、証明書マネージャーに行くと、私の証明書が2つの上位のものに依存していることがわかります(これは証明書パスに表示されます):

Certification Path

したがって、階層内のすべての証明書を/ usr/local/share/ca-certificates /に必ず配置する必要があります。

6)それでも、正しい証明書を渡すことを考えているかもしれませんが、そうではないかもしれません。私の場合、IdentityServerはIISでホストされていました。バインディングでは、IdentityServerが実際にhttpsを介した呼び出しを予期していることがわかり、バインディングをダブルクリックすると、IdentityServerが呼び出しを受け入れるために必要な証明書を確認できました。

0
Tarta