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

推薦する

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

ウェブサイトのビジュアルデザイン(画像とテキスト)における情報伝達の役割と方法

現代の Web ビジュアル デザインは、初期の情報の積み重ねから、その後のグラフィックスと抽象化、そ...

Vueの子コンポーネントと親コンポーネントの詳細な分析

目次1. 親コンポーネントと子コンポーネント2. テンプレート分離書き込み1. テンプレートタグ2....

mysql 5.7.18 winx64 パスワード変更

MySQL 5.7.18 が正常にインストールされた後、バージョン 5.7 では空のパスワードでのロ...

AngularパイプラインPIPEの紹介と使い方

序文PIPE、パイプラインと翻訳されます。 Angular パイプは、HTML コンポーネントで宣言...

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...

Bootstrap 3.0 学習ノートのページレイアウト

今回はレイアウトを中心に学習しますが、これは基本的なHTMLタグのほとんどにも存在するため、比較的簡...

Vue+swiperでタイムライン効果を実現

この記事では、タイムライン効果を実現するためのvue+swiperの具体的なコードを参考までに共有し...

Nginx の負荷分散構成、ダウンタイム発生時の自動切り替えモード

厳密に言えば、nginx には負荷分散バックエンド ノードのヘルス チェック機能はありませんが、デフ...

Nginx+SpringBoot による負荷分散の実装例

負荷分散の概要Nginx の負荷分散実装を紹介する前に、負荷分散の分類について簡単に説明します。負荷...

一般的な CSS プロパティのブラウザ互換性の概要 (推奨)

CSS プロパティのブラウザ互換性をまとめる必要があるのはなぜですか?使用する際は、Can I U...

Windows で MySQL のルート パスワードを忘れた場合にリセットする方法

私のマシン環境: Windows 2008 R2 MySQL 5.6 Baidu で「Windows...

Zookeeper&Kafka クラスターを構築するための Docker の実装

最近Kafka勉強しています。クラスタの状態をテストする準備をしていたときに、仮想マシンを 3 つ開...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...