connection_failure,TLS_error:_268435703:SSL_routines:OPENSSL_internal:WRONG_VERSION_NUMBER
TLS - Transport Layer Security (전송계층보안)
*출처: https://lion-king.tistory.com/entry/%EB%B3%B4%EC%95%88-MTLS-%EB%9E%80-Mutual-TLS-Authentication
SSL 및 TLS는 네트워크를 통해 작동하는 서버, 시스템 및 응용프로그램간에 인증 및 데이터 암호화를 제공하는 암호화 프로토콜
(예시. 웹 브라우저가 웹 서버에 대한 보안 연결을 생성하는 프로토콜)
SSL은 TLS의 이전 프로토콜이다. SSL은 현재 프로토콜 사용이 폐기되었고, TLS를 사용해야 한다.
* X.509 인증서
TLS의 핵심은 PKI (공개 키 인프라)와 특히 X.509 인증서
암호화에서 X.509는 공개 키 인증서의 형식을 정의하는 표준이고, HTTPS의 기반이되는 TLS / SSL 포함 많은 인터넷 프로토콜에서 사용
X.509 인증서는 공개 키와 ID (호스트 이름, 조직 또는 개인)를 포함하며 인증 기관에서 서명하거나 자체 서명함
CA(Certificate Authority 인증기관)에서 인증서에 서명하거나 다른 방법으로 유효성을 확인하면, 해당 인증서 보유자가 포함 된 공개 키를 사용하여 다른 당사자와의 보안 통신을 설정하거나 해당 개인 키로 디지털 서명 된 문서의 유효성을 검사 할 수 있다.
MTLS - Mutual TLS
*출처: https://www.jacobbaek.com/1040
Mutual TLS 에 대하여 알아보자.
우선 Mutual 이란 뜻을 보면 상호간, 양방향 이라는 뜻으로 풀이될수 있다. 즉, 단순 서버의 인증서만을 검증하는 일반적인 과정에서 optional 하게 사용할수 있는 Client Certificate 도 검증을 같이 하는 것이다.
좀더 자세히 알아보기 위해 먼저 일반적인 TLS handshake 과정을 알아보자.
위와 같이 Server Certificate 에 대한 검증을 Client에서 수행한다. 하지만 Server측에서의 Client에 대한 검증과정은 별도로 존재하지 않는다. 이에 대한 검증과정이 추가된것이 Mutual TLS라 보면 된다.
즉, 위 그림의 과정중 3~4 사이에 Client의 Certificate(Certificate Request Message를 통해)를 Server측에서 검증하는 과정이 추가된것이라 보면 된다.
트러블슈팅
나는 Kubeflow의 KFP UI접속 시 위 제목과 같은 에러가 발생했다. 따라서, TLS 모드 비활성화를 적용해주었다.
$k edit destinationrules.networking.istio.io -n kubeflow ml-pipeline-ui
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"DestinationRule","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"ml-pipeline","app.kubernetes.io/name":"kubeflow-pipelines","application-crd-id":"kubeflow-pipelines"},"name":"ml-pipeline-ui","namespace":"kubeflow"},"spec":{"host":"ml-pipeline-ui.kubeflow.svc.cluster.local","trafficPolicy":{"tls":{"mode":"ISTIO_MUTUAL"}}}}
creationTimestamp: "2023-01-26T09:16:59Z"
generation: 2
labels:
app.kubernetes.io/component: ml-pipeline
app.kubernetes.io/name: kubeflow-pipelines
application-crd-id: kubeflow-pipelines
name: ml-pipeline-ui
namespace: kubeflow
resourceVersion: "4282652"
uid: 1a5517b5-e7b1-4ee4-9303-196cfebdf96a
spec:
host: ml-pipeline-ui.kubeflow.svc.cluster.local
trafficPolicy:
tls:
mode: DISABLE # mode를 ISTIO_MUTUAL 가 아닌 DISABLE로 변경해준다.