DockerのTLS(SSL)証明書の有効期限の問題を解決する

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象:

[root@localhost ~]# docker イメージをプル xxx.com.cn/centos7

デフォルトタグの使用: 最新

デーモンからのエラー応答: Get https://xxx.com.cn/v1/_ping: x509: 証明書の有効期限が切れているか、まだ有効ではありません

考えられる原因の分析:

Linux は date を使用して現在の時刻を確認し、それを証明書の有効期間と比較して具体的な理由を取得します。具体的な理由は次の 2 つのいずれかです。

1. このマシンの時刻は間違っています。

2. レジストリの証明書の有効期限が切れている。

解決:

1. このマシンの時刻は間違っています。

現地時間を変更するだけ

2. レジストリの証明書の有効期限が切れている。

レジストリの SSL セキュリティ例外を作成し、レジストリ サーバー証明書の有効性チェックを放棄しますが、これにはセキュリティ上のリスクがあります。

安全でないレジストリが有効になっている場合、Docker は次の手順で https への接続を試みます。

まず HTTPS を使用してみてください。

HTTPS 接続にアクセスできるが証明書が利用できない場合は、証明書エラーを無視します。

HTTPS 接続が利用できない場合は、HTTP が使用されます。

CentOS /etc/docker/ ディレクトリにデーモン構成ファイル daemon.json を作成し、ターゲット レジストリの IP アドレス セグメントまたは特定のサービス ドメイン名とポート番号を json ファイルに書き込みます。

たとえば、サーバーが配置されているネットワーク セグメントが 10.0.0.0/8 の場合、コンテンツは次のようになります。

{
 "安全でないレジストリ" : ["10.0.0.0/8"]
}
 

次に示すように、ドメイン名とポート番号を組み合わせて使用​​することもできます。

{
 "安全でないレジストリ" : ["myregistrydomain.com:5000"]
}

Windows の場合は、C:\ProgramData\docker\config\daemon.json ファイルを変更します。形式は Linux の場合と同じです。

docker サービスを再起動します。

有効かどうかを確認し、Insecure Registries フィールドに注意してください。

[root@localhost ~]# docker 情報
 
docker情報:
コンテナ: 0
 ランニング: 0
 一時停止: 0
 停止: 0
画像: 2
サーバーバージョン: 17.05.0-ce
ストレージ ドライバー: オーバーレイ
 バックアップファイルシステム: xfs
 d_type をサポート: true
ログドライバー: json-file
cgroup ドライバー: cgroupfs
プラグイン:
 ボリューム: ローカル
 ネットワーク: ブリッジ ホスト macvlan null オーバーレイ
群れ: 非アクティブ
ランタイム: runc
デフォルトのランタイム: runc
初期化バイナリ: docker-init
コンテナバージョン: 9048e5e50717ea4497b757314bad98ea3763c145
runc バージョン: 9c2d8d184e5da67c95d601382adf14862e4f2228
初期化バージョン: 949e6fa
セキュリティ オプション:
 seccomp
 プロフィール: デフォルト
カーネルバージョン: 3.10.0-693.el7.x86_64
オペレーティング システム: CentOS Linux 7 (コア)
OSタイプ: Linux
アーキテクチャ: x86_64
CPU: 24
合計メモリ: 62.74 GiB
名前: localhost.localdomain
ID: 755F:OEFV:VP3S:BMGQ:VUFW:WGT5:YQHO:EW6T:AAVE:NHS2:TPV3:SBTJ
Docker ルートディレクトリ: /var/lib/docker
デバッグモード(クライアント): false
デバッグモード(サーバー): false
レジストリ: https://index.docker.io/v1/
実験的: 偽
安全でないレジストリ:
 10.0.0.0/8
 127.0.0.0/8
ライブリストアが有効: false

サーバー証明書の有効期限を確認する方法

Firefoxを例に挙げましょう

補足: Docker プライベートリポジトリ内の期限切れの自己署名証明書を置き換える

Dockerレジストリ証明書の置き換え

イメージをプルするときに次のエラーが報告されます:

k8s@master:~/shiyu$ docker pull reg.netlab.com/tensorflow-cpu
デフォルトタグの使用: 最新
デーモンからのエラー応答: Get https://reg.netlab.com/v2/: x509: 証明書の有効期限が切れているか、まだ有効ではありません

/etc/docker/certs 内の証明書の有効期限が切れていないか確認する

root@master:~# openssl x509 -in /etc/docker/certs.d/reg.netlab.com/reg.netlab.com.crt -noout -dates
notBefore=2019年4月1日 13:21:22 GMT
notAfter=2020年3月31日 13:21:22 GMT

どうやら、自己署名証明書は2020年3月31日に期限切れになったようです。

新しい証明書に再署名する

キーと秘密鍵を保存するための~/certsフォルダを作成します

mkdir -p ~/certs

キーを生成する

cd ~/certs
openssl genrsa -out reg.netlab.com.key 2048

キーファイルの生成

openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.netlab.com.key -x509 -days 365 -out reg.netlab.com.crt

関連情報を入力してください

国名(2文字コード)[XX]:CN # 国名 州または省名(フルネーム)[]:guangdong
# 省 地域名 (例: 市) [デフォルトの市]:guagnzhou # 市 組織名 (例: 会社) [デフォルトの会社 Ltd]:sysu
# 組織単位名 (例: セクション) []:netlab # 共通名 (例: 自分の名前またはサーバーのホスト名) []:reg.netlab.com # メールアドレス []:[email protected]

この時点で、証明書の自己署名は完了です。

証明書をDockerルート証明書に追加し、Dockerを再起動します。

注意: 自己署名証明書であるため、デフォルトでは Docker によって信頼されないため、証明書を Docker のルート証明書に追加する必要があります。CentOS 7/Ubuntu 18 では、証明書の保存パスは /etc/docker/certs.d/ドメイン名です。

証明書をDockerルート証明書に追加する

mkdir -p /etc/docker/certs.d/reg.netlab.com
cp ~/certs/reg.netlab.com.crt /etc/docker/certs.d/reg.netlab.com/

Dockerを再起動する

systemctl dockerを再起動します

Docker レジストリ コンテナ内の期限切れの証明書を置き換える

レジストリコンテナIDを表示する

k8s@master:~$ docker ps |grep レジストリ
3eb5eda4b75e registry.docker-cn.com/library/registry:2 "/entrypoint.sh /etc…" 13 か月前 44 分前 0.0.0.0:443->5000/tcp レジストリ
b84ea71a572f f32a97de94e1 "/entrypoint.sh /etc…" 13 か月前 約 1 時間前 0.0.0.0:5000->5000/tcp registry_mirror

IDに応じてrigstryのマウントパスを表示します

k8s@マスター:~$ docker 検査 3eb5eda4b75e
...
「バインド」: [
   "/root/certs:/certs",
   「/home/レジストリ:/var/lib/レジストリ」
  ]
...

新しく生成された証明書を/root/certs:/certsディレクトリにコピーします。

ルート@マスター:~/certs#ll
総投与量 16
drwxr-xr-x 2 ルート ルート 4096 2019年4月1日 ./
drwx------ 8 ルート ルート 4096 5月 2日 14:06 ../
-rw-r--r-- 1 ルート ルート 2126 2019年4月1日 reg.netlab.com.crt
-rw------ 1 ルート ルート 3272 2019年4月1日 reg.netlab.com.key

レジストリコンテナを再起動する

k8s@master:~$ systemctl dockerを再起動します

この時点で、自己署名証明書が更新されました。

テスト

k8s@master:~/shiyu$ docker pull reg.netlab.com/tensorflow-cpu
デフォルトタグの使用: 最新
最新: tensorflow-cpu から取得
ダイジェスト: sha256:68da50778a5f80e0676c4ca617299444fc71677a2d83cacccaf7a08d08cc1df6
ステータス: reg.netlab.com/tensorflow-cpu:latest のイメージは最新です

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • ドメイン名証明書の有効期限が切れていないか確認するシェルスクリプトのプロセス分析
  • SSL自己署名証明書を生成するシェルスクリプト
  • SSL証明書の有効期限を監視するスクリプトの例

<<:  MySQL mysqladmin クライアントの使用の概要

>>:  単一のdivの正多角形変換を実現する純粋なCSS

推薦する

CentOS6 アップグレード glibc 操作手順

目次背景glibc 2.14をコンパイルするソフトリンクを変更するやっと背景テスト環境には Cent...

ApacheとTomcatによるクラスタ環境構築プロセスの分析

実際、Apacheクラスタを構築するのは難しくありません。私もインターネットで情報を見つけて自分で設...

Window.nameはクロスドメインデータ転送の問題を解決します

<br />原文: http://research.microsoft.com/~hel...

CSS3を使用してトランジションとアニメーション効果を実現する

JS アニメーションの代わりに CSS アニメーションを使用する必要があるのはなぜですか? Java...

Dockerのクイックガイド

Docker は、安全で繰り返し可能な環境でソフトウェアを自動的にデプロイする方法を提供し、コンピュ...

Centos7 に mysql 8.0.13 (rpm) をインストールする詳細なチュートリアル

yum か rpm か? yum によるインストール方法は非常に便利ですが、公式サイトから MySQ...

mysql-8.0.16 winx64 最新インストール チュートリアル (画像とテキスト付き)

最近、データベースについて学び始めました。最初にやったことは、データベースとは何か、データベースとデ...

初心者のためのWebサイト構築入門 ③ エイリアス(CNAME)レコードとURL転送

①. エイリアス(CNAME)レコードの使用方法:前回の投稿のドメイン名解決では、A レコードの解...

計算機機能を実装するミニプログラム

この記事の例では、計算機機能を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

MySQLカバーインデックスの利点

一般的な提案は、WHERE 条件のインデックスを作成することですが、これは実際には一方的です。インデ...

Linux に MySQL をインストールする方法 (yum とソース コードのコンパイル)

Linux に MySQL をインストールするには、yum インストールとソース コード コンパイ...

ApacheBench でマルチ URL をサポートする方法

標準の ab は単一の URI でのストレス テストのみをサポートしており、実際のニーズを満たしてい...

Vue は URL に基づいて非同一オリジンのファイルをどのようにダウンロードするのか

一般的に、URL に基づいてファイルをダウンロードする場合、次の 2 つの解決策があります。 1. ...

MySQL でよく使用されるステートメントの包括的な概要 (必読)

以下にまとめたナレッジポイントはどれもよく使われる貴重な情報ばかりですので、ぜひ上手に集めてください...

W3C チュートリアル (6): W3C CSS アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。スタイル シートは...