인증서를 생성할 때 OpenSSL로도 만들수 있지만, Cloudflare의 노하우가 담긴 도구를 사용하면 편리하고 안전하게 만들 수 있다.
Kubernetes 공식 페이지에서도 사용하고 있으니 알아두면 유용하다.
아래 응용 항목에서 Kubernetes 에서 사용 가능한 인증서 생성 방법도 작성하였다.
home: https://cfssl.org/
source: https://github.com/cloudflare/cfssl
docker: https://hub.docker.com/r/cfssl/cfssl/
introduce: https://blog.cloudflare.com/introducing-cfssl/
TLS/SSL 인증서 체인 번들링과 내부 인증 기관 인프라를 위해 만들어진 도구.
CloudFlare 내부에서 사용하던 도구이며, 모든 TLS 인증서에 이 도구를 사용중.
CloudFlare 규모에서 작업하면서 얻은 TLS 생태계 작동 방식에 대한 실제 전문 지식의 결과이므로 꽤나 믿을만하다는 얘기.
인증서 번들 생성 과정이 블랙박스처럼 보이지 않는데, 올바르게 수행되지 않으면 디버깅하는데 굉장히 어려움. 번들링을 쉽고 빠르게 할 수 있게 CFSSL을 만듦.
올바른 인증서 체인을 선택해 CFSSL은 성능, 보안 그리고 호환성 간의 균형을 해결함.
git clone git@github.com:cloudflare/cfssl.git
cd cfssl
make
https://github.com/cloudflare/cfssl/releases
CFSSL_VERSION=1.6.3
CFSSL_PATH=/usr/local/bin
ARCH=amd64
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_${ARCH}" -o cfssljson
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl-certinfo_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl-certinfo
chmod +x cfssl cfssljson cfssl-certinfo
sudo cp cfssl cfssljson cfssl-certinfo ${CFSSL_PATH}/
Github API로 릴리즈 최신버전 자동으로 가져오기
CFSSL_URI="cloudflare/cfssl"
cfssl_latest=$(curl -L --silent "https://api.github.com/repos/${CFSSL_URI}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/' | sed 's/^.//')
echo $cfssl_latest
원문: https://kubernetes.io/docs/tasks/administer-cluster/certificates/
참고: https://kubernetes.io/docs/tasks/tls/managing-tls-in-a-cluster/
좀 더 잘 정리된 글: https://coffeewhale.com/kubernetes/authentication/x509/2020/05/02/auth01/
예제에서는 v1.5.0 을 사용.
(23년 1월 6일 기준, 최신버전은 1.6.3 이다).
CFSSL_VERSION=1.5.0
CFSSL_PATH=/usr/local/bin
ARCH=amd64
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssljson_${CFSSL_VERSION}_linux_${ARCH}" -o cfssljson
curl -L "https://github.com/cloudflare/cfssl/releases/download/v${CFSSL_VERSION}/cfssl-certinfo_${CFSSL_VERSION}_linux_${ARCH}" -o cfssl-certinfo
chmod +x cfssl cfssljson cfssl-certinfo
sudo cp cfssl cfssljson cfssl-certinfo ${CFSSL_PATH}/
mkdir cert
cd cert
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"root-ca": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN": "rootCA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"O": "Kubernetes"
}]
}
EOF
cat > server-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"<MASTER_IP>",
"<MASTER_CLUSTER_IP>",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"O": "Kubernetes"
}]
}
EOF
cat > client-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"O": "client-group"
}
]
}
EOF
참고: names 의 내용은 아래와 같이 작성
Organization은 kubernetes 에서 사용자 그룹으로 사용
"names": [{
"C": "<국가(country)>",
"ST": "<도(state)>",
"L": "<시(city)>",
"O": "<조직(organization)>",
"OU": "<조직 단위(organization unit)>"
}]
cfssl gencert \
-initca ca-csr.json | cfssljson -bare ca
cfssl gencert \
-ca=ca.pem -ca-key=ca-key.pem \
--config=ca-config.json -profile=kubernetes \
server-csr.json | ../cfssljson -bare server
cfssl gencert \
-ca=ca.pem -ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
client-csr.json | cfssljson -bare client
sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates