Skip to main content

인증서를 더 쉽게 다뤄보자

gossl_main

오늘 다룰 프로젝트는 각 도메인의 인증서를 확인하거나 SSL 인증서를 다룰 때 편리하게 다룰 수 있게 도와주는 툴을 소개드리려고 합니다. 이 프로젝트는 Golang으로 만들었으며 brew를 통해 다운로드 받을 수 있도록 배포한 상태입니다. 기존에 리드미에 사용방법 등을 영문으로 게시하였지만 제 블로그를 통해 한국어로 자세하게 설명 및 사용 방법 등을 안내드리고자 합니다.

개발을 하면서 저는 항상 바퀴를 다시 발명하자는 말을 새기며 제가 만들고자 하는 툴이 있는지 인터넷을 검색하면서 알아보는데 제가 생각한 기능을 CLI 툴로 제공하는 마땅히 사용할만한 툴이 없었기에 제가 직접 만들게 되었으며 무엇보다 openssl 커맨드를 사용하여 긴 옵션들을 매번 찾아가면서 사용하는 것이 매우 불편했어요... 그래서 만들었습니다 !!

명령어는 echo, merge, split, unlock, validate, check, unzip, zip, download등이 있어요.

먼저 각 명령어 순으로 설명드리고자 합니다.

echo

이 명령어는 현재 경로에서 pem, crt, ca, csr, cer, key 등의 파일 확장자를 가진 파일 리스트를 선택할 수 있는 선택화면을 보여주고 인증서 파일을 선택하면 해당 인증서 파일의 인증서 종류(도메인 인증서, 체인 인증서, 루트 인증서인지)와, MD5 Hash, 인증서 만료일, 인증서 발급자명과 Subject, Verify Host를 보여줍니다. 인증서 파일이 아닌 키 파일을 선택할 경우 키 파일 종류(RSA PRIVATE KEY, PRIVATE KEY)등을 보여주고 마찬가지로 MD5 Hash를 보여줍니다. 이 기능은 주로 인증서 종류와 인증서 만료일을 확인하거나 인증서의 해쉬와 키파일의 해쉬를 비교할 때 자주 사용합니다. 또한 PRIVATE KEY 종류의 키 파일은 RSA PRIVATE KEY 파일로 변경할 수 있는 옵션등을 제공하기도 합니다.

❯ gossl echo

merge

NGINX와 같은 웹 서버를 사용할 때 해당 웹 서버 또는 엣지 서버에 인증서를 적용할 일이 최초 인프라 구축시에 자주 있기도 하고 인증서를 매번 확인 및 분류하여 도메인 인증서, 체인 인증서, 루트 인증서 순서대로 합치는 것이 번거롭기도 했고 cat 명령어를 사용하여 합칠 경우 중간에 공백이 들어가거나 잘못 합쳐지기도 해서 해당 기능을 만들게 되었습니다. 이 명령어는 -n를 사용해서 생성될 파일의 이름을 정하면 해당 이름.pem 형식으로 파일이 생성됩니다. 최소 2개 파일을 선택해야만 하며 순서 상관없이 도메인 인증서, 체인 인증서, 루트 인증서를 무작위 선택하면 도메인 인증서, 체인 인증서, 루트 인증서 순서대로 파일을 합쳐줍니다. 이름을 설정하지 않으면 자동으로 gossl_merge_output.pem이라는 이름으로 파일을 생성합니다.

❯ gossl merge # output: gossl_merge_output.pem
❯ gossl merge -n test # output: test.pem

split

merge가 각 인증서 종류별로, 도메인 인증서, 체인 인증서, 루트 인증서 순서대로 합치는 과정이라면 split은 이미 합쳐져 있는 인증서 파일이 어떤 종류의 인증서 순으로 이루어져있는지 보여주기도 하고 각 인증서 종류대로 파일을 새로 생성해주기도 합니다. gossl split을 했을 때 보여지는 파일은 기본적으로 단일 파일이 아닌 복합 인증서로 이루어진 키파일만을 보여주게 됩니다.

show 옵션은 각 인증서 종류별로 분할된 파일을 생성하지는 않고 어떤 인증서 순으로 조합되어 있는지만 확인하도록 도와주는 커맨드입니다.

❯ gossl split show

✅ gossl_merge_output.pem
➕ Leaf Certificate [in 1 block]
➕ Intermediate Certificate [in 1 block]
➕ Root Certificate [in 1 block]

show 옵션을 붙이지 않는다면 파일명에 인증서 종류를 포함하여 종류별로 파일을 생성해줍니다. 간혹 체인 인증서가 두 개로 이루어진 경우가 있어 이를 구분하기 위해 숫자가 포함되며 만약 체인 인증서 파일이 두 개로 이루어져있을 경우에 gossl_intermediate_1.crt와 gossl_intermetiate_2.crt가 생성되게 됩니다.

❯ gossl split

✅ gossl_merge_output.pem
➕ Leaf Certificate [in 1 block]
➕ Intermediate Certificate [in 1 block]
➕ Root Certificate [in 1 block]

Created Files
📄 gossl_leaf_1.crt created successfully
📄 gossl_intermediate_1.crt created successfully
📄 gossl_root_1.crt created successfully

unlock

unlock의 경우 프라이빗 키 파일에 한정하게 되며 키 파일에 암호가 걸려있을 경우 이미 걸려있는 암호를 입력한 후에 암호를 해제하여 다음 번에 키 파일을 조회할 경우 암호를 입력할 필요가 없어지게 됩니다.

❯ gossl unlock

validate

확인하고자 하는 도메인의 웹사이트가 CDN을 사용한다면 각 엣지 서버별로 인증서 적용 여부를 확인할 필요가 있을 수 있는데요. 이를 위해서 만들어진 기능이며 각 엣지 IP(엣지 서버)별로 적용된 도메인 인증서를 확인할 수 있는 기능입니다.

❯ gossl validate ghdwlsgur.github.io

Certificate [185.199.108.153]
Verify Host certificate is valid for *.github.io
Subject CN=*.github.io
O=GitHub\
Inc.
L=San Francisco
ST=California
C=US
Issuer Name CN=DigiCert TLS RSA SHA256 2020 CA1
O=DigiCert Inc
C=US
Common Name DigiCert TLS RSA SHA256 2020 CA1
Start Date 2023-02-21
Expire Date 2024-03-20 [353 days]
PubAlgorithm RSA
SigAlgorithm SHA256-RSA

Certificate [185.199.111.153]
Verify Host certificate is valid for *.github.io
Subject CN=*.github.io
O=GitHub\
Inc.
L=San Francisco
ST=California
C=US
Issuer Name CN=DigiCert TLS RSA SHA256 2020 CA1
O=DigiCert Inc
C=US
Common Name DigiCert TLS RSA SHA256 2020 CA1
Start Date 2023-02-21
Expire Date 2024-03-20 [353 days]
PubAlgorithm RSA
SigAlgorithm SHA256-RSA

check

이 기능은 SSL 인증서를 다루는 웹사이트에도 흔히 볼 수 있는 기능이지만 CLI 툴을 사용하여 더 편리하게 사용할 수 있고자 이 기능을 만들었습니다. validate가 각 도메인의 엣지 서버에 적용된 도메인 인증서 정보만을 제공하지만 이 기능은 도메인에 적용된 인증서를 모두 보여줍니다.

❯ gossl check ghdwlsgur.github.io

[ Leaf Certificate ]
Verify Host certificate is valid for *.github.io
Subject CN=*.github.io
O=GitHub\
Inc.
L=San Francisco
ST=California
C=US
Issuer Name CN=DigiCert TLS RSA SHA256 2020 CA1
O=DigiCert Inc
C=US
Common Name DigiCert TLS RSA SHA256 2020 CA1
Start Date 2023-02-21
Expire Date 2024-03-20 [353 days]
PubAlgorithm RSA
SigAlgorithm SHA256-RSA

[ Intermediate Certificate ]
Verify Host certificate is not valid for any names
Subject CN=DigiCert TLS RSA SHA256 2020 CA1
O=DigiCert Inc
C=US
Issuer Name CN=DigiCert Global Root CA
OU=www.digicert.com
O=DigiCert Inc
C=US
Common Name DigiCert Global Root CA
Start Date 2021-04-14
Expire Date 2031-04-13 [2933 days]
PubAlgorithm RSA
SigAlgorithm SHA256-RSA

unzip / zip

이 명령어는 말 그대로 압축을 해제하거나 압축을 할 수 있는 명령어로 기존에도 압축 명령어 및 압축 해제 명령어를 따로 사용했지만 gossl 명령어와 함께 자주 사용하게 되어서 유기적으로 사용할 수 있도록 위 기능도 추가하였습니다. gossl zip 명령어 사용시에 -n 옵션을 추가하여 생성될 압축 파일이름을 지정할 수 있습니다.

❯ gossl unzip
❯ gossl zip
❯ gossl zip -n test # output test.zip

커맨드 툴 설치는 아래와 같이 진행할 수 있습니다.

download

루트 인증서는 인증서 체인에서 가장 상위에 있는 인증서이며, 인증서 발급 기관(CA)의 신뢰도를 보장하며 브라우저와 운영체제는 일반적으로 미리 신뢰할 수 있는 루트 인증서 목록을 가지고 있으며, 대부분의 경우에는 브라우저나 운영체제가 신뢰하는 CA의 루트 인증서가 이미 포함되어 있지만 저는 그래도 웹서버에 인증서를 적용할 떄 루트 인증서를 포함하여 적용하는 것을 원하기 때문에 인증서에 항상 루트 인증서를 결합했어요. 하지만 늘 체인 인증서의 Issuer Name을 확인해서 루트 인증서의 이름을 검색엔진에 검색해서 링크를 통해 다운받고는 했는데 이 부분이 늘 불편했어요. 그래서 자주 사용되는 루트 인증서와 루트 인증서를 다운로드 받을 수 있는 브라우저 링크를 매핑하여 커맨드로 쉽게 다운로드 받을 수 있도록 했으며 명령 실행시 다운받는 경로는 현재 경로에 다운받을 수 있게 기본 설정되어 있습니다.

gossl download
? Select root certificate [Use arrows to move, type to filter]
> Baltimore CyberTrust Root
Cybertrust Global Root
DigiCert Assured ID Root G2
DigiCert Global Root G2
DigiCert Assured ID Root G3
DigiCert Federated ID Root CA
DigiCert Global Root G3
DigiCert Private Services Root
DigiCert Trusted Root G4
GTE CyberTrust Global Root

설치 방법

brew tap ghdwlsgur/gossl
brew install gossl

brew upgrade gossl

11월 말에 배포하여 계속적으로 업데이트하고 있으며 SSL 인증서와 관련하여 활용할 수 있는 기능들을 계속해서 추가하고 있는 프로젝트로 많은 사람들이 이 커맨드 툴을 사용하였으면 하는 바람으로 이 게시글을 작성했습니다. 만약 사용하면서 추가하면 좋을 기능들이 있다면 언제든지 말씀해주세요 !!