- OpenSSL 3 업그레이드
- Let’s Encrypt 통합 활성화
- HTTPS 수동 구성
- 역방향 프록시 또는 로드 밸런서 SSL 종료 구성
- 사용자 정의 SSL 암호 구성
- HTTP/2 프로토콜 구성
- 2-way SSL 클라이언트 인증 활성화
- HTTP Strict Transport Security (HSTS) 구성
- 사용자 정의 공용 인증서 설치
- GitLab 및 SSL 작동에 대한 세부 정보
- 문제 해결
리눅스 패키지 설치를 위한 SSL 구성
Tier: Free, Premium, Ultimate
Offering: Self-Managed
리눅스 패키지는 SSL 구성을 위한 여러 일반적인 사용 사례를 지원합니다.
기본적으로 HTTPS가 활성화되어 있지 않습니다. HTTPS를 활성화하려면 다음을 수행할 수 있습니다:
- 무료 자동화된 HTTPS를 위해 Let’s Encrypt 사용.
- 자체 인증서로 HTTPS 수동 구성.
참고: 프록시, 로드 밸런서 또는 기타 외부 장치를 사용하여 GitLab 호스트 이름의 SSL을 종료하는 경우, 외부, 프록시 및 로드 밸런서 SSL 종료를 참조하세요.
다음 표는 각 GitLab 서비스가 지원하는 방법을 보여줍니다.
서비스 | 수동 SSL | Let’s Encrypt 통합 |
---|---|---|
GitLab 인스턴스 도메인 | 예 | 예 |
컨테이너 레지스트리 | 예 | 예 |
Mattermost | 예 | 예 |
GitLab Pages | 예 | 아니요 |
OpenSSL 3 업그레이드
버전 17.5부터, GitLab은 OpenSSL 3을 사용합니다. OpenSSL 3의 기본 설정과 호환되지 않을 수 있는 일부 구식 TLS 프로토콜 및 암호 스위트 또는 외부 통합을 위한 보안적으로 취약한 TLS 인증서가 있을 수 있습니다.
GitLab 17.5로 업그레이드하기 전에, 외부 통합의 호환성을 식별하고 평가하려면 OpenSSL 3 가이드를 사용하세요.
Let’s Encrypt 통합 활성화
Let’s Encrypt은 external_url
이 HTTPS 프로토콜로 설정되어 있고 다른 인증서가 구성되어 있지 않으면 기본적으로 활성화됩니다.
필수 구성 요소:
- 공개 Let’s Encrypt 서버에서 검증을 실행하는 포트
80
및443
이 액세스 가능해야 합니다. 검증 비표준 포트에서 작동하지 않습니다. 환경이 비공개 또는 공기 차단되었을 경우, certbot(Let’s Encrypt에서 사용하는 도구)은 수동 방법을 제공하여 Let’s Encrypt 인증서를 설치합니다.
Let’s Encrypt 활성화하기:
-
/etc/gitlab/gitlab.rb
을 편집하고 다음 항목을 추가하거나 변경합니다:## GitLab 인스턴스 external_url "https://gitlab.example.com" # 반드시 https 프로토콜을 사용해야 합니다 letsencrypt['contact_emails'] = ['foo@email.com'] # 옵션 ## 컨테이너 레지스트리 (옵션), https 프로토콜을 사용해야 합니다 registry_external_url "https://registry.example.com" #registry_nginx['ssl_certificate'] = "path/to/cert" # 없거나 주석 처리되어야 합니다 ## Mattermost (옵션), https 프로토콜을 사용해야 합니다 mattermost_external_url "https://mattermost.example.com"
- 인증서는 매 90일마다 만료됩니다.
contact_emails
에 지정한 이메일 주소는 만료 일자가 가까워질 때 경고를 받습니다. - GitLab 인스턴스는
인증서의 기본 도메인 이름입니다. 컨테이너 레지스트리와 같은 추가 서비스
또한 동일한 인증서의 대체 도메인 이름으로 추가됩니다. 위의 예에서 기본 도메인은
gitlab.example.com
이고 컨테이너 레지스트리 도메인은registry.example.com
입니다. 와일드카드 인증서를 설정할 필요가 없습니다.
- 인증서는 매 90일마다 만료됩니다.
-
GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
Let’s Encrypt이 인증서 발급에 실패하는 경우, 잠재적인 해결 방법에 대해서는 문제 해결 섹션을 참조하세요.
인증서 자동 갱신
기본 설치는 매월 4일 자정에 갱신을 예약합니다.
분은 external_url
의 값에 따라 상위 Let’s Encrypt 서버의 부하를 분산하기 위해 결정됩니다.
갱신 시간을 명시적으로 설정하려면:
-
/etc/gitlab/gitlab.rb
을 편집합니다:# 매월 7일 12:30에 갱신 letsencrypt['auto_renew_hour'] = "12" letsencrypt['auto_renew_minute'] = "30" letsencrypt['auto_renew_day_of_month'] = "*/7"
-
GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
참고: 인증서가 30일 후에 만료될 경우에만 갱신됩니다. 예를 들어, 인증서 만료일이 31일이고 매월 1일 00:00에 갱신하도록 설정했다면, 인증서는 갱신되기 전에 만료됩니다.
자동 갱신은 go-crond로 관리됩니다.
원하는 경우, /etc/gitlab/gitlab.rb
을 편집하여 CLI 인수를
go-crond에 전달할 수 있습니다:
crond['flags'] = {
'log.json' = true,
'server.bind' = ':8040'
}
자동 갱신을 비활성화하려면:
-
/etc/gitlab/gitlab.rb
을 편집합니다:letsencrypt['auto_renew'] = false
-
GitLab을 다시 구성합니다:
sudo gitlab-ctl reconfigure
인증서 수동 갱신
다음 명령 중 하나를 사용하여 Let’s Encrypt 인증서를 수동으로 갱신합니다:
sudo gitlab-ctl reconfigure
sudo gitlab-ctl renew-le-certs
이전 명령은 인증서가 만료일이 가까워질 때만 갱신됩니다. 갱신 중에 오류가 발생하는 경우, 상위 속도 제한을 고려하세요.
Let’s Encrypt 외 ACME 서버 사용하기
Let’s Encrypt 이외의 ACME 서버를 사용하여 인증서를 가져오도록 GitLab을 구성할 수 있습니다. 자체 ACME 서버를 제공하는 일부 서비스는 다음과 같습니다:
GitLab을 사용하여 사용자 지정 ACME 서버를 구성하려면 다음 단계를 따르세요:
-
/etc/gitlab/gitlab.rb
를 편집하고 ACME 엔드포인트를 설정합니다:external_url 'https://example.com' letsencrypt['acme_staging_endpoint'] = 'https://ca.internal/acme/acme/directory' letsencrypt['acme_production_endpoint'] = 'https://ca.internal/acme/acme/directory'
사용자 정의 ACME 서버가 제공하는 경우 스테이징 엔드포인트도 사용하세요. 스테이징 엔드포인트를 먼저 확인하여 ACME 구성이 올바른지 확인한 후 ACME 프로덕션에 요청을 제출합니다. 이렇게하면 구성 작업 중 ACME 속도 제한을 피할 수 있습니다.
기본값은:
https://acme-staging-v02.api.letsencrypt.org/directory https://acme-v02.api.letsencrypt.org/directory
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
인증서에 대체 도메인 추가하기
대체 도메인(또는 주제 대체 이름)을 Let’s Encrypt 인증서에 추가할 수 있습니다. 이것은 묶인 NGINX를 다른 백엔드 응용 프로그램에 대한 역방향 프록시로 사용하려는 경우 유용할 수 있습니다.
대체 도메인의 DNS 레코드는 GitLab 인스턴스를 가리켜야 합니다.
대체 도메인을 Let’s Encrypt 인증서에 추가하려면 다음을 수행하세요:
-
/etc/gitlab/gitlab.rb
를 편집하고 대체 도메인을 추가합니다:# 여러 도메인은 쉼표로 구분합니다 letsencrypt['alt_names'] = ['another-application.example.com']
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
생성된 주요 GitLab 애플리케이션의 Let’s Encrypt 인증서에는 지정된 대체 도메인이 포함됩니다. 생성된 파일은 다음 위치에 있습니다:
- 키:
/etc/gitlab/ssl/gitlab.example.com.key
- 인증서:
/etc/gitlab/ssl/gitlab.example.com.crt
HTTPS 수동 구성
경고: NGINX 구성은 브라우저와 클라이언트에게 HSTS를 사용하여 다음 365일 동안 GitLab 인스턴스와의 안전한 연결만 허용하도록 지시합니다. 더 많은 구성 옵션에 대해서는 HTTP Strict Transport Security 구성를 참조하십시오. HTTPS를 사용하기로 결정한 경우 적어도 다음 24개월 동안 인스턴스에 안전한 연결을 제공해야 합니다.
HTTPS를 활성화하려면 다음을 수행하세요:
-
/etc/gitlab/gitlab.rb
를 편집하십시오:-
external_url
을 도메인으로 설정합니다. URL에서https
에 유의하십시오:external_url "https://gitlab.example.com"
-
Let’s Encrypt 통합을 비활성화합니다:
letsencrypt['enable'] = false
GitLab은 모든 구성 시 Let’s Encrypt 인증서를 갱신하려고 시도합니다. 수동으로 생성한 인증서를 사용할 계획이라면 Let’s Encrypt 통합을 비활성화해야 합니다. 그렇지 않으면 자동 갱신 때문에 인증서가 덮어쓰여질 수 있습니다.
-
-
/etc/gitlab/ssl
디렉토리를 생성하고 여기에 키 및 인증서를 복사하십시오:sudo mkdir -p /etc/gitlab/ssl sudo chmod 755 /etc/gitlab/ssl sudo cp gitlab.example.com.key gitlab.example.com.crt /etc/gitlab/ssl/
예를 들어, 호스트 이름이
gitlab.example.com
인 경우 리눅스 패키지 설치는gitlab.example.com.key
및gitlab.example.com.crt
라는 개인 키 및 공개 인증서 파일을 사용합니다. 원하는 경우 다른 위치 및 인증서 이름 사용할 수 있습니다.올바른 순서로 전체 인증 체인을 사용하여 SSL 오류를 방지하려면 올바른 순서로 전체 인증 체인을 사용하여 SSL 오류를 방지하도록 함: 먼저 서버 인증서, 모든 중간 인증서, 마지막으로 루트 CA를 사용해야 합니다.
-
선택 사항:
certificate.key
파일에 암호가 설정되어 있는 경우, NGINX가 GitLab을 다시 구성할 때 암호를 요구하지 않습니다. 이 경우 리눅스 패키지 설치는 에러 메시지 없이 조용히 실패합니다.키 파일의 암호를 지정하려면 암호를 텍스트 파일에 저장합니다(예:
/etc/gitlab/ssl/key_file_password.txt
)에 다음을
/etc/gitlab/gitlab.rb`에 추가하십시오:nginx['ssl_password_file'] = '/etc/gitlab/ssl/key_file_password.txt'
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
-
선택 사항: 방화벽을 사용하는 경우 인바운드 HTTPS 트래픽을 허용하려면 포트 443을 열어야 할 수 있습니다:
# UFW 예시 (데비안, 우분투) sudo ufw allow https # lokkit 예시 (레드햇, CentOS 6) sudo lokkit -s https # firewall-cmd (레드햇, Centos 7) sudo firewall-cmd --permanent --add-service=https sudo systemctl reload firewalld
기존 인증서를 업데이트하는 경우 다른 프로세스를 따르세요.
HTTP
요청을 HTTPS
로 리디렉션하기
기본적으로 https
로 시작하는 external_url
을 지정하면 NGINX는 포트 80에서 암호화되지 않은 HTTP 트래픽을 더 이상 수신하지 않습니다. 모든 HTTP 트래픽을 HTTPS로 리디렉션하려면 다음을 수행하세요:
-
/etc/gitlab/gitlab.rb
를 편집하세요:nginx['redirect_http_to_https'] = true
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
참고: 이 동작은 Let’s Encrypt 통합을 사용할 때 기본적으로 활성화됩니다.
기본 HTTPS 포트 변경
기본(443)이외의 HTTPS 포트를 사용해야 하는 경우 external_url
의 일부로 지정합니다:
-
/etc/gitlab/gitlab.rb
파일 편집:external_url "https://gitlab.example.com:2443"
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
기본 SSL 인증서 위치 변경
호스트 이름이 gitlab.example.com
인 경우 Linux 패키지 설치는 기본적으로 /etc/gitlab/ssl/gitlab.example.com.key
라는 개인 키와 /etc/gitlab/ssl/gitlab.example.com.crt
라는 공용 인증서를 찾습니다.
SSL 인증서의 다른 위치를 설정하려면:
-
디렉토리를 만들고 적절한 권한을 부여한 후
.crt
및.key
파일을 디렉토리에 배치합니다:sudo mkdir -p /mnt/gitlab/ssl sudo chmod 755 /mnt/gitlab/ssl sudo cp gitlab.key gitlab.crt /mnt/gitlab/ssl/
SSL 오류를 방지하기 위해 올바른 순서로 전체 인증서 체인을 사용해야 합니다. 먼저 서버 인증서, 그 다음 중간 인증서 및 마지막으로 루트 CA를 사용해야 합니다.
-
/etc/gitlab/gitlab.rb
파일 편집:nginx['ssl_certificate'] = "/mnt/gitlab/ssl/gitlab.crt" nginx['ssl_certificate_key'] = "/mnt/gitlab/ssl/gitlab.key"
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
SSL 인증서 업데이트
SSL 인증서 내용이 업데이트되었지만 /etc/gitlab/gitlab.rb
에 구성 변경이 없는 경우 GitLab을 다시 구성하더라도 NGINX에 영향을 미치지 않습니다. 대신 NGINX를 정상적으로 구성 및 새 인증서를 다시로드하도록 해야 합니다:
sudo gitlab-ctl hup nginx
sudo gitlab-ctl hup registry
역방향 프록시 또는 로드 밸런서 SSL 종료 구성
기본적으로 Linux 패키지 설치는 external_url
에 https://
가 포함되어 있는지 자동으로 감지하고 SSL 종료를 위해 NGINX를 구성합니다. 그러나 GitLab을 역방향 프록시나 외부 로드 밸런서 뒤에서 실행하도록 구성한 경우, 일부 환경에서는 GitLab 애플리케이션 외부에서 SSL을 종료해야 할 수 있습니다.
번들된 NGINX가 SSL 종료를 처리하지 않도록하려면:
-
/etc/gitlab/gitlab.rb
파일 편집:nginx['listen_port'] = 80 nginx['listen_https'] = false
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
외부 로드 밸런서는 200
상태 코드를 반환하는 GitLab 엔드포인트에 액세스해야 할 수 있습니다(로그인이 필요한 설치의 경우 루트 페이지는 로그인 페이지로의 302
리디렉션을 반환합니다). 이 경우 헬스 체크 엔드포인트를 활용하는 것이 권장됩니다.
Pages (pages_
접두사), Mattermost (mattermost_
접두사)와 같이 번들된 컴포넌트도 프록시된 SSL에 대해 유사한 전략을 사용합니다. 특정 컴포넌트의 *_external_url
을 https://
로 설정하고 nginx[...]
구성에 컴포넌트 이름으로 접두사를 붙입니다. 예를 들어, GitLab 컨테이너 레지스트리 구성은 registry_
로 접두사가 붙습니다:
-
/etc/gitlab/gitlab.rb
파일 편집:registry_external_url 'https://registry.example.com' registry_nginx['listen_port'] = 80 registry_nginx['listen_https'] = false
동일한 형식은 Pages(
pages_
접두사) 및 Mattermost(mattermost_
접두사)에도 사용될 수 있습니다. -
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
-
선택 사항. 역방향 프록시 또는 로드 밸런서가 GitLab(및 사용하는 경우 Mattermost)로 특정 헤더(예:
Host
,X-Forwarded-Ssl
,X-Forwarded-For
,X-Forwarded-Port
)를 전달하도록 구성해야 할 수 있습니다. 이 단계를 빠뜨리면 “422 Unprocessable Entity” 또는 “CSRF 토큰과 인증성을 확인할 수 없습니다”와 같은 잘못된 리디렉션이나 오류가 발생할 수 있습니다.
AWS Certificate Manager (ACM)과 같은 일부 클라우드 제공자 서비스는 인증서 다운로드를 허용하지 않습니다. 이는 이러한 클라우드 서비스와 GitLab 간에 종료하기 위해 다른 인증서를 사용해야 한다는 것을 의미합니다. 때문에 SSL이 원하는 경우에는 GitLab 인스턴스에서 다른 인증서를 사용해야 합니다.
사용자 정의 SSL 암호 구성
기본적으로 Linux 패키지 SSL 암호는 https://gitlab.com에서의 테스트 및 GitLab 커뮤니티에 의한 다양한 모범 사례의 조합입니다.
SSL 암호를 변경하려면:
-
/etc/gitlab/gitlab.rb
파일 편집:nginx['ssl_ciphers'] = "CIPHER:CIPHER1"
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
ssl_dhparam
지시문을 활성화하려면:
-
dhparams.pem
을 생성합니다:openssl dhparam -out /etc/gitlab/ssl/dhparams.pem 2048
-
/etc/gitlab/gitlab.rb
파일 편집:nginx['ssl_dhparam'] = "/etc/gitlab/ssl/dhparams.pem"
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
HTTP/2 프로토콜 구성
GitLab 인스턴스가 HTTPS를 통해 접근 가능하다고 지정하는 경우 기본적으로 HTTP/2 프로토콜도 활성화됩니다.
Linux 패키지는 HTTP/2 프로토콜과 호환되는 필수 SSL 암호를 설정합니다.
만약 사용자 정의 SSL 암호를 지정하고 그 암호가 HTTP/2 암호 블랙리스트에 있는 경우 GitLab 인스턴스에 액세스할 때 브라우저에서 INADEQUATE_SECURITY
오류가 표시됩니다. 이 경우 문제를 해결하려면 암호 목록에서 문제가 되는 암호를 제거해야 합니다. 특정 사용자 정의 설정이 없다면 암호를 변경할 필요는 없습니다.
HTTP/2 지원을 비활성화하려면:
-
/etc/gitlab/gitlab.rb
파일 편집:nginx['http2_enabled'] = false
-
GitLab을 다시 구성:
sudo gitlab-ctl reconfigure
참고: HTTP/2 설정은 주요 GitLab 애플리케이션에만 적용되며 GitLab Pages, 컨테이너 레지스트리 및 Mattermost와 같은 다른 서비스에는 적용되지 않습니다.
2-way SSL 클라이언트 인증 활성화
신뢰할 수 있는 인증서로 웹 클라이언트의 인증을 요구하기 위해 2-way SSL을 활성화할 수 있습니다.
-
/etc/gitlab/gitlab.rb
파일을 수정하세요:nginx['ssl_verify_client'] = "on" nginx['ssl_client_certificate'] = "/etc/pki/tls/certs/root-certs.pem"
-
선택 사항. NGINX가 클라이언트가 유효한 인증서를 갖고 있지 않다고 판단하기 전에 인증서 체인을 얼마나 깊게 확인해야 하는지를 구성할 수 있습니다(기본값은
1
입니다)./etc/gitlab/gitlab.rb
파일을 수정하세요:nginx['ssl_verify_depth'] = "2"
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
HTTP Strict Transport Security (HSTS) 구성
참고: HSTS 설정은 본 GitLab 애플리케이션에만 적용되며 GitLab Pages, Container Registry, Mattermost와 같은 다른 서비스에는 적용되지 않습니다.
HTTP Strict Transport Security (HSTS)는 기본적으로 활성화되어 있으며 브라우저에 HTTPS를 통해만 웹 사이트에 연락해야 한다고 알립니다. 브라우저가 한 번이라도 GitLab 인스턴스를 방문하면 사용자가 명시적으로 일반적인 HTTP URL(http://
)을 입력하더라도 더 이상 안전하지 않은 연결을 시도하지 않도록 기억합니다. 일반 HTTP URL은 브라우저에 의해 자동으로 https://
로 리디렉션됩니다.
기본적으로 max_age
는 두 년간 설정되어 있으며, 이 기간 동안 브라우저는 오직 HTTPS를 통해 연결해야 한다는 것을 기억합니다.
max age 값을 변경하려면:
-
/etc/gitlab/gitlab.rb
파일을 수정하세요:nginx['hsts_max_age'] = 63072000 nginx['hsts_include_subdomains'] = false
max_age
를0
으로 설정하면 HSTS가 비활성화됩니다. -
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
HSTS 및 NGINX에 대한 자세한 내용은 https://blog.nginx.org/blog/http-strict-transport-security-hsts-and-nginx을 참조하세요.
사용자 정의 공용 인증서 설치
일부 환경은 다양한 작업을 위해 외부 리소스에 연결하며, GitLab은 이러한 연결이 HTTPS를 사용하고 자체 서명된 인증서로 연결하는 것을 허용합니다. GitLab에는 개별 사용자 정의 인증서를 /etc/gitlab/trusted-certs
디렉터리에 배치하여 해당 번들에 인증서를 추가할 수 있습니다. 이후 번들에 추가됩니다. 이들은 openssl의 c_rehash
메서드를 사용하여 추가되며, 이는 사용자 정의 인증서 체인 사용에서만 작동합니다.
Linux 패키지에는 공식 Mozilla 신뢰할 수 있는 루트 인증기관의 컬렉션이 함께 제공되며 인증서의 신뢰성을 확인하는 데 사용됩니다.
참고: 자체 서명된 인증서를 사용하는 설치에 대해서는 Linux 패키지가 이러한 인증서를 관리하는 방법을 제공합니다. 이 작업이 어떻게 작동하는지에 대한 기술적인 세부 정보는 이 페이지 맨 아래의 세부 정보를 참조하세요.
사용자 정의 공용 인증서를 설치하려면:
- 개인 키 인증서에서 PEM 또는 DER로 인코딩된 공용 인증서를 생성하세요.
- 공용 인증서 파일만
/etc/gitlab/trusted-certs
디렉터리에 복사하세요. 멀티 노드 설치를 하고 있는 경우 모든 노드에 해당 인증서를 복사했는지 확인하세요.- GitLab을 사용하여 사용자 정의 공용 인증서를 구성하는 경우, 기본적으로 GitLab은
.crt
확장자를 가진 GitLab 도메인 이름에 따라 명명된 인증서를 찾습니다. 예를 들어 서버 주소가https://gitlab.example.com
인 경우, 인증서는gitlab.example.com.crt
로 이름 지어져야 합니다. - GitLab이 사용자 정의 공용 인증서를 사용하는 외부 리소스에 연결해야 하는 경우, 해당 인증서를
.crt
확장자로/etc/gitlab/trusted-certs
디렉터리에 저장하세요. 그러나 파일을 관련된 외부 리소스의 도메인 이름을 기반으로한 이름으로 지어야 하는 것은 아니지만, 일관된 이름 지정 체계를 사용하는 것이 도움이 됩니다.
다른 경로와 파일 이름을 지정하려면 기본 SSL 인증서 위치 변경를 참조하세요.
- GitLab을 사용하여 사용자 정의 공용 인증서를 구성하는 경우, 기본적으로 GitLab은
-
GitLab을 다시 구성하세요:
sudo gitlab-ctl reconfigure
사용자 정의 인증서 체인 사용
알려진 문제로, 사용자 정의 인증서 체인을 사용하는 경우, 서버, 중간 및 루트 인증서를 /etc/gitlab/trusted-certs
디렉터리의 별도 파일에 넣어야 합니다.
이는 GitLab 자체 또는 GitLab이 연결해야 하는 외부 리소스에서 사용자 정의 인증서 체인을 사용하는 경우 모두 적용됩니다.
예를 들어, GitLab 자체의 경우 다음과 같이 사용할 수 있습니다:
/etc/gitlab/trusted-certs/example.gitlab.com.crt
/etc/gitlab/trusted-certs/example.gitlab.com_intermediate.crt
/etc/gitlab/trusted-certs/example.gitlab.com_root.crt
GitLab이 연결해야 하는 외부 리소스의 경우 다음과 같이 사용할 수 있습니다:
/etc/gitlab/trusted-certs/external-service.gitlab.com.crt
/etc/gitlab/trusted-certs/external-service.gitlab.com_intermediate.crt
/etc/gitlab/trusted-certs/external-service.gitlab.com_root.crt
GitLab 및 SSL 작동에 대한 세부 정보
Linux 패키지에는 고유한 OpenSSL 라이브러리가 포함되어 있으며 모든 컴파일된 프로그램(예: Ruby, PostgreSQL 등)이 이 라이브러리와 링크됩니다. 이 라이브러리는 /opt/gitlab/embedded/ssl/certs
에서 인증서를 찾기 위해 컴파일됩니다.
Linux 패키지는 /etc/gitlab/trusted-certs/
에 추가된 모든 인증서를 c_rehash 도구를 사용하여 /opt/gitlab/embedded/ssl/certs
에 심볼릭 링크로 추가합니다. 예를 들어, /etc/gitlab/trusted-certs/
에 customcacert.pem
를 추가한다고 가정해 봅시다:
$ sudo ls -al /opt/gitlab/embedded/ssl/certs
total 272
drwxr-xr-x 2 root root 4096 Jul 12 04:19 .
drwxr-xr-x 4 root root 4096 Jul 6 04:00 ..
lrwxrwxrwx 1 root root 42 Jul 12 04:19 7f279c95.0 -> /etc/gitlab/trusted-certs/customcacert.pem
-rw-r--r-- 1 root root 263781 Jul 5 17:52 cacert.pem
-rw-r--r-- 1 root root 147 Feb 6 20:48 README
여기에서 인증서의 지문이 7f279c95
임을 볼 수 있는데, 이는 사용자 정의 인증서에 대한 심볼릭 링크를 나타냅니다.
HTTPS 요청을 보낼 때 무슨 일이 벌어지나요? 간단한 Ruby 프로그램을 가져와 봅시다:
#!/opt/gitlab/embedded/bin/ruby
require 'openssl'
require 'net/http'
Net::HTTP.get(URI('https://www.google.com'))
뒤에서 무슨 일이 벌어지는지는 다음과 같습니다:
- “require
openssl
” 줄은 인터프리터가/opt/gitlab/embedded/lib/ruby/2.3.0/x86_64-linux/openssl.so
를 로드하도록 합니다. -
Net::HTTP
호출은/opt/gitlab/embedded/ssl/certs/cacert.pem
에 있는 기본 인증서 번들을 읽으려고 시도합니다. - SSL 협상이 발생합니다.
- 서버가 SSL 인증서를 보냅니다.
- 보낸 인증서가 번들에 포함되어 있다면 SSL은 성공적으로 완료됩니다.
- 그렇지 않으면, OpenSSL은 미리 정의된 인증서 디렉터리 내에서 지문과 일치하는 파일을 찾아 다른 인증서를 유효성 검사할 수 있습니다. 예를 들어, 인증서의 지문이
7f279c95
인 경우, OpenSSL은/opt/gitlab/embedded/ssl/certs/7f279c95.0
을 읽으려고 시도할 것입니다.
참고로 OpenSSL 라이브러리는 SSL_CERT_FILE
및 SSL_CERT_DIR
환경 변수의 정의를 지원합니다. 전자는 로드할 기본 인증서 번들을 정의하며, 후자는 더 많은 인증서를 찾을 디렉터리를 정의합니다. 이러한 변수는 사용자정의 인증서가 trusted-certs
디렉터리에 추가된 경우에는 필요하지 않을 수 있지만, 어떤 이유로 인해 이러한 변수를 설정해야 하는 경우 환경 변수로 정의될 수 있습니다. 예를 들어:
gitlab_rails['env'] = {"SSL_CERT_FILE" => "/usr/lib/ssl/private/customcacert.pem"}
문제 해결
SSL 문제 해결 가이드를 참조하십시오.