Help us learn about your current experience with the documentation. Take the survey.

使用 S/MIME 为外发邮件签名

  • 版本:Free, Premium, Ultimate
  • 产品:GitLab Self-Managed

GitLab 发送的通知邮件可以使用 S/MIME 进行签名,以提高安全性。

请注意,S/MIME 证书和 TLS/SSL 证书并不相同,用途也不同:TLS 用于创建安全通道,而 S/MIME 则对消息本身进行签名和/或加密。

启用 S/MIME 签名

此设置必须显式启用,并且必须提供一对密钥和证书文件:

  • 这两个文件都必须是 PEM 编码的。
  • 密钥文件必须是未加密的,以便 GitLab 可以在无需用户干预的情况下读取它。
  • 仅支持 RSA 密钥。

(可选)您还可以提供一组 CA 证书(PEM 编码)以包含在每个签名中。这通常是中级 CA。

请注意您私钥的访问级别以及对第三方的可见性。

对于 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'
    # Optional
    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:
      # Uncomment and set to true if you need to enable email S/MIME signing (default: false)
      enabled: true
      # S/MIME private key file in PEM format, unencrypted
      # Default is '.gitlab_smime_key' relative to Rails.root (the root of the GitLab app).
      key_file: /etc/pki/smime/private/gitlab.key
      # S/MIME public certificate key in PEM format, will be attached to signed messages
      # Default is '.gitlab_smime_cert' relative to Rails.root (the root of the GitLab app).
      cert_file: /etc/pki/smime/certs/gitlab.crt
      # S/MIME extra CA public certificates in PEM format, will be attached to signed messages
      # Optional
      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 命令:

#-- Extract private key in PEM encoding (no password, unencrypted)
$ openssl pkcs12 -in gitlab.p12 -nocerts -nodes -out gitlab.key

#-- Extract certificates in PEM encoding (full certs chain including CA)
$ openssl pkcs12 -in gitlab.p12 -nokeys -out gitlab.crt