SSL/TLS証明書取得-DigitalOceanのkubernetes環境にwordpressを構築する05

2024年2月11日

SSL/TLS証明書取得

cert-managerのインストール

helm repo add jetstack https://charts.jetstack.io

helm repo update

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.13.3 \
  --set installCRDs=true
helm ls -n cert-manager
cd ~/work/doks-wp/dev/k8s
mkdir ignore && cd ignore

letsencrypt設定

本番用の証明書は[staging]の部分を[prod]に変更します。
name:及びserver:はテスト用と本番用で分けること。

テスト用

ocarina@ab350-pro4:~/work/doks-wp/dev/k8s$ cat ignore/letsencrypt.yaml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-staging
  namespace: doks-wp
spec:
  acme:
    # The ACME server URL
    # staging
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    # prod
    #server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 自分のメールアドレス
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-staging-private-key
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx

本番用

vi ignore/letsencrypt.yaml 
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-prod
  namespace: doks-wp
spec:
  acme:
    # The ACME server URL
    # staging
    #server: https://acme-staging-v02.api.letsencrypt.org/directory
    # prod
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration
    email: 自分のメールアドレス
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-prod-private-key
    # Enable the HTTP-01 challenge provider
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx
kubectl apply -f letsencrypt.yaml

clusterissuer.cert-manager.io/letsencrypt-staging created

ingressのmanifestをSSL用にアップデート

diff -c Ingress-doks-wp-web.yaml{.bk,}
*** Ingress-doks-wp-web.yaml.bk 2023-12-30 16:46:28.691557641 +0900
--- Ingress-doks-wp-web.yaml    2024-01-05 23:04:21.092681076 +0900
***************
*** 1,22 ****
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
!   name: doks-wp-web-ingress
    namespace: doks-wp
    labels:
      app: doks-wp
    annotations:
!     nginx.ingress.kubernetes.io/rewrite-target: /$1
  spec:
    ingressClassName: nginx
    rules:
!     - host: 
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                 name: doks-wp-dev-web
                  port:
                    number: 80
--- 1,29 ----
  apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
!   name: doks-wp-dev-web-ingress
    namespace: doks-wp
    labels:
      app: doks-wp
    annotations:
! #    nginx.ingress.kubernetes.io/rewrite-target: /$1 # これが有効だとwordpressでは動きません
!     nginx.ingress.kubernetes.io/proxy-body-size: "0" # client_max_body_size. "413 Request Entity Too Large"
!     cert-manager.io/issuer: "letsencrypt-staging"
  spec:
    ingressClassName: nginx
+   tls:
+   - hosts:
+     - dev-memo.frzl.net
+     secretName : quickstart-dev-memo.frzl.net-tls
+   ingressClassName: nginx
    rules:
!     - host: dev-memo.frzl.net
        http:
          paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                 name: doks-wp-dev-web
                  port:
                    number: 80

これnginx.ingress.kubernetes.io/rewrite-target: /$1があると画像やcss,wp-admin等にアクセスできませんでしたので外しています。

kubectl get certificate -n doks-wp

NAME READY SECRET AGE
quickstart-dev-memo.frzl.net-tls True quickstart-dev-memo.frzl.net-tls 6d21h

証明書発行ステータスの確認

発行されない...

ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get challenges -n doks-wp -o wide
NAME                                                   STATE     DOMAIN          REASON                                                                                                                                                                                                                                                                                      AGE
quickstart-memo.frzl.net-tls-1-2816179123-3296559884   pending   memo.frzl.net   Waiting for HTTP-01 challenge propagation: failed to perform self check GET request 'http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY': Get "http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY": EOF   30m
root@instance-1:~# curl http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY
3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY.05MCbP8eciO5_TvJ5EnxQogdKYj_J-NFEvEJC7u_0K0root@instance-1:~# 

問題ないようですけど.....

https://cert-manager.io/v1.9-docs/faq/acme/

HTTP01 と DNS01 は両方とも、cert-manager が ACME プロバイダーにチャレンジを提示する前に、まず「セルフチェック」を通過します。これは、DNS またはロードバランサーの伝播による失敗したチャレンジによって ACME プロバイダーに過負荷がかからないようにするために行われます。このステータスは、説明のステータス ブロックで確認できます。

確かに外部からはget出来たけどpod自身からはerrorになっている

ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl exec -it pods/doks-wp-prod-web-5565c8949-9jz92 -n doks-wp -- /bin/bash
root@doks-wp-prod-web-5565c8949-9jz92:/var/www/html# curl http://memo.frzl.net/.well-known/acme-challenge/3rQ1xW_ITDsWI9fT90N201mQ0BqbmQjYWz3sSj6MOZY
curl: (52) Empty reply from server
ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get secret -n doks-wp
NAME                                 TYPE                             DATA   AGE
dev-msmtprc                          Opaque                           1      4d5h
letsencrypt-prod                     Opaque                           1      83m
letsencrypt-staging                  Opaque                           1      6d22h
ocarina                              kubernetes.io/dockerconfigjson   1      7d5h
prod-msmtprc                         Opaque                           1      81m
quickstart-dev-memo.frzl.net-tls     kubernetes.io/tls                2      6d21h
quickstart-memo.frzl.net-tls-t2w7f   Opaque                           1      18m
ocarina@ab350-pro4:~/work/doks-wp/prod/k8s$ kubectl get certificate -n doks-wp
NAME                               READY   SECRET                             AGE
quickstart-dev-memo.frzl.net-tls   True    quickstart-dev-memo.frzl.net-tls   6d21h
quickstart-memo.frzl.net-tls       False   quickstart-memo.frzl.net-tls       18m
kubectl describe certificaterequest quickstart-memo.frzl.net-tls -n doks-wp | less

LBとingress-nginxのconfigmapでリアルIPアドレス取得設定を行ったため、内部から内部への通信が出来なくなったことによるもの。

hairpin-proxyのインストールで改善しました。

Posted by ocarina