cfssl

개요

클라우드 플레어에서 만든 TLS 툴킷.
이건 cli면서도 서명, 검증, 묶음 요청을 처리하는 HTTP api 서버다.[1]

보통 ssl 툴킷들은 항상 뭐가 잘못 만들어졌어도 결과가 제대로 안 보여서 문제가 있는지 빠르게 캐치하기도 힘들다.
E-api 서버 감사에서 나도 실제로 고생을 조금 했다.
그러나 이 툴은 이 페인 포인트를 줄여준다.

아니 근데 이거 제대로 된 문서도 없는데, 꽤나 이름을 날리는 것 같다?
뭐지.. 확실한 이유가 있긴 한갑다.
openssl과 비교해서 얼마나 좋은지, 직접 사용해보며 간략하게 비교해보련다.
여기에서는 정말 간단하게만 문서를 정리한다.

배경

나는 아직 경험해본 적 없지만, 인증서를 관리할 때 또 불편한 것 중 하나가 체인 인증서 묶음(bundle)을 만드는 것이라고 한다.
왜 묶음이 필요한가?
클라이언트 환경은 모두 같은 CA를 공유하지 않을 수 있다.

뭐, 이런 저런 이유로 결국 운영자는 인증서 묶음을 만들어야 할 일이 있다는 건데, 이 묶음 체인이 점점 길어지면 문제가 많이 생기게 된다.
일단 세팅하는 거 자체가 매우 귀찮고, 신뢰를 위한 인증 과정이 오래 걸리게 되고, 그런 이슈들이 있다.

루트 인증서, 중간 intermediate 인증서의 버전도 바뀌고 변경사항이 생기며 인증서 사이 여러 체인이 발생한다.
대충 위에서 이야기한 이슈들에 대해, 각종 선택지가 생기게 된다.
근데 여기에서 cfssl이 좋은 선택지를 고를 수 있게 도와준다는 것이다.

구성

앞서 말했듯, cfssl은 일반적인 cli 툴로서 사용할 수도 있지만 동시에 웹 서버로서 기능할 수도 있다.

cfssl serve

이건 api 서버를 띄우는 것으로, 이렇게 틀어놓고 요청을 보내서 작업을 할 수도 있다.
http://localhost:8888/api/v1/cfssl/bundle로 POST 요청을 날리면 된다고 한다.
결국 하는 작업 자체는 같다만, 인증서를 대량으로, 수시로 관리해야 하는 운영환경에서 사용하기에 적합할 것으로 보인다.

cfssl에는 4개의 독자적인 명령어가 있다.

bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca

내부적으로는 조금 더 명령어들이 있긴 하다.
여기에서 인증서를 받는 작업만 하고 싶다면 cfssl, cfssljson만 사용하면 된다.

설치

그냥 문서 보고 설치하면 된다.
레드헷 계열에서는 특정 알고리즘들이 제거되어 레지스트리로 설치할 수 없기에, 직접 소스코드를 받아서 빌드해야 한다.
Pasted image 20250123114926.png
그러나 데비안 계열은 딸깍 ㅎㅎ

사용법

cfssl 템플릿

cfssl print-defaults config
cfssl print-defaults csr

이걸 통해 기본 템플릿을 뽑아볼 수 있다.

{
    "signing": {
        "default": {
            "expiry": "168h"
        },
        "profiles": {
            "www": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}

이런 식의 json이 출력되는데, 커스텀하면 된다.

cfssljson

cfssl을 이용하여 각종 명령을 수행할 수 있는데, 이때 기본 결과물이 json 형태로 출력된다.
이것을 받아서 보통 이용하는 인증서 형태로 변환할 때는 | cfssljson 을 이용해주면 된다.

그래서 이 녀석을 최종 파이프라인으로 걸어서 각종 명령을 수행하게 될 것이다.

개인키, 인증서 만들기

cfssl selfsign root ca-csr.json | cfssljson -bare
---
cfssl gencert -initca ca-csr.json | cfssljson -bare

루트 CA 키와 인증서를 만들 때는 이런 식으로 해주면 된다.
둘 다 같은 결과를 내므로 상관 없다.

cfssl genkey chain-csr.json | cfssljson -bare chain
cfssl sign -ca ca.pem -ca-key ca-key.pem chain.csr | cfssljson -bare chain
---
cfssl gencert -ca ca.pem -ca-key ca-key.pem chain-csr.json | cfssljson -bare chain

키와 csr를 만든 후에 따로 서명을 하는 게 사실 일반적일 것이다.
그러나 혼자 쓰는 경우라면 gencert로 한번에 인증서까지 좌라락 받아버릴 수도 있다.

genkey api로 개인키 생성.
이후 CSR
그리고 인증서 발행
 cfssl sign -ca-key=test-key.pem -ca=test-cert.pem www.example.com example.csr

root ca 만들기
gencert -initca

cfssl bundle -cert mycert.crt

이렇게 하면 번들을 만들 수 있다.
출력물은 json 형식이다.

관련 문서

이름 noteType created

참고


  1. https://blog.cloudflare.com/introducing-cfssl/ ↩︎