[Tools] cfssl: 인증서 생성/관리 도구 (with kubernetes cert)

leehs·2023년 1월 6일
0

cfssl: 인증서 생성 도구

인증서를 생성할 때 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}/

TIP

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

사용법

  • sign: 인증서에 서명
  • bundle: 인증서 번들 생성
  • genkey: 개인키 및 인증서 요청(Ceritficate request) 생성
  • gencert: 개인키 및 인증서 생성
  • serve: API 서버 시작
  • version: 현재 버전
  • selfsign: 자체 서명 인증서 생성 (self-signed)
  • print-defaults: 기본값 출력

응용

Kubernetes certificates

원문: 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/

1) 패키지 다운로드

예제에서는 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}/

2) cfssl 초기화

mkdir cert
cd cert
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json

3) CA 파일 생성을 위한 JSON 설정 파일 생성

  • 최상위 인증기관 인증서 생성을 위한 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
  • server csr 인증서를 생성하기 위한 json 파일
    • MASTER_IP 와 MASTER_CLUSTER_IP를 적절하게 변경
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
  • client 인증서를 생성하기 위한 json 파일
    • Kuberntes Cluster의 사용자에 해당
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)>"
  }]

4) 인증서 생성

  • rootCA 생성
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

5) 배포

sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates

0개의 댓글