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.5にpython3.7をインストールする詳細な手順

1. Python 3をダウンロードする https://www.python.org/ftp/py...

MySQL におけるデータタイムとタイムスタンプの違い

MySQL には 3 つの日付型があります。日付(年-月-日)テーブル test(hiredate ...

便利でシンプルなMySQL関数10個

関数0. 現在の時刻を表示するコマンド: select now()。機能: 現在の時刻を表示します。...

Iframe 適応高さコードに関する 3 つの議論

B/S システム インターフェースを構築する場合、メイン ページ index.html 内に他のペー...

HTML 形式の JSON 出力の例 (テスト インターフェース)

JSON データを美しいインデント形式で表示するには、最も単純な JSON.stringify 関...

圧縮パッケージを使用して Linux 環境に JDK 13 をインストールする方法

JDK とは何ですか?まあ、この質問がわからないのであれば、なぜこれをインストールするのか本当にわか...

Vue3 ページ、メニュー、ルートの使用

目次1. メニューをクリックしてジャンプ1. ページ名の統一2. 管理ページを追加3. ルートを追加...

nginxでイメージサーバーを構築する手順の詳しい説明(ルートとエイリアスの違い)

インストール手順は省略します( yum -y install nginx;を使用して直接インストール...

Element-UIの10の驚くべきトリックのまとめ

目次el-scrollbar スクロールバーel-uploadはクリックをシミュレートしますel-s...

VMware での Ubuntu Docker のインストール (コンテナ構築)

1. マインドマップ 2. コンテナの構築方法2.1 実験環境の準備(1)環境選択管理ツール: D...

WeChatミニプログラムで検索キーワードを強調表示するサンプルコード

1. はじめにプロジェクトで要件に遭遇したら、データを検索してキーワードを強調表示します。要件を受け...

MySQL および Oracle のバッチ挿入 SQL の一般的な記述例

目次例えば:一般的な執筆:要約する例えば:次に、データベースのUSERテーブルにUserオブジェクト...

SQL ステートメント実行の詳細な説明 (MySQL アーキテクチャの概要 -> クエリ実行プロセス -> SQL 解析順序)

序文:私はずっと、SQL 文がどのように、どのような順序で実行されるのかを知りたいと思っていました。...

CSS3 フィルター (フィルタ) ウェブページのグレーまたは黒モードのサンプルコードを実現

フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...

HTMLで特殊記号を表示する(特殊文字対応表付き)

問題の再現HTML を使用して編集する場合、特殊記号によってエラーが表示されることが多く、極端な場合...