แแก แกแขแแขแแ แแแแฌแแ แ แฃแแแ แแแกแแคแแ แแแแแแแ
แแ แกแขแแขแแแจแ แแ แแแขแงแแแ แ แแแแ แแแแแแกแขแแแแ แแ แแ แแแแแแแคแแแฃแ แแ แแ:
- แแแแแแแขแฃแ แ แแ แแก แฆแแ แแแแแก แแ แแแฅแขแ. แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แแแแแแแชแแแแแก แจแแกแแแแก แแ แ แฌแแ แขแแแก. แแฃแจแแแแก แแแแ แแ แแขแแแแแแแ, แแแ แจแแ แแก LDAP แแ OpenID, แ แแแแแแแช แแแแแแขแแ แแกแแแก.
- แแแแแแจแแก แแแ แแแญแ - แกแแแแ แแกแแแ แ แแแ แแแแแขแฃแแ แแ แแแ แแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแขแแแ แแ แแ แแแขแแ แแแแชแแ Keycloak-แแก แกแแจแฃแแแแแแ.
- แแแแแฃแแ - แแแแแแแชแแ, แ แแแแแแช แฅแแแแก kubectl-แแก แแแแคแแแฃแ แแชแแแก, แ แแแแแแแช แจแแแแซแแแแ แจแแฎแแแแแ แแ แแแฃแแแแจแแ แแแ Kubernetes API-แก OpenID-แแก แกแแจแฃแแแแแแ.
แ แแแแ แแฃแจแแแแก แแแแแ แแแแแ Kubernetes-แจแ.
แฉแแแ แจแแแแแซแแแ แแแแ แแแ แแแแฎแแแ แแแแแก / แฏแแฃแคแแก แฃแคแแแแแแ RBAC-แแก แแแแแงแแแแแแ, แแแแก แจแแกแแฎแแ แฃแแแ แจแแแฅแแแ แกแขแแขแแแแแก แแแแแ แ แแแ, แแแแแ แแแขแแแฃแ แแ แแ แแแกแแฃแแ แแ. แแ แแแแแแ แแก แแ แแก, แ แแ แแฅแแแ แจแแแแซแแแแ แแแแแแงแแแแ RBAC แแแแฎแแแ แแแแแก แฃแคแแแแแแแก แจแแกแแแฆแฃแแแ, แแแแ แแ Kubernetes-แแ แแ แแคแแ แ แแชแแก แแแแฎแแแ แแแแแแแก แจแแกแแฎแแ. แแแแแแแก, แ แแ แฉแแแ แแแญแแ แแแแ แแแแฎแแแ แแแแแก แแแฌแแแแแแก แแแฅแแแแแแ Kubernetes-แจแ. แแแแกแแแแก Kuberntes OpenID-แก แแแแแแแขแแแ แแ แแแแแแแ แก, แ แแแแแแช แแขแงแแแก, แ แแ แแกแแแ แแแแฎแแแ แแแแแ แแแแแแแแแ แแ แกแแแแแก แแ แแแแแ Kubernetes แแแกแชแแแก แแแก แฃแคแแแแแแก.
แกแแกแฌแแแแ
- แแแแญแแ แแแแแ Kubernetes แแแแกแขแแ แ แแ แแแแแแฃแแ
- Active Directory
- แแแแแแแแ:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - แกแแ แแแคแแแแขแ แแแแแแแแแกแแแแก แแ แฎแแแแแฌแแ แแแ แกแแ แขแแคแแแแขแ
แแ แแ แแแกแแฃแแ แแ แแแแแ, แแฃ แ แแแแ แจแแแฅแแแแ แฎแแแแแฌแแ แแแ แกแแ แขแแคแแแแขแ, แแฅแแแ แฃแแแ แจแแฅแแแแ 2 แกแแ แแแคแแแแขแ, แแก แแ แแก root (แกแแ แแแคแแแแขแแก แแแขแแ แแขแแขแ) แแ wildcard แแแแแแขแ *.example.org แแแแแแแกแแแแก.
แกแแ แแแคแแแแขแแแแก แแแฆแแแแก/แแแชแแแแก แจแแแแแ, แแแแแแขแ แฃแแแ แแแแแแขแแก Kubernetes-แก, แแแแกแแแแแก แฉแแแ แแฅแแแแ แกแแแแฃแแแแแแแก:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
แจแแแแแแ, แฉแแแ แแแแแแแงแแแแแ แแแก แฉแแแแ Ingress แแแแขแ แแแแ แแกแแแแก.
Keycloak แแแกแขแแแแชแแ
แแ แแแแแแฌแงแแแขแ, แ แแ แฃแแแ แขแแแแกแ แแแแ แแแแกแแแแแก แแแ แแแแแฌแงแแแขแแแแแแแแก แแแแแงแแแแแ, แแแ แซแแ, แกแแญแแก แแแแแ แแแแแ.
แแแแแแกแขแแแแ แแ แกแแชแแแ แแ แแแแแแฎแแแ แแแ:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
แจแแฅแแแแแ keycloak.yml แคแแแแ แจแแแแแแ แจแแแแแ แกแแ:
keycloak.yml
keycloak:
# ะะผั ะฐะดะผะธะฝะธัััะฐัะพัะฐ
username: "test_admin"
# ะะฐัะพะปั ะฐะดะผะธะฝะธัััะฐัะพั
password: "admin"
# ะญัะธ ัะปะฐะณะธ ะฝัะถะฝั ััะพ ะฑั ะฟะพะทะฒะพะปะธัั ะทะฐะณััะถะฐัั ะฒ Keycloak ัะบัะธะฟัั ะฟััะผะพ ัะตัะตะท web ะผะพัะดั. ะญัะพ ะฝะฐะผ
ะฟะพะฝะฐะดะพะฑะธัััั ััะพ ะฑั ะฟะพัะธะฝะธัั ะพะดะธะฝ ะฑะฐะณ, ะพ ะบะพัะพัะพะผ ะฝะธะถะต.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# ะะบะปััะฐะตะผ ingress, ัะบะฐะทัะฒะฐะตะผ ะธะผั ั
ะพััะฐ ะธ ัะตััะธัะธะบะฐั ะบะพัะพััะน ะผั ะฟัะตะดะฒะฐัะธัะตะปัะฝะพ ัะพั
ัะฐะฝะธะปะธ ะฒ secrets
ingress:
enabled: true
path: /
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/affinity: cookie
hosts:
- keycloak.example.org
tls:
- hosts:
- keycloak.example.org
secretName: tls-keycloak
# Keycloak ะดะปั ัะฒะพะตะน ัะฐะฑะพัั ััะตะฑัะตั ะฑะฐะทั ะดะฐะฝะฝัั
, ะฒ ัะตััะพะฒัั
ัะตะปัั
ั ัะฐะทะฒะพัะฐัะธะฒะฐั Postgresql ะฟััะผะพ ะฒ Kuberntes, ะฒ ะฟัะพะดะฐะบัะตะฝะต ัะฐะบ ะปัััะต ะฝะต ะดะตะปะฐัั!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: true
แคแแแแ แแชแแแก แแแงแแแแแ
แจแแแแแแ, แแแแแแแ แแแ แแแขแแ แคแแแกแแ
แแแแญแแ แแ แแแ แชแฎแแแ แแฃแแฎแแจแ แแแแแแขแแ แกแคแแ แ
แซแแ แแแแแ
แฆแแ แแแฃแแแแ
แกแแฎแแแ
แแฃแแแ แแแขแแแ
แฉแแแแแแแก แกแแฎแแแ
แแฃแแแ แแแขแแแ
แแแแฎแแแ แแแแแก แแแคแแกแขแแก แแแแแกแขแฃแ แแแแก แแแแแ แแแ:
แแแแแแขแแก แคแแ แแแแแ โ> แแแคแแกแขแ โ> แ แฃแฅแแแ โ> แแแแแกแขแฃแ แแแฃแแ แแแคแแกแขแ (แฌแแจแแ)
แฉแแแ แจแแแฅแแแแแ แคแแแแ แแชแแ ActiveDirectory-แแแ แแแแฎแแแ แแแแแแแก แแแแแ แขแแกแแแแก, แฅแแแแแ แแแแขแแแแ แกแแ แแแจแแขแแแก, แแแแแ แฃแคแ แ แแแกแแแแแ แแฅแแแแ.
แแแแฎแแแ แแแแแก แคแแแแ แแชแแ โ> แแ แแแแแแแ แแก แแแแแขแแแโฆ โ> ldap
แคแแแแ แแชแแแก แแแงแแแแแ
แแฃ แงแแแแแคแแ แ แแแ แแแแแ, แแแจแแ แฆแแแแแแ แแแญแแ แแก แจแแแแแ แงแแแแ แแแแฎแแแ แแแแแก แกแแแฅแ แแแแแแชแแ แแฅแแแ แแแฎแแแ แจแแขแงแแแแแแแแก แแแแฎแแแ แแแแแแแก แฌแแ แแแขแแแฃแแ แแแแแ แขแแก แจแแกแแฎแแ.
แจแแแแแ แฉแแแ แฃแแแ แแแแแคแแ แแแ แฉแแแแ แฏแแฃแคแแแ
แแแแฎแแแ แแแแแก แคแแแแ แแชแแ --> ldap_localhost --> Mappers --> แจแแฅแแแ
แ แฃแฅแแก แจแแฅแแแ
แแแแแแขแแก แแแงแแแแแ
แแฃแชแแแแแแแแ แแแแแแขแแก แจแแฅแแแ, Keycloak-แแก แแแแแกแแแ แแกแแ, แแก แแ แแก แแแกแแแ แแแขแแ แแแแแฃแแ แแแแแแแชแแ. แแ แฎแแแก แแฃแกแแแ แกแแ แแแจแแขแจแ แแ แกแแแฃแ แแแแจแแแแแแแแ แแฃแแฅแขแแแก แฌแแแแแ.
แแแแแแขแแแ โ> แจแแฅแแแ
แแแแแแขแแก แแแงแแแแแ
แแแแแ แจแแแฅแแแแ แกแแฃแแ แฏแแฃแคแแแแกแแแแก:
แแแแแแขแแก แกแคแแ แแแแ โ> แจแแฅแแแ
แจแแฅแแแแแ แคแแ แแแแแ
แแ แจแแฅแแแแแ แ แฃแฅแแก แจแแแแแแ แแแแแแแก:
Client Scopes โ> แฏแแฃแคแแแ โ> Mappers โ> แจแแฅแแแ
แ แฃแแแแแก แแแแฆแแแ
แแแแแแขแแ แฉแแแแ แฏแแฃแคแแแแก แ แฃแแแแแก แแแแฃแแแกแฎแแแแ แแแแแแขแแก แแ แแแแ:
Clients โ> kubernetes โ> Client Scopes โ> Default Client Scopes
แแแ แฉแแแ แฏแแฃแคแแแ ะฒ แฎแแแแแกแแฌแแแแแ แแแแแแขแแก แคแแ แแแแแแแแแญแแ แแ แแแแแแขแแ แแ แฉแแฃแแ
แฉแแแ แแแฆแแแ แกแแแแฃแแแแแแแก (แแ แแฌแแ แ แแแก แแแแแจแ), แ แแแแแกแแช แแแแแแแงแแแแแ แแแขแแ แแแแชแแแกแแแแก Keycloak-แจแ:
แแแแแแขแแแ โ> kubernetes โ> แกแแ แแแคแแแแขแแแ โ> แกแแแแฃแแแ
แแก แแแแกแ แฃแแแแก แแแงแแแแแแก, แแแแ แแ แแ แแฅแแแแ แจแแชแแแแ, แ แแแแกแแช แฌแแ แแแขแแแฃแแ แแแขแแ แแแแชแแแก แจแแแแแ แแแแแฆแ แจแแชแแแแ 403.
แจแแกแฌแแ แแแ:
Client Scopes โ> แ แแแแแ โ> Mappers โ> แจแแฅแแแ
แจแแแฅแแแแแ
แกแแ แแแขแแก แแแแ
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes-แแก แแแแคแแแฃแ แแชแแ
แฉแแแ แฃแแแ แแแแแกแแแฆแแ แแ แกแแ แแแแแแ แแแแก แฉแแแแ root แกแแ แขแแคแแแแขแ แกแแแขแแแแ แแ แกแแ แแแแแแ แแแแก OIDC แแ แแแแแแแ แ.
แแแแกแแแแแก แจแแชแแแแแ แคแแแแ /etc/kubernetes/manifests/kube-apiserver.yaml
kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
แแแแแแฎแแแ kubeadm แแแแคแแแฃแ แแชแแ แแแแกแขแแ แจแ:
kubeadmconfig
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
แแแขแแ แแแแชแแแก แแ แแฅแกแแก แแแงแแแแแ
แแฅแแแ แจแแแแซแแแแ แแแแแแงแแแแ keycloak gatekeeper แแฅแแแแ แแแ แแแแแแแชแแแก แแแกแแชแแแแ. แแแ แแ แแแแกแ, แ แแ แแก แกแแแแ แแกแแแ แ แแ แแฅแกแ แแแแฎแแแ แแแแแก แแแขแแ แแแแชแแแก แแแฃแฌแแแก แแแแ แแแก แฉแแแแแแแแแ, แแก แแกแแแ แแแแแกแชแแแก แแฅแแแแก แจแแกแแฎแแ แแแคแแ แแแชแแแก แแแแ แแแแแแแชแแแก แกแแแแฃแ แแแจแ. แแแ แแแแ, แแฃ แแฅแแแแ แแแแแแแชแแ แแฎแแ แก แฃแญแแ แก OpenID-แก, แแแจแแ แแแแฎแแแ แแแแแ แแแฃแงแแแแแแแแ แแ แแก แแแขแแ แแแแแฃแแ. แแแแแแฎแแแแ Kubernetes Dashboard-แแก แแแแแแแแ
Kubernetes Dashboard-แแก แแแกแขแแแแชแแ
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
values_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
แฌแแแแแแก แฃแคแแแแแแแก แแแงแแแแแ:
แแแแแ แจแแแฅแแแแ ClusterRoleBinding, แ แแแแแแช แแแกแชแแแก แแแแกแขแแ แก แแแแแแแกแขแ แแขแแ แแก แฃแคแแแแแแก (แกแขแแแแแ แขแฃแแ ClusterRole แแแแกแขแแ -แแแแแแแกแขแ แแขแแ แ) แแแแฎแแแ แแแแแแแกแแแแก DataOPS แฏแแฃแคแจแ.
kubectl apply -f rbac.yaml
rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dataops_group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: DataOPS
แแแแแแกแขแแแแ แแ keycloak gatekeeper:
helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml
values_proxy.yaml
# ะะบะปััะฐะตะผ ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
# ะะพะฒะพัะธะผ ะณะดะต ะผั ะฑัะดะตะผ ะฐะฒัะพัะธะทะพะฒัะฒะฐัััั ั OIDC ะฟัะพะฒะฐะนะดะตัะฐ
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# ะะผั ะบะปะธะตะฝัะฐ ะบะพัะพัะพะณะพ ะผั ัะพะทะดะฐะปะธ ะฒ Keycloak
ClientID: "kubernetes"
# Secret ะบะพัะพััะน ั ะฟัะพัะธะป ะทะฐะฟะธัะฐัั
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# ะัะดะฐ ะฟะตัะตะฝะฐะฟัะฐะฒะธัั ะฒ ัะปััะฐะต ััะฟะตัะฝะพะน ะฐะฒัะพัะธะทะฐัะธะธ. ะคะพัะผะฐั <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# ะัะพะฟััะบะฐะตะผ ะฟัะพะฒะตัะบั ัะตััะธัะธะบะฐัะฐ, ะตัะปะธ ั ะฝะฐั ัะฐะผะพะฟะพะดะฟะธัะฐะฝะฝัะน
skipOpenidProviderTlsVerify: true
# ะะฐัััะพะนะบะฐ ะฟัะฐะฒ ะดะพัััะฟะฐ, ะฟััะบะฐะตะผ ะฝะฐ ะฒัะต path ะตัะปะธ ะผั ะฒ ะณััะฟะฟะต DataOPS
rules:
- "uri=/*|groups=DataOPS"
แแแแก แจแแแแแ, แ แแชแ แชแแแแแ แฌแแกแแแแก
แแแแแแก แแแแขแแแ
แแแฎแแ แฎแแแฃแแแแแกแแแแก แจแแแแซแแแแ แแแแแแขแแ แแแแแ, แ แแแแแแช แฌแแ แแแฅแแแแก แแแแคแแแฃแ แแชแแแก แคแแแแก kubectl-แแกแแแแก, แ แแแแแก แแแฎแแแ แแแแ แฉแแแ แจแแแแแ Kubernetes-แจแ แฉแแแแ แแแแฎแแแ แแแแแก แฅแแแจ.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# ะัะพะธะทะฒะพะปัะฝะพะต ะธะผั ะบะปะฐััะตัะฐ
clusterName: "my-k8s"
# ะะดะต ั ะฝะฐั OIDC ะฟัะพะฒะฐะนะดะตั
authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
# ะขะตะพัะธัะธัะตัะบะธ ััะดะฐ ะผะพะถะฝะพ ะดะพะฑะฐะฒะธัั groups ะบะพัะพััะต ะผั ะทะฐะผะฐะฟะธะปะธ
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# ะะผั ะบะปะธะตะฝัะฐ
clientID: "kubernetes"
# ะกะตะบัะตั
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# ะัะปะธ ะพััะฐะฒะธัั ะดะตัะพะปัะฝะพะต ะทะฝะฐัะฝะธะต, ัะพ ะทะฐ ะธะผั ะฟะพะปัะทะพะฒะฐัะตะปั ะฑัะดะตั ะฑัะฐััั <b>Frist name</b> <b>Second name</b>, ะฐ ะฟัะธ "sub" ะตะณะพ ะปะพะณะธะฝ
usernameClaim: "sub"
# ะะพะผะตะฝะฝะพะต ะธะผั ะธะปะธ IP ะฐะดัะตัั API ัะตัะฒะตัะฐ
apiServerURL: "https://192.168.99.111:8443"
# ะะบะปััะฐะตะผ Ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
path: /
hosts:
- gangway.example.org
tls:
- secretName: tls-keycloak
hosts:
- gangway.example.org
# ะัะปะธ ะธัะฟะพะปัะทัะตะผ ัะฐะผะพะฟะพะดะฟะธัะฐะฝะฝัะน ัะตััะธัะธะบะฐั, ัะพ ะตะณะพ(ะพัะบััััะน ะบะพัะฝะตะฒะพะน ัะตััะธัะธะบะฐั) ะฝะฐะดะพ ัะบะฐะทะฐัั.
trustedCACert: |-
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
-----END CERTIFICATE-----
แแกแ แแแแแแงแฃแ แแแ. แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแงแแแแแแแแ แฉแแแแขแแแ แแแ แแแแคแแแฃแ แแชแแแก แคแแแแ แแ แจแแฅแแแแ แแแ แแ แซแแแแแแแแก แแแแ แแแแก แแแแแงแแแแแแ:
แฌแงแแ แ: www.habr.com