S/MIME로 나가는 이메일 서명하기

Tier: Free, Premium, Ultimate Offering: Self-Managed

GitLab에서 보내는 알림 이메일은 보안을 개선하기 위해 S/MIME로 서명될 수 있습니다.

S/MIME 인증서와 TLS/SSL 인증서는 같지 않으며 서로 다른 목적으로 사용됩니다: TLS는 안전한 채널을 생성하고, S/MIME은 메시지 자체를 서명하거나 암호화합니다.

S/MIME 서명 활성화

이 설정은 명시적으로 활성화되어야 하며 키 파일과 인증서 파일 한 쌍이 제공되어야 합니다:

  • 두 파일 모두 PEM 인코딩되어야 합니다.
  • 키 파일은 암호화되어 있으면 안 되며, GitLab이 사용자 개입 없이 해당 파일을 읽을 수 있어야 합니다.
  • RSA 키만 지원됩니다.

선택적으로 각 서명에 포함될 CA 인증서들의 번들(PEM 인코딩)도 제공할 수 있습니다. 일반적으로 중간 CA입니다.

경고: 개인 키의 액세스 수준 및 제3자의 볼 수 있는 정도에 유의해야 합니다.

Linux 패키지 설치의 경우:

  1. /etc/gitlab/gitlab.rb를 편집하고 파일 경로를 수정합니다:

    gitlab_rails['gitlab_email_smime_enabled'] = true
    gitlab_rails['gitlab_email_smime_key_file'] = '/etc/gitlab/ssl/gitlab_smime.key'
    gitlab_rails['gitlab_email_smime_cert_file'] = '/etc/gitlab/ssl/gitlab_smime.crt'
    # 선택 사항
    gitlab_rails['gitlab_email_smime_ca_certs_file'] = '/etc/gitlab/ssl/gitlab_smime_cas.crt'
    
  2. 파일을 저장하고 변경 사항이 적용되려면 GitLab을 다시 구성하여야 합니다.

키는 GitLab 시스템 사용자(git가 기본)에게 읽을 수 있어야 합니다.

자체 컴파일된 설치의 경우:

  1. config/gitlab.yml을 편집합니다:

    email_smime:
      # 작성자 이메일 S/MIME 서명을 활성화해야 하는 경우 주석 처리 해제하고 true로 설정합니다 (기본: false)
      enabled: true
      # PEM 형식의 S/MIME 개인 키 파일, 암호화되어 있지 않아야 합니다.
      # 기본값은 Rails root(즉, GitLab 애플리케이션의 루트)에 상대적인 '.gitlab_smime_key'입니다.
      key_file: /etc/pki/smime/private/gitlab.key
      # 서명된 메시지에 첨부될 PEM 형식의 S/MIME 공개 인증서 키
      # 기본값은 Rails root에 상대적인 '.gitlab_smime_cert'입니다.
      cert_file: /etc/pki/smime/certs/gitlab.crt
      # PEM 형식의 S/MIME 추가 CA 공개 인증서, 서명된 메시지에 첨부됩니다
      # 선택 사항
      ca_certs_file: /etc/pki/smime/certs/gitlab_cas.crt
    
  2. 파일을 저장하고 변경 사항이 적용되려면 GitLab을 다시 시작하여야 합니다.

키는 GitLab 시스템 사용자(git가 기본)에게 읽을 수 있어야 합니다.

S/MIME PKCS #12 형식을 PEM 인코딩으로 변환하는 방법

일반적으로 S/MIME 인증서는 바이너리 공개 키 암호화 표준 (PKCS) #12 형식(.pfx 또는 .p12 확장자)으로 다루어지며, 단일 암호화된 파일에 다음이 포함되어 있습니다:

  • 공개 인증서
  • 중간 인증서(있는 경우)
  • 개인 키

필요한 파일을 PKCS #12 파일에서 PEM 인코딩으로 내보내려면 openssl 명령어를 사용할 수 있습니다:

#-- 비밀번호가 없는 PEM 인코딩된 개인 키 추출
$ openssl pkcs12 -in gitlab.p12 -nocerts -nodes -out gitlab.key

#-- PEM 인코딩된 인증서 추출 (CA를 포함한 완전한 인증서 체인)
$ openssl pkcs12 -in gitlab.p12 -nokeys -out gitlab.crt