cfssl
개요
클라우드 플레어에서 만든 TLS 툴킷.
이건 cli면서도 서명, 검증, 묶음 요청을 처리하는 HTTP api 서버다.[1]
보통 ssl 툴킷들은 항상 뭐가 잘못 만들어졌어도 결과가 제대로 안 보여서 문제가 있는지 빠르게 캐치하기도 힘들다.
E-api 서버 감사에서 나도 실제로 고생을 조금 했다.
그러나 이 툴은 이 페인 포인트를 줄여준다.
아니 근데 이거 제대로 된 문서도 없는데, 꽤나 이름을 날리는 것 같다?
뭐지.. 확실한 이유가 있긴 한갑다.
openssl과 비교해서 얼마나 좋은지, 직접 사용해보며 간략하게 비교해보련다.
여기에서는 정말 간단하게만 문서를 정리한다.
배경
나는 아직 경험해본 적 없지만, 인증서를 관리할 때 또 불편한 것 중 하나가 체인 인증서 묶음(bundle)을 만드는 것이라고 한다.
왜 묶음이 필요한가?
클라이언트 환경은 모두 같은 CA를 공유하지 않을 수 있다.
- 일단 브라우저 별로 다른 root CA를 가지기도 한다.
- 과거의 이야기지만 파이어폭스에서 쓰이는 NSS 루트 스토어는 143개, 윈도우는 300여 개의 CA를 가지고 있었다고 한다.
- 옛날 버전의 시스템에서는 최신 CA 인증서를 안 가지고 있기도 하다.
- 옛날 버전의 시스템에서는 최신 암호 기법을 지원하지 않기도 한다.
뭐, 이런 저런 이유로 결국 운영자는 인증서 묶음을 만들어야 할 일이 있다는 건데, 이 묶음 체인이 점점 길어지면 문제가 많이 생기게 된다.
일단 세팅하는 거 자체가 매우 귀찮고, 신뢰를 위한 인증 과정이 오래 걸리게 되고, 그런 이슈들이 있다.
루트 인증서, 중간 intermediate 인증서의 버전도 바뀌고 변경사항이 생기며 인증서 사이 여러 체인이 발생한다.
대충 위에서 이야기한 이슈들에 대해, 각종 선택지가 생기게 된다.
근데 여기에서 cfssl이 좋은 선택지를 고를 수 있게 도와준다는 것이다.
구성
앞서 말했듯, cfssl은 일반적인 cli 툴로서 사용할 수도 있지만 동시에 웹 서버로서 기능할 수도 있다.
cfssl serve
이건 api 서버를 띄우는 것으로, 이렇게 틀어놓고 요청을 보내서 작업을 할 수도 있다.
http://localhost:8888/api/v1/cfssl/bundle
로 POST 요청을 날리면 된다고 한다.
결국 하는 작업 자체는 같다만, 인증서를 대량으로, 수시로 관리해야 하는 운영환경에서 사용하기에 적합할 것으로 보인다.
cfssl에는 4개의 독자적인 명령어가 있다.
- cfssl - cfssl 패키지를 실행하는 cli 툴
- multirootca - 복합 서명 키를 제공하는 CA서버
- mkbundle - 인증서 번들을 빌드할 때 사용되는 프로그램
- cfssljson - cfssl, multirootca로부터 json 형태의 출력을 받아 인증서, 키, CSR, 번들을 디스크에 저장해주는 프로그램.
bin
├── cfssl
├── cfssl-bundle
├── cfssl-certinfo
├── cfssl-newkey
├── cfssl-scan
├── cfssljson
├── mkbundle
└── multirootca
내부적으로는 조금 더 명령어들이 있긴 하다.
여기에서 인증서를 받는 작업만 하고 싶다면 cfssl, cfssljson만 사용하면 된다.
설치
그냥 문서 보고 설치하면 된다.
레드헷 계열에서는 특정 알고리즘들이 제거되어 레지스트리로 설치할 수 없기에, 직접 소스코드를 받아서 빌드해야 한다.
그러나 데비안 계열은 딸깍 ㅎㅎ
사용법
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
을 이용해주면 된다.
- bare
- api 표준 응답 형식이 아닌 그냥 형식으로 출력
- f
- 파일로 입력하고 싶다면
- stdout
- 파일로 저장하지 않고 출력
그래서 이 녀석을 최종 파이프라인으로 걸어서 각종 명령을 수행하게 될 것이다.
개인키, 인증서 만들기
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 |
---|