@@ -4,247 +4,6 @@ content_type: concept
44weight : 20
55---
66
7-
87<!-- overview -->
98
10- 클라이언트 인증서로 인증을 사용하는 경우 ` easyrsa ` , ` openssl ` 또는 ` cfssl `
11- 을 통해 인증서를 수동으로 생성할 수 있다.
12-
13-
14-
15-
16- <!-- body -->
17-
18- ### easyrsa
19-
20- ** easyrsa** 는 클러스터 인증서를 수동으로 생성할 수 있다.
21-
22- 1 . easyrsa3의 패치 버전을 다운로드하여 압축을 풀고, 초기화한다.
23-
24- curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
25- tar xzf easy-rsa.tar.gz
26- cd easy-rsa-master/easyrsa3
27- ./easyrsa init-pki
28- 1 . 새로운 인증 기관(CA)을 생성한다. ` --batch ` 는 자동 모드를 설정한다.
29- ` --req-cn ` 는 CA의 새 루트 인증서에 대한 일반 이름(Common Name (CN))을 지정한다.
30-
31- ./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass
32- 1 . 서버 인증서와 키를 생성한다.
33- ` --subject-alt-name ` 인수는 API 서버에 접근이 가능한 IP와 DNS
34- 이름을 설정한다. ` MASTER_CLUSTER_IP ` 는 일반적으로 API 서버와
35- 컨트롤러 관리자 컴포넌트에 대해 ` --service-cluster-ip-range ` 인수로
36- 지정된 서비스 CIDR의 첫 번째 IP이다. ` --days ` 인수는 인증서가 만료되는
37- 일 수를 설정하는데 사용된다.
38- 또한, 아래 샘플은 기본 DNS 이름으로 ` cluster.local ` 을
39- 사용한다고 가정한다.
40-
41- ./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
42- "IP:${MASTER_CLUSTER_IP},"\
43- "DNS:kubernetes,"\
44- "DNS:kubernetes.default,"\
45- "DNS:kubernetes.default.svc,"\
46- "DNS:kubernetes.default.svc.cluster,"\
47- "DNS:kubernetes.default.svc.cluster.local" \
48- --days=10000 \
49- build-server-full server nopass
50- 1 . ` pki/ca.crt ` , ` pki/issued/server.crt ` 그리고 ` pki/private/server.key ` 를 디렉터리에 복사한다.
51- 1 . API 서버 시작 파라미터에 다음 파라미터를 채우고 추가한다.
52-
53- --client-ca-file=/yourdirectory/ca.crt
54- --tls-cert-file=/yourdirectory/server.crt
55- --tls-private-key-file=/yourdirectory/server.key
56-
57- ### openssl
58-
59- ** openssl** 은 클러스터 인증서를 수동으로 생성할 수 있다.
60-
61- 1 . ca.key를 2048bit로 생성한다.
62-
63- openssl genrsa -out ca.key 2048
64- 1 . ca.key에 따라 ca.crt를 생성한다(인증서 유효 기간을 사용하려면 -days를 사용한다).
65-
66- openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
67- 1 . server.key를 2048bit로 생성한다.
68-
69- openssl genrsa -out server.key 2048
70- 1 . 인증서 서명 요청(Certificate Signing Request (CSR))을 생성하기 위한 설정 파일을 생성한다.
71- 파일에 저장하기 전에 꺾쇠 괄호(예: ` <MASTER_IP> ` )로
72- 표시된 값을 실제 값으로 대체한다(예: ` csr.conf ` ).
73- ` MASTER_CLUSTER_IP ` 의 값은 이전 하위 섹션에서
74- 설명한 대로 API 서버의 서비스 클러스터 IP이다.
75- 또한, 아래 샘플에서는 ` cluster.local ` 을 기본 DNS 도메인
76- 이름으로 사용하고 있다고 가정한다.
77-
78- [ req ]
79- default_bits = 2048
80- prompt = no
81- default_md = sha256
82- req_extensions = req_ext
83- distinguished_name = dn
84-
85- [ dn ]
86- C = <국가(country)>
87- ST = <도(state)>
88- L = <시(city)>
89- O = <조직(organization)>
90- OU = <조직 단위(organization unit)>
91- CN = <MASTER_IP>
92-
93- [ req_ext ]
94- subjectAltName = @alt_names
95-
96- [ alt_names ]
97- DNS.1 = kubernetes
98- DNS.2 = kubernetes.default
99- DNS.3 = kubernetes.default.svc
100- DNS.4 = kubernetes.default.svc.cluster
101- DNS.5 = kubernetes.default.svc.cluster.local
102- IP.1 = <MASTER_IP>
103- IP.2 = <MASTER_CLUSTER_IP>
104-
105- [ v3_ext ]
106- authorityKeyIdentifier=keyid,issuer:always
107- basicConstraints=CA:FALSE
108- keyUsage=keyEncipherment,dataEncipherment
109- extendedKeyUsage=serverAuth,clientAuth
110- subjectAltName=@alt_names
111- 1 . 설정 파일을 기반으로 인증서 서명 요청을 생성한다.
112-
113- openssl req -new -key server.key -out server.csr -config csr.conf
114- 1 . ca.key, ca.crt 그리고 server.csr을 사용해서 서버 인증서를 생성한다.
115-
116- openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
117- -CAcreateserial -out server.crt -days 10000 \
118- -extensions v3_ext -extfile csr.conf
119- 1 . 인증서를 본다.
120-
121- openssl x509 -noout -text -in ./server.crt
122-
123- 마지막으로, API 서버 시작 파라미터에 동일한 파라미터를 추가한다.
124-
125- ### cfssl
126-
127- ** cfssl** 은 인증서 생성을 위한 또 다른 도구이다.
128-
129- 1 . 아래에 표시된 대로 커맨드 라인 도구를 다운로드하여 압축을 풀고 준비한다.
130- 사용 중인 하드웨어 아키텍처 및 cfssl 버전에 따라 샘플
131- 명령을 조정해야 할 수도 있다.
132-
133- curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -o cfssl
134- chmod +x cfssl
135- curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -o cfssljson
136- chmod +x cfssljson
137- curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -o cfssl-certinfo
138- chmod +x cfssl-certinfo
139- 1 . 아티팩트(artifact)를 보유할 디렉터리를 생성하고 cfssl을 초기화한다.
140-
141- mkdir cert
142- cd cert
143- ../cfssl print-defaults config > config.json
144- ../cfssl print-defaults csr > csr.json
145- 1 . CA 파일을 생성하기 위한 JSON 설정 파일을 ` ca-config.json ` 예시와 같이 생성한다.
146-
147- {
148- "signing": {
149- "default": {
150- "expiry": "8760h"
151- },
152- "profiles": {
153- "kubernetes": {
154- "usages": [
155- "signing",
156- "key encipherment",
157- "server auth",
158- "client auth"
159- ],
160- "expiry": "8760h"
161- }
162- }
163- }
164- }
165- 1 . CA 인증서 서명 요청(CSR)을 위한 JSON 설정 파일을
166- ` ca-csr.json ` 예시와 같이 생성한다. 꺾쇠 괄호로 표시된
167- 값을 사용하려는 실제 값으로 변경한다.
168-
169- {
170- "CN": "kubernetes",
171- "key": {
172- "algo": "rsa",
173- "size": 2048
174- },
175- "names":[{
176- "C": "<국가(country)>",
177- "ST": "<도(state)>",
178- "L": "<시(city)>",
179- "O": "<조직(organization)>",
180- "OU": "<조직 단위(organization unit)>"
181- }]
182- }
183- 1 . CA 키(` ca-key.pem ` )와 인증서(` ca.pem ` )을 생성한다.
184-
185- ../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca
186- 1 . API 서버의 키와 인증서를 생성하기 위한 JSON 구성파일을
187- ` server-csr.json ` 예시와 같이 생성한다. 꺾쇠 괄호 안의 값을
188- 사용하려는 실제 값으로 변경한다. ` MASTER_CLUSTER_IP ` 는
189- 이전 하위 섹션에서 설명한 API 서버의 클러스터 IP이다.
190- 아래 샘플은 기본 DNS 도메인 이름으로 ` cluster.local ` 을
191- 사용한다고 가정한다.
192-
193- {
194- "CN": "kubernetes",
195- "hosts": [
196- "127.0.0.1",
197- "<MASTER_IP>",
198- "<MASTER_CLUSTER_IP>",
199- "kubernetes",
200- "kubernetes.default",
201- "kubernetes.default.svc",
202- "kubernetes.default.svc.cluster",
203- "kubernetes.default.svc.cluster.local"
204- ],
205- "key": {
206- "algo": "rsa",
207- "size": 2048
208- },
209- "names": [{
210- "C": "<국가(country)>",
211- "ST": "<도(state)>",
212- "L": "<시(city)>",
213- "O": "<조직(organization)>",
214- "OU": "<조직 단위(organization unit)>"
215- }]
216- }
217- 1 . API 서버 키와 인증서를 생성하면, 기본적으로
218- ` server-key.pem ` 과 ` server.pem ` 파일에 각각 저장된다.
219-
220- ../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
221- --config=ca-config.json -profile=kubernetes \
222- server-csr.json | ../cfssljson -bare server
223-
224-
225- ## 자체 서명된 CA 인증서의 배포
226-
227- 클라이언트 노드는 자체 서명된 CA 인증서를 유효한 것으로 인식하지 않을 수 있다.
228- 비-프로덕션 디플로이먼트 또는 회사 방화벽 뒤에서 실행되는
229- 디플로이먼트의 경우, 자체 서명된 CA 인증서를 모든 클라이언트에
230- 배포하고 유효한 인증서의 로컬 목록을 새로 고칠 수 있다.
231-
232- 각 클라이언트에서, 다음 작업을 수행한다.
233-
234- ``` bash
235- sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
236- sudo update-ca-certificates
237- ```
238-
239- ```
240- Updating certificates in /etc/ssl/certs...
241- 1 added, 0 removed; done.
242- Running hooks in /etc/ca-certificates/update.d....
243- done.
244- ```
245-
246- ## 인증서 API
247-
248- ` certificates.k8s.io ` API를 사용해서
249- [ 여기] ( /docs/tasks/tls/managing-tls-in-a-cluster ) 에
250- 설명된 대로 인증에 사용할 x509 인증서를 프로비전 할 수 있다.
9+ 클러스터를 위한 인증서를 생성하기 위해서는, [ 인증서] ( /ko/docs/tasks/administer-cluster/certificates/ ) 를 참고한다.
0 commit comments