istio-ingressgateway ssl https 証明書 中間証明書 導入するよ

# はじめに
こんにちは現在サイバーエージェントの新規事業立ち上げをしている後藤です。
プロダクトで現在istio-ingressgatewayを使用しており負荷試験をかけるさいにSSLの設定がうまくいかなく原因が中間証明書をちゃんと紐付けていなかったことでした。そしてかなりそれに関する記事が少なかったのでまとめます。

# 最初に証明書を整理する

基本的に独自でワイルドカード証明書などをしゅとくすると以下の三つの証明書がDLできます。

- サーバー鍵 wildcard.hoge.com.crt
- 秘密鍵 wildcard.hoge.com.key
- 中間証明書 CT_HOGE_20001010.crt

[中間証明書について詳しく知りたい場合](https://www.gleas.jp/news/column/certificate-chain)

## サーバー鍵に中間証明書を紐づける

鍵のうしろにくっつけてファイル拡張子をpemにします。
ここでは`server.pem`という名前にしました。

`A` 文字列の部分がサーバー拡張子
`B` 文字列の部分が中間証明書

```server.pem
-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBB
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB

BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-----END CERTIFICATE-----
```

# kubenetesのsecretを登録する
```sh
# namaspace は istio-system 
# istio-ingressgateway-certs　この名前で作ると自動的に反映先に作られます！
# 先ほどつくったファイルを --certの値にする　--keyは秘密鍵を指定する
kubectl create -n istio-system secret tls istio-ingressgateway-certs --key wildcard.hoge.com.key --cert server.pem
```

# gateway.ymlを作る
```yml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: hoge-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/server.pem #先ほどのsecretが自動で入る
      privateKey: /etc/istio/ingressgateway-certs/tls.key # 先ほどつくったsecretが自動で入る
    hosts:
    - hoge.com

```
```sh
kubectl apply -f gateway.yml #applyする
```

# istio-ingressgateway podを再起動する
```sh
kubectl get pod -n istio-system
```
```
NAME                                      READY   STATUS    RESTARTS   AGE
istio-citadel-8b8b4db4-vtnz7              1/1     Running   5          8d
istio-galley-7f87d7664f-89fwv             1/1     Running   0          8d
istio-ingressgateway-656b4545cf-7qs28     1/1     Running   0          45m #こいつを再帰動する
istio-pilot-747948498f-nvncr              2/2     Running   0          8d
istio-policy-7ffbb578bc-fnxv4             2/2     Running   0          8d
istio-sidecar-injector-5967cf6d7f-fg7vs   1/1     Running   0          8d
istio-telemetry-55cb8b8fc5-sxzjt          2/2     Running   5          8d
promsd-76f8d4cff8-tj87k                   2/2     Running   60         8d
```
```sh
# 単純にdeleteしてもdeploymentがるのでオートヒーリングさせて再起動する
kubectl delete pod -n istio-system istio-ingressgateway-656b4545cf-7qs28
```

# 確認方法
以下のようなSSLチェックできるサイトにて全てにチェックがいればOK！
https://www.digicert.com/

# 参考記事
istio公式ドキュメント https://istio.io/docs/tasks/traffic-management/ingress/secure-ingress-mount/
ingressに中間証明書 https://qiita.com/wataru420/items/79e66713168d6db1c798