GitLab, NGINX SSL 인증서 적용

Develop/DevOps 2021.01.25 댓글 PSJco
728x90
반응형

안녕하세요, PSJ입니다.

오늘은 업무환경에서 GitLab을 설치형으로 사용 중인데, 여기 SSL 인증서를 갱신하는 작업을 진행했는데요.

내부망에서 사용하는 시스템이라 사설 인증서를 OpenSSL을 통해 생성해서 사용했었는데, 정식 인증서를 발급받아 적용했습니다. 

 

GitLab의 경우 기본 WebServer로 NGINX를 사용하고 있습니다. 또한 SSL은 Let's Encrypt를 지원하고 있어서 설정만 켜게 되면 자동으로 SSL 인증서를 적용해 주죠. 하지만, 그마저도 외부와 차단된 네트워크 환경에서는 적용이 불가능합니다. 

 

내부망에서 사용하는 WildCard 인증서가 있어 GitLab에 적용해 보겠습니다. 사실 포스팅을 할만한 내용도 없습니다. 

일반적으로 SSL인증서의 경우 패스워드가 존재합니다. CSR 생성 시 입력하게 되죠. 하지만, GitLab - NGINX SSL 설정에는 Key를 입력하는 부분이 없습니다. 인증서(중계기관 및 Root 포함)와 개인키 파일만 지정하도록 설정값이 존재합니다. (gitlab.rb 파일)

...
nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"
...

하지만, 당연히 적용 가능합니다. 아래 2가지 방법 중 선택하시면 됩니다.

  1. 인증서에 Key를 제거해 적용 
  2. NGINX 설정을 추가해 적용

## 인증서에 Key를 제거해 적용

인증서는 출력형식(WebServer)에 따라 여러 가지 유형으로 제공되죠? 저는 Webtob, Apache 용으로 발급되는 PEM 파일에서 Key파일을 추출하겠습니다. (PEM 파일을 열어서 보시면 공개키와 개인키 내용이 함께 들어있는 걸 확인할 수 있습니다)

$ openssl rsa -in 인증서.pem -out 도메인.key
Enter pass phrase for 인증서.pem: (인증서 PEM 패스워드 입력)
writing RSA key

이제, PEM 파일에서 공개키를 분리해 CRT파일로 만들게요. 

$ openssl x509 -inform PEM -in 인증서.pem -out 도메인.crt

이렇게 하면 도메인.key, 도메인.crt 파일이 생성됐습니다. 이제, 중계기관 인증서를 도메인.crt 파일에 추가해 주면 끝입니다. 

제가 구입한 SSL 인증서에는 Chain/Root 인증서가 함께 Bundle로 합쳐진 형태로 제공이 됩니다. 이 파일과 도메인.crt 파일을 합쳐주면 됩니다. (그냥 메모장에서 합쳐도 되지만.. CAT 명령으로 합치겠습니다) 

$ cat Chain_RootCA_Bundle.crt >> 도메인.crt

이렇게 완성된 Key/Crt 파일을 gitlab.rb 파일에 적용하면 됩니다. 

## 기본적으로 GitLab에 설정한 도메인과 동일한 파일로 crt/key파일을 생성했으면 아래 처럼 기본값으로 셋팅
nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"

## crt/key 파일을 gitlab 도메인명과 다르게 설정한 경우 직접 지정해야함
nginx['ssl_certificate'] = "/경로/gitlabtest.com.crt"
nginx['ssl_certificate_key'] = "/경로/gitlabtest.com.key"

 

## NGINX 설정을 추가해 적용 

두번째 방법은 GitLab의 NGINX 기본 설정에서는 지원하지 않지만, NGINX에는 설정이 있어서 GitLab에서도 Custom Config로 설정하시면 됩니다.

## password 입력스크립트가 있는 파일을 아래와 같이 지정해 줍니다. 
nginx['custom_gitlab_server_config'] = 'ssl_password_file "/경로/passwd";'

## passwd 파일 예시 
#!bin/bash
echo "Password"

GitLab reconfigure 시에 Generate 되는 NGINX 설정에 기록해서 적용되는 것이죠. 이렇게 적용하시려면, 1번 방법처럼 굳이 Key와 Crt를 분리할 필요도 없습니다. 그냥 PEM 파일에 중계기관 인증서를 합쳐서 PEM 파일 하나로 만들어주시고, 아래처럼 gitlab.rb 파일을 설정해 주시면 됩니다.  

$ cat Chain_RootCA_Bundle.crt >> 인증서.pem
## 기존 pem 파일에 Chain RootCA를 merge 후 지정!
nginx['ssl_certificate'] = "/경로/gitlabtest.com.pem"
nginx['ssl_certificate_key'] = "/경로/gitlabtest.com.pem"

적고 보니 두 번째 방법이 훨씬 더 깔끔하네요. (PEM 형태의 인증서가 발급되었다는 가정하에) 또한, 보안적 측면에서도 Key를 제거하는 방법보다 훨씬 안전합니다. (Password 파일의 Permission 잘 관리해 주셔야 합니다)

개인적으로 두 번째 방법을 추천드립니다. 

 

이상입니다. 

 

공감과 댓글은 큰 힘이 됩니다.

 

 

 

728x90
반응형

댓글