DNS-01 チャレンジ(DNSのTXTレコードによる認証)を使用する場合は以下の手順に従ってください。
また、DNS-01 チャレンジではWildcard証明書の取得が可能です。 Wildcard証明書を取得、更新するモードでは証明書の同期も行われます。
今のところDNSサービスはAWS Route53、Google Cloud DNSに対応しています。
その他詳細はgithubのREADMEを参照してください。
dns-kubernetes/cronjob.ymlにてクラウドサービスやrhems-badgesの各種変数を設定してください。
# 一部抜粋
spec:
timeZone: Asia/Tokyo
schedule: "0 0 * * *" # cronの設定
jobTemplate:
spec:
template:
spec:
initContainers:
- name: init-getssl
image: rhems-getssl-job
imagePullPolicy: IfNotPresent
command:
- ./create-cert
args:
- '-i=true'
- '-f'
- '/root/config.yml'
- '-dns-validation=true' # DNS-01 チャレンジのためこのオプションを追加してください。
- '-dns-service=route53' # DNSサービスを指定します。デフォルトは"route53"です。"route53"、"gcloud-dns"のいずれかを指定してください。
env:
- name: TZ
value: Asia/Tokyo
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: API_TOKEN
value: __BADGE_API_TOKEN__ # rhems-badgesのAPIトークン
- name: ORGANIZATION
value: __ORGANIZATION__ # organization名
- name: REPO
value: __REPO__ # repo名
- name: APP
value: __APP__ # app名
- name: BRANCH
value: __BRANCH__ # branch名
- name: CRON
value: "0 15 * * *" # rhems-badgesでのcronの設定 Etc/UTCなのでマニフェストの時間との違いに注意してください。
- name: GRACE_TIME
value: "10" # cronの実行時間を考慮したグレースタイム
- name: SLACK_FAILED
value: __SLACK_FAILED__ # slackの通知先
- name: SLACK_SUCCESS
value: __SLACK_SUCCESS__ # slackの通知先
containers:
- name: rhems-getssl
image: rhems-getssl-job
imagePullPolicy: IfNotPresent
command:
- ./create-cert
args:
- '-c'
- 'aws' # 証明書をアップロードするクラウドサービス aws or tencent
- '-dns-validation=true' # DNS-01 チャレンジのためこのオプションを追加してください。
- '-force=true' # 強制的に証明書を取得し更新する場合はこのオプションを追加してください。
- '-update-before-day=30' # 有効期限から何日前以内に更新するかを設定する場合はこのオプションを追加してください。 デフォルトでは3日前に更新します。
env:
- name: TZ
value: Asia/Tokyo
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: API_TOKEN
value: __BADGE_API_TOKEN__ # rhems-badgesのAPIトークン
- name: ORGANIZATION
value: __ORGANIZATION__ # organization名
- name: REPO
value: __REPO__ # repo名
- name: APP
value: __APP__ # app名
- name: BRANCH
value: __BRANCH__ # branch名
- name: CRON
value: "0 15 * * *" # rhems-badgesでのcronの設定 Etc/UTCなのでマニフェストの時間との違いに注意してください。
- name: GRACE_TIME
value: "10" # cronの実行時間を考慮したグレースタイム
- name: SLACK_FAILED
value: __SLACK_FAILED__ # slackの通知先
- name: SLACK_SUCCESS
value: __SLACK_SUCCESS__ # slackの通知先
dns-kubernetes/config.ymlにて取得したいドメインや書き換え対象のsecret、ingress名などを設定してください。
# tencentの場合
gcloud_service_account_json_name: /root/abcd-123456789.json # -dns-service=gcloud-dnsを指定する場合はGoogle CloudのサービスアカウントのJSONファイルを指定してください。
info:
- wildcard_domain: "*.test-getssl.example.com"
wildcard_sans:
- "*.mail.test-getssl.example.com"
- "*.api.test-getssl.example.com"
- "*.admin.test-getssl.example.com"
check_domains:
- "cert.test-getssl.example.com"
secrets:
- namespace: application-1
secret_name: rhems-getssl-cert
- namespace: application-2
secret_name: rhems-getssl-cert-2
- namespace: application-3
secret_name: rhems-getssl-cert-3
clbs:
- load_balancer_id: lb-12345678
listener_ids:
- "lbl-12345678"
region: ap-tokyo
---
# awsの場合
gcloud_service_account_json_name: /root/abcd-123456789.json # -dns-service=gcloud-dnsを指定する場合はGoogle CloudのサービスアカウントのJSONファイルを指定してください。
info:
- wildcard_domain: "*.test-getssl.example.com"
wildcard_sans:
- "*.mail.test-getssl.example.com"
- "*.api.test-getssl.example.com"
- "*.admin.test-getssl.example.com"
check_domains:
- "cert.test-getssl.example.com"
ingresses:
- namespace: application-1
ingress_name: rhems-getssl-ingress
- namespace: application-2
ingress_name: rhems-getssl-ingress-2
- namespace: application-3
ingress_name: rhems-getssl-ingress-3
dns-kubernetes/env.ymlにて各種クラウドサービス接続用のKeyやSecretを設定してください。
Tencentの場合でもRoute53にドメインを登録するためにAWSのKey/Secが必要です。
# tencentの場合
apiVersion: v1
kind: Secret
metadata:
name: env
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: __AWS_ACCESS_KEY_ID__ # AWSのアクセスキー
AWS_SECRET_ACCESS_KEY: __AWS_SECRET_ACCESS_KEY__ # AWSのシークレットキー
AWS_DEFAULT_REGION: __AWS_DEFAULT_REGION__ # AWSのリージョン
AWS_DEFAULT_OUTPUT: json # AWSの出力形式
TENCENTCLOUD_SECRET_ID: __TENCENTCLOUD_SECRET_ID__
TENCENTCLOUD_SECRET_KEY: __TENCETCLOUD_SECRET_KEY__
TENCENTCLOUD_REGION: __TENCENTCLOUD_REGION__
---
# awsの場合
apiVersion: v1
kind: Secret
metadata:
name: env
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: __AWS_ACCESS_KEY_ID__ # AWSのアクセスキー
AWS_SECRET_ACCESS_KEY: __AWS_SECRET_ACCESS_KEY__ # AWSのシークレットキー
AWS_DEFAULT_REGION: __AWS_DEFAULT_REGION__ # AWSのリージョン
AWS_DEFAULT_OUTPUT: json # AWSの出力形式
dns-kubernetes/rbac.ymlにて各種権限を設定してください。
apiVersion: v1
kind: ServiceAccount
metadata:
name: getssl-job
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubectl-role-binding-getssl-job
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin # 権限を設定してください
subjects:
- name: getssl-job
kind: ServiceAccount
namespace: rhems-getssl # namespace名
dns-kubernetes/kustomization.ymlにてデプロイするnamespaceを設定してください。
# 一部抜粋
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: rhems-getssl # namespace名
dns-kubernetesディレクトリにてkubectl kustomizeコマンドを実行し内容に問題が無いかどうか確認してください。
$ kubectl kustomize .
問題が無ければkubectl applyコマンドを実行してください。
$ kubectl apply -k .
Cronjobを手動で実行しエラー無く完了するかどうか確認を行って下さい。
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
rhems-getssl 0 0 * * * False 0 8m34s
$ kubectl create job --from=cronjob/rhems-getssl rhems-getssl-manual-123456
job.batch/rhems-getssl-manual-123456 created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
rhems-getssl-manual-123456-7hf6c 1/1 Running 0 18s
HTTP-01 チャレンジ(HTTPアクセスによるトークン認証)を使用する場合は以下の手順に従ってください。
なお、制約として下記にご注意ください。
- 取得予定のドメインをhostコマンドで解決可能であること。
- 80番ポートが外部からアクセス可能であること。 HTTPSリダイレクトも可。
- 通常の証明書のみが取得可能。ワイルドカード証明書は取得不可。
- GoサーバーとCronJobのPodが取得したいドメインでアクセス可能なIngressと同じNamespaceに存在していること。
http-kubernetes/cronjob.ymlにてクラウドサービスやrhems-badgesの各種変数を設定してください。
# 一部抜粋
spec:
timeZone: Asia/Tokyo
schedule: "0 0 * * *" # cronの設定
jobTemplate:
spec:
template:
spec:
initContainers:
- name: init-getssl
image: rhems-getssl-job
imagePullPolicy: IfNotPresent
command:
- ./create-cert
args:
- '-i=true'
- '-f'
- '/root/config.yml'
env:
- name: TZ
value: Asia/Tokyo
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: API_TOKEN
value: __BADGE_API_TOKEN__ # rhems-badgeのAPIトークン
- name: ORGANIZATION
value: __ORGANIZATION__ # organization名
- name: REPO
value: __REPO__ # repo名
- name: APP
value: __APP__ # app名
- name: BRANCH
value: __BRANCH__ # branch名
- name: CRON
value: "0 15 * * *" # badgesでのcronの設定 Etc/UTCなのでマニフェストの時間との違いに注意してください。
- name: GRACE_TIME
value: "10" # cronの実行時間を考慮したグレースタイム
- name: SLACK_FAILED
value: __SLACK_FAILED__ # slackの通知先
- name: SLACK_SUCCESS
value: __SLACK_SUCCESS__ # slackの通知先
containers:
- name: rhems-getssl
image: rhems-getssl-job
imagePullPolicy: IfNotPresent
command:
- ./create-cert
args:
- '-c'
- 'aws' # 証明書をアップロードするクラウドサービス aws or tencent
- '-force=true' # 強制的に証明書を取得し更新する場合はこのオプションを追加してください。
- '-update-before-day=30' # 有効期限から何日前以内に更新するかを設定する場合はこのオプションを追加してください。 デフォルトでは3日前に更新します。
env:
- name: TZ
value: Asia/Tokyo
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: API_TOKEN
value: __BADGE_API_TOKEN__ # rhems-badgeのAPIトークン
- name: ORGANIZATION
value: __ORGANIZATION__ # organization名
- name: REPO
value: __REPO__ # repo名
- name: APP
value: __APP__ # app名
- name: BRANCH
value: __BRANCH__ # branch名
- name: CRON
value: "0 15 * * *" # badgesでのcronの設定 Etc/UTCなのでマニフェストの時間との違いに注意してください。
- name: GRACE_TIME
value: "10" # cronの実行時間を考慮したグレースタイム
- name: SLACK_FAILED
value: __SLACK_FAILED__ # slackの通知先
- name: SLACK_SUCCESS
value: __SLACK_SUCCESS__ # slackの通知先
http-kubernetes/config.ymlにて取得したいドメインや書き換え対象のsecret、ingress名などを設定してください。
# tencentの場合
info:
- namespace: application-1 # namespace名
secret_name: tencent-cert # qcloud_cert_idが格納されているsecret名
domains:
- test-getssl.example.com # 取得したいドメイン
- namespace: application-1
secret_name: tencent-cert-2
domains:
- test-getssl-2.example.com
- namespace: application-1
secret_name: tencent-cert-3
domains:
- test-getssl-3.example.com
---
# awsの場合
info:
- namespace: application-1 # namespace名
ingress_name: test-getssl-ingress # ingress名
domains:
- test-getssl.example.com # 取得したいドメイン
- namespace: application-1
ingress_name: test-getssl-ingress-2
domains:
- test-getssl-2.example.com
- namespace: application-1
ingress_name: test-getssl-ingress-3
domains:
- test-getssl-3.example.com
http-kubernetes/env.ymlにて各種クラウドサービス接続用のKeyやSecretを設定してください。
apiVersion: v1
kind: Secret
metadata:
name: env
type: Opaque
stringData:
AWS_ACCESS_KEY_ID: "__AWS_ACCESS_KEY_ID__" # AWSのアクセスキー
AWS_SECRET_ACCESS_KEY: "__AWS_SECRET_ACCESS_KEY__" # AWSのシークレットキー
AWS_DEFAULT_REGION: "__AWS_DEFAULT_REGION__" # AWSのリージョン
AWS_DEFAULT_OUTPUT: "json" # AWSの出力形式
---
# tencentcloudの場合
apiVersion: v1
kind: Secret
metadata:
name: env
type: Opaque
stringData:
TENCENTCLOUD_SECRET_ID: "__TENCENTCLOUD_SECRET_ID__"
TENCENTCLOUD_SECRET_KEY: "__TENCETCLOUD_SECRET_KEY__"
TENCENTCLOUD_REGION: "__TENCENTCLOUD_REGION__"
http-kubernetes/rbac.ymlにて各種権限を設定してください。
apiVersion: v1
kind: ServiceAccount
metadata:
name: getssl-job
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubectl-role-binding-getssl-job
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: admin # 権限を設定してください
subjects:
- name: getssl-job
kind: ServiceAccount
namespace: application-1 # namespace名
http-kubernetes/kustomization.ymlにてデプロイするnamespaceを設定してください。
# 一部抜粋
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: application-1 # namespace名
http-kubernetesディレクトリにてkubectl kustomizeコマンドを実行し内容に問題が無いかどうか確認してください。
$ kubectl kustomize .
問題が無ければkubectl applyコマンドを実行してください。
$ kubectl apply -k .
取得したいドメインを受け持つIngressより/.well-known/acme-challenge/以下のリクエストをPodに転送するように設定してください。
# awsの場合
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /.well-known/acme-challenge/*
pathType: ImplementationSpecific
backend:
service:
name: rhems-getssl-svc
port:
number: 80
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: application-svc
port:
number: 80
---
# tencentの場合
spec:
rules:
- host: test-getssl.example.com
http:
paths:
- path: /.well-known/acme-challenge
pathType: Prefix
backend:
service:
name: rhems-getssl-svc
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: application-svc
port:
number: 80
GoサーバーPodが正常に起動しているか確認してください。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
rhems-getssl-go-dd7f89db-pczsw 1/1 Running 0 54m
初回起動時は/.well-known/acme-challenge/dummyが外部アクセスより確認できるようになっております。
証明書を取得したいドメイン+/.well-known/acme-challenge/dummyで正しく取得できるかどうか確認を行ってください。
$ curl http://test-getssl.example.com/.well-known/acme-challenge/dummy
dummy
$ curl http://test-getssl-2.example.com/.well-known/acme-challenge/dummy
dummy
$ curl http://test-getssl-3.example.com/.well-known/acme-challenge/dummy
dummy
Cronjobを手動で実行しエラー無く完了するかどうか確認を行って下さい。
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
rhems-getssl 0 0 * * * False 0 8m34s
$ kubectl create job --from=cronjob/rhems-getssl rhems-getssl-manual-123456
job.batch/rhems-getssl-manual-123456 created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
rhems-getssl-go-6559dbf796-ssz4z 1/1 Running 0 5m50s
rhems-getssl-manual-123456-7hf6c 1/1 Running 0 18s
create-certの実行オプションは以下の通りです。
- -f: configファイルのパスを指定 デフォルトは"./config.yml"
- -c: 証明書を適用するクラウドサービスを指定 デフォルトは"aws" 入力値は"aws"、"tencent"
- -i: 初期処理を行うかどうかを指定 デフォルトは"false" 入力値は"true"、"false"
- --force: 強制的に証明書を更新するかどうかを指定 デフォルトは"false" 入力値は"true"、"false"
- --update-before-day: 証明書の更新期限を指定 デフォルトは"3" 入力値は"0"以上の整数
- --lets-encrypt-environment: Let's EncryptのCA環境を指定 デフォルトは"production" 入力値は"staging"、"production"
- --dns-validation: DNS-01 チャレンジを使用するかどうかを指定 デフォルトは"false" 入力値は"true"、"false"