@@ -4,247 +4,6 @@ content_type: concept
4
4
weight : 20
5
5
---
6
6
7
-
8
7
<!-- overview -->
9
8
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