この前は、 HTTPS 通信までだったが、 HTTPS + クライアント認証をしたくなったので試す。
環境
- OS: Windows 10 Pro
- Docker version 18.03.1-ce, build 9ee9f40
- docker-compose version 1.21.1, build 7641a569
- 使用イメージ
- gitlab: gitlab/gitlab-ce:11.0.1-ce.0
- 証明書作成系: mikoto2000/openssl:1.1.0 (2018/7/1 時点での latest が 1.1.0)
- GitHub : mikoto2000/docker-images/openssl
- 作業用ディレクトリ :
PATH_TO_GITLAB_BASE
イメージ取得
docker pull gitlab/gitlab-ce:11.0.1-ce.0
docker pull mikoto2000/openssl:latest
仕切り直しのためにボリュームを作り直す
docker container prune
docker volume rm gitlab_etc gitlab_opt gitlab_log
docker volume create gitlab_etc; docker volume create gitlab_log; docker volume create gitlab_opt
各種証明書作成
証明書作成用環境準備
作業用ディレクトリを作成し mikoto2000/openssl
環境を整える。
そして
- CA
- サーバー証明書
- クライアント証明書
を作る。
# ディレクトリを作成して移動
mkdir PATH_TO_GITLAB_BASE/work
cd PATH_TO_GITLAB_BASE/work
設定ファイルを持ってくる
# docker-compose.yml
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/docker-compose.yml -OutFile .\docker-compose.yml
# openssl.cnf
mkdir usr_lib_ssl
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/usr_lib_ssl/openssl.cnf -OutFile .\usr_lib_ssl\openssl.cnf
# v3_ca.txt
curl https://raw.githubusercontent.com/mikoto2000/docker-images/324bc3d5f81ad602dc9c35280f9cfe6f1dd0484a/openssl/usr_lib_ssl/v3_ca.txt -OutFile .\usr_lib_ssl\v3_ca.txt
移行、「CA」「サーバー」「クライアント」の作業は、この openssl 環境で作業する。
openssl 環境の利用方法
docker-compose run --rm openssl /bin/bash
CA, サーバー, クライアントの分を全部一気に作ってしまう。
CA
CA 初期化
CA の仕事。
cd /ca
# 各種ディレクトリ作成
mkdir cert private crl newcerts
chmod 700 private
# シリアル初期化
echo "01" | tee -a serial
# crlnumber 初期化
echo "01" | tee -a crlnumber
# インデックス初期化
touch index.txt
CA 鍵と CA 証明書作成
CA の仕事。
KEY_FILE="/ca/private/cakey.pem"
CSR_FILE="/ca/ca.csr"
# CA 用秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048
# CA 証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
COMMON="localhost"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"
# CA 証明書要求確認
openssl req -noout -text -in /ca/ca.csr
# CA 証明書作成
openssl x509 -req -in /ca/ca.csr -signkey /ca/private/cakey.pem -out /ca/cacert.pem -extfile /usr/lib/ssl/v3_ca.txt
証明書のコピー
CA 証明書受け渡しのために /client
ディレクトリにコピー
cp /ca/cacert.pem /client
サーバー
鍵と証明書要求の作成
サーバーの仕事。
COMMON="localhost"
KEY_FILE="/client/${COMMON}.key"
CSR_FILE="/client/${COMMON}.csr"
# クライアント秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048
# クライアント証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"
# クライアント証明書要求確認
openssl req -noout -text -in ${CSR_FILE}
証明書作成
CA の仕事。
COMMON="localhost"
CRT_FILE="/client/${COMMON}.crt"
CSR_FILE="/client/${COMMON}.csr"
cd /client
openssl ca -out ${CRT_FILE} -infiles ${CSR_FILE}
クライアント
鍵と証明書要求の作成
クライアントの仕事。
COMMON="client.example.com"
KEY_FILE="/client/${COMMON}.key"
CSR_FILE="/client/${COMMON}.csr"
# クライアント秘密鍵作成
openssl genrsa -out ${KEY_FILE} 2048
# クライアント証明書要求作成
COUNTRY="JP"
STATE="Tokyo"
LOCALITY="foo-ku"
ORGANIZATION="bar Inc."
ORGANIZATIONAL_UNIT="baz"
EMAIL="test@example.com"
SUBJECT="/C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORGANIZATION}/OU=${ORGANIZATIONAL_UNIT}/CN=${COMMON}"
openssl req -new -key ${KEY_FILE} -out ${CSR_FILE} -subj "${SUBJECT}"
# クライアント証明書要求確認
openssl req -noout -text -in ${CSR_FILE}
証明書作成
CA の仕事。
COMMON="client.example.com"
CRT_FILE="/client/${COMMON}.crt"
CSR_FILE="/client/${COMMON}.csr"
cd /client
openssl ca -out ${CRT_FILE} -infiles ${CSR_FILE}
p12 形式に変換
クライアントの仕事。
COMMON="client.example.com"
CACERT_FILE=/ca/cacert.pem
KEY_FILE=/client/${COMMON}.key
CRT_FILE=/client/${COMMON}.crt
P12_FILE=/client/${COMMON}.p12
openssl pkcs12 -export -out ${P12_FILE} -inkey ${KEY_FILE} -in ${CRT_FILE} -certfile ${CACERT_FILE}
GitLab の設定
GitLab のドキュメント Enable 2-way SSL Client Authentication の通りに設定する
docker-compose.yml
の作成
cd PATH_TO_GITLAB_BASE
vim docker-compose.yml
docker-compose.yml
version: '3'
services:
gitlab:
image: gitlab/gitlab-ce:11.0.1-ce.0
restart: always
hostname: 'localhost'
volumes:
- gitlab_etc:/etc/gitlab
- gitlab_log:/var/log/gitlab
- gitlab_opt:/var/opt/gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://localhost:443/'
nginx['redirect_http_to_https'] = true
nginx['redirect_http_to_https_port'] = 80
nginx['ssl_verify_client'] = "on"
nginx['ssl_client_certificate'] = '/etc/gitlab/trusted-certs/cacert.pem'
nginx['ssl_crl'] = '/etc/gitlab/CA.crl'
gitlab_rails['gitlab_shell_ssh_port'] = 8022
ports:
- "80:80"
- "443:443"
- "8022:22"
volumes:
gitlab_etc:
external: true
gitlab_log:
external: true
gitlab_opt:
external: true
HTTPS の設定にプラスして下記を追加。
- nginx['ssl_verify_client']: クライアント認証設定("on" or "off")
- nginx['ssl_client_certificate']: クライアント認証に使う CA 証明書のパス
- nginx['ssl_crl']: 失効リストのパス
鍵・証明書の配置
GitLab の初回起動に先立って、別コンテナで鍵と証明書を gitlab_etc
の所定の位置に格納しておく。
docker run --rm -it -v "PATH_TO_GITLAB_BASE/work/client:/client" -v "gitlab_etc:/etc/gitlab" debian:stretch-slim /bin/bash
mkdir -p /etc/gitlab/trusted-certs
cp /client/CA.crl /etc/gitlab/
cp /client/cacert.pem /etc/gitlab/trusted-certs/
mkdir -p /etc/gitlab/ssl
chmod 700 /etc/gitlab/ssl
cp /client/localhost.crt /client/localhost.key /etc/gitlab/ssl
firefox に証明書を追加
クライアント証明書
メニュー -> オプション -> プライバシーとセキュリティ -> 証明書
の証明書を表示
ボタンを押下あなたの証明書
のインポート
ボタンを押下- クライアント証明書(
client.example.com.p12
) を選択
CA 証明書
メニュー -> オプション -> プライバシーとセキュリティ -> 証明書
の証明書を表示
ボタンを押下認証局証明書
のインポート
ボタンを押下- CA 証明書(
cacert.pem
) を選択
動作確認
GitLab 起動
docker-compose up -d
ブラウザでアクセス
localhost
にアクセス- 個人証明書の要求ダイアログが出てくるので、 firefox に登録した証明書を選択
ok なはず。
0 件のコメント:
コメントを投稿