blob: 230465ebd8634861a775b72844a5b860b2762086 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#!/usr/bin/env bash
set -euo pipefail
cd "$(dirname "$0")"
DOMAIN="vpn.yyamashita.com"
CADDY_DIR="/app/infra/caddy"
CADDY_CERT_BASE="/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/${DOMAIN}/${DOMAIN}"
echo "証明書を更新中..."
mkdir -p certs
if ! docker compose -f "$CADDY_DIR/docker-compose.yml" exec -T caddy \
cat "${CADDY_CERT_BASE}.crt" > certs/server.crt; then
echo "Error: 証明書の取得に失敗しました。Caddyfile に ${DOMAIN} が設定されているか確認してください。"
exit 1
fi
docker compose -f "$CADDY_DIR/docker-compose.yml" exec -T caddy \
cat "${CADDY_CERT_BASE}.key" > certs/server.key
chmod 600 certs/server.key
# チェーン分割: 1枚目=リーフ、残り=中間CA
awk '/BEGIN CERTIFICATE/{n++} n==1' certs/server.crt > certs/server-leaf.crt
awk '/BEGIN CERTIFICATE/{n++} n>1' certs/server.crt > certs/server-chain.crt
mv certs/server-leaf.crt certs/server.crt
# チェーンの最後の証明書の AIA からルート CA を取得して追加する
# Android 12 の IKEv2 スタックは presented certs の中に trust store のルートが
# 含まれていることを要求するため、ISRG Root X1 を明示的に送る必要がある
N=$(grep -c "BEGIN CERTIFICATE" certs/server-chain.crt)
tmpder=$(mktemp)
awk -v n="$N" '/BEGIN CERTIFICATE/{c++} c==n,/END CERTIFICATE/{print}' certs/server-chain.crt > "$tmpder"
AIA_URL=$(openssl x509 -in "$tmpder" -text -noout 2>/dev/null | grep "CA Issuers" | sed 's/.*URI://' | tr -d '[:space:]')
rm -f "$tmpder"
if [ -n "$AIA_URL" ]; then
echo "ルート CA を追加中: $AIA_URL"
curl -sf "$AIA_URL" | openssl x509 -inform DER >> certs/server-chain.crt || \
echo "警告: ルート CA の取得をスキップしました"
fi
# 中間 CA 証明書を Caddy で配信(クライアントが手動インストールする場合に使用)
awk '/BEGIN CERTIFICATE/{n++} n==1' certs/server-chain.crt > "$CADDY_DIR/ca.pem"
echo "証明書を更新しました。"
bash "$(pwd)/deploy.sh"
|