はじめに
OKEのOCI Native Ingress ControllerでIngressを作成した時に、TLS周りの仕様?でハマったので、今後ハマる人が出ないよう私の事例を説明します。
注意点
この記事は、2025年2月に試したときの話なので、現在は改善されている可能性があります。(その後のアップデート内容を見る限りだと、おそらくまだ問題は起きそうです)
OCI Native Ingress ControllerのTLS周りの問題点
ドキュメントの通りに設定すると、サイト表示が以下のようなTLS関連のエラー ERR_SSL_VERSION_OR_CIPHER_MISMATCH
になることがあります。
※証明書の発行の仕方にもよるかもしれませんが
OCI Native Ingress Controller では、TLSバージョンや暗号スイートを指定できない
2025年2月時点だとOCI Native Ingress Controllerでは、TLSバージョンや暗号スイートを指定できません。
以下の公式ドキュメントに設定方法は載っていません。
- oci-native-ingress-controller/GettingStarted.md at main · oracle/oci-native-ingress-controller
- OCI Native Ingress Controllerの構成
なお、TLSバージョンの指定をしたい旨は、私が公式にissueを挙げています。(間違えて会社アカウントでissueを立ててしまった)
解決方法
(推奨)リスナープロトコルをHTTP2にする
Ingressのmanifestで oci-native-ingress.oraclecloud.com/protocol
を HTTP2
に指定します。
説明も含めて、Ingressの参考のmanifestを載せます。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: native-ic-ingress
labels:
app.kubernetes.io/managed-by: Helm
annotations:
oci-native-ingress.oraclecloud.com/healthcheck-protocol: "HTTP"
oci-native-ingress.oraclecloud.com/healthcheck-port: "80"
oci-native-ingress.oraclecloud.com/healthcheck-path: "/api/v2/healthcheck"
# 2025年2月現在では、リスナーのTLSバージョンと暗号スイートが指定できず、TLSバージョンは1.2のみになる
# protocolは無指定だとTCPになり、その場合は暗号スイートが oci-default-ssl-cipher-suite-v1 になる
# しかし、TLS1.2のみだと、 oci-default-ssl-cipher-suite-v1 はブラウザでエラーになる
# HTTP2を指定すると、暗号スイートが oci-default-http2-ssl-cipher-suite-v1 になり、TLS1.2のみでもエラーにならない
oci-native-ingress.oraclecloud.com/protocol: "HTTP2"
oci-native-ingress.oraclecloud.com/backend-tls-enabled: "false" # ロードバランサーでTLSを終端する
spec:
ingressClassName: native-ic-ingress-class
tls:
- hosts:
- {{ .Values.ingress.Ingress.host | quote }}
secretName: cl-tls
rules:
- host: {{ .Values.ingress.Ingress.host | quote }}
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: web-app-service
port:
number: 443
解決方法に気づいたきっかけ
TLSバージョンを指定できないのは、先ほど紹介したissueでわかったので、暗号スイートを指定する機能がないかを公式リポジトリで探していました。そのとき、以下のコードを見つけました。
ProtocolHTTP2DefaultCipherSuite = "oci-default-http2-ssl-cipher-suite-v1"
検索結果のURL
https://github.com/search?q=repo%3Aoracle%2Foci-native-ingress-controller%20suite&type=code
HTTP2
にすれば暗号スイートが oci-default-http2-ssl-cipher-suite-v1
になりそうだと思い、試したら oci-default-http2-ssl-cipher-suite-v1
になり、TLS1.2のみでもブラウザでエラーにならないことがわかりました。
(非推奨)手動でリスナーのTLSバージョンに1.3を追加する
OCIのコンソールやCLIから、Ingressで作成されたロードバランサーのリスナーのTLSバージョンに1.3を追加することはできます。
また、この設定は、証明書をOCIの証明書サービス方式←→k8sのsecretの入れ替えをしない限りは、applyしても維持される模様です。
ただし、Ingressを作り直したり、リスナー周りの設定を変えたらTLSバージョンがデフォルトの1.2だけになる可能性があるので、私はおすすめしません!
おわりに
おわり