TeamViewer 客户端之间的所有连接都使用证书来验证参与双方的身份。这些证书由TeamViewer CA 为每个TeamViewer ID 颁发,可防止这些设备冒充另一个设备。自带证书"(BYOC)功能使TeamViewer 用户可以使用自己的证书来验证TeamViewer 连接中涉及的设备。这与TeamViewer 证书的验证无关,而且始终是验证之外的验证。

TeamViewer 可以对安装进行配置,要求对输入连接、输出连接或两者进行自定义证书验证。需要自定义证书验证时,只有对方拥有由配置的认证机构签署的证书的私钥,连接才能成功。这是一种将 连接限制为特定设备的有效方法。TeamViewer

本文适用于所有TeamViewer Tensor 客户。

证书

使用 自带证书 需要一个证书颁发机构 (CA) 来签署所有需要进行身份验证的设备的证书。所有需要其他设备进行证书验证的设备都必须能够访问 CA 证书。所有希望向其他设备验证自己身份的设备都必须能够访问由 CA 签发的证书、匹配的私钥和所有中间证书(如有)。TeamViewer 支持 X.509 证书,可从文件或Windows 信任存储导入这些证书及其私钥。

使用Windows 信托商店

从Windows 信任存储中加载的证书和私钥必须安装在全机信任存储中。可使用certlm.msc 访问该存储空间。

CA 证书必须安装在 "受信任的根证书颁发机构 "目录中。用于身份验证的特定 CA 证书由其唯一的十六进制编码指纹标识。双击所需证书时,可在 "详细信息 "选项卡的 "拇指指纹 "中找到该指纹。

设备证书必须安装在本地计算机证书的 "个人 "目录下。它必须有一个可用的私钥;这可以通过双击证书来验证,证书上会显示一个小的密钥图标。

为方便起见,可将 自带证书 功能配置为使用与本地计算机同名的客户端证书。这将允许所有机器使用相同的配置,也是设置客户证书的推荐方式。

使用证书文件

从文件加载的证书和私钥必须是 DER 编码的二进制 X.509 或 base-64 编码的 X.509(PEM 格式)。不支持 PFX 等其他格式。

如果设备和 ca 根证书之间有任何中间证书,则必须将它们包含在设备证书文件中。这仅支持 PEM 格式文件;DER 格式文件不能包含证书链。

应使用操作系统的访问控制对包含私钥的文件进行充分保护。如果TeamViewer 服务正在运行,它将访问私钥,因此在Windows 上,只需要 SYSTEM 用户的访问权限。

配置

默认情况下,自带证书 功能被禁用,传入或传出连接都不需要证书验证。反之,也无法连接或接收来自任何需要证书验证的机器的连接。

要启用 自带证书 功能并要求进行证书验证,必须在TeamViewer 设置中设置一个配置字符串。这些设置位于Windows 注册表中。具体位置取决于所使用的Windows 和TeamViewer 的 32 位或 64 位版本组合:

自带证书 配置位于 "安全 "子键内。如果该注册表键值不存在,则必须创建。然后,要启用 BYOC 功能,必须创建一个类型为 "字符串"、名称为 "BYOC_Configuration "的新值。

如果该值存在且不为空,则 BYOC 功能处于激活状态,即使配置无效也是如此。如果配置无效,则无法连接。

可以使用 PowerShell 从命令行创建该值:

New-Item -Force `
         -Path HKLM:\SOFTWARE\TeamViewer\Security
New-ItemProperty -Force `
                 -Path HKLM:\SOFTWARE\TeamViewer\Security `
                 -Name BYOC_Configuration

配置本身使用 JSON 格式。JSON 可以直接输入或复制到注册表编辑器中,但用户界面只允许输入一行,因此 JSON 必须去掉所有换行符。另外,也可以通过 PowerShell 从文件中设置注册表键值。假设配置保存在当前目录下名为 TeamViewerBYOC.json 的文件中,则可以像这样加载:

New-ItemProperty -Force `
                 -Path HKLM:\SOFTWARE\TeamViewer\Security `
                 -Name BYOC_Configuration `
                 -Value $(Get-Content TeamViewerBYOC.json)

JSON 的内容决定了何时需要进行证书验证,以及在哪里可以找到证书。下文将展示一些配置示例。

使用Windows 信托商店

证书和私钥可从全机Windows 信任存储中加载。为识别正确的证书,TeamViewer 客户端可查找与本地计算机同名的证书。该证书在本文中称为host 证书。

加载host 证书的配置如下:

{
 "cert": {
  "windows": {
   "use_host_certificate": true
  }
 }
}

这将使用host 证书对本设备进行身份验证,并使用签署host 证书的 CA 对其他设备进行身份验证。通过主机名识别正确的证书,此配置可用于不同的设备,并使用特定的设备。

另外,也可以通过指纹明确指定 CA 证书:

{
 "cert": {
  "windows": {
   "use_host_certificate": true
  }
 },
 "root_ca": {
  "windows": {
   "fingerprint": "d2dcdd02666b6335736c137fbbecff84730837af"
  }
 }
}

使用证书文件

另外,也可以从文件中加载证书。对于客户证书,密钥也必须以文件形式提供,使用与证书本身相同的格式(PEM 或 DER)。只有TeamViewer 服务需要访问密钥;在Windows 上,该进程以SYSTEM用户身份运行。建议限制对私钥文件的访问。

如果有中间证书,应将其附加到客户端证书文件中。在这种情况下,必须使用 PEM 文件;不能使用 DER 文件的证书链。

加载 PEM 文件的配置如下所示:

{
 "cert": {
  "pem": {
   "path": "/etc/teamviewer/certs/client_chain.pem",
   "key_path": "/etc/teamviewer/certs/client.key"
  }
 },
 "root_ca": {
  "pem": {
   "path": "/etc/teamviewer/certs/ca.pem"
  }
 }
}

另外,加载二进制 DER 文件的方法如下:

{
 "cert": {
  "der": {
   "path": "/etc/teamviewer/certs/client.der",
   "key_path": "/etc/teamviewer/certs/client.key"
  }
 },
 "root_ca": {
  "der": {
   "path": "/etc/teamviewer/certs/ca.der"
  }
 }
}

禁用证书验证

默认情况下,输入和输出连接都需要验证。可以在 root_ca 部分单独禁用这些功能。

只要求输入连接使用证书:

{
 "cert": {
  ...
 },
 "root_ca": {
  "dont_validate_outgoing": true
 }
}

或者,只要求输出连接使用证书:

{
 "cert": {
  ...
 },
 "root_ca": {
  "dont_validate_incoming": true
 }
}

这两个选项可以结合使用,使传入或传出连接都不需要证书验证。这很有用,因为它仍能让客户端与其他需要证书验证的设备进行身份验证。

使用 CRL 进行证书吊销验证,提高安全性

此外,如果支持证书吊销列表(CRL),还可通过增强的安全功能对证书进行验证。默认情况下,CRL 验证选项未启用。这意味着,除了现有的方法外,现在还有一种使用 CRL(证书吊销列表)吊销和监督证书的机制。

{ 
"cert": { 
... 
}, 
"root_ca": { 
"verify_crl": true 
} 
} 

(本节中的签发证书指根CA 证书或中间CA 证书,它们签发链中的下一个证书。例如,根CA➜ 中间CA➜ 客户端,根CA 签发中间CA,中间CA 签发根CA。 )

(本节所指的签发凭证为中间凭证管理中心(IntermediateCA)凭证或用户端(Client)凭证,由该凭证链中的前一个凭证签发。例如,根凭证管理中心➜中间凭证管理中心➜用户端,中间凭证管理中心由根凭证管理中心签发,用户端由中间凭证管理中心签发。)

任何签发证书都可以因故撤销已签发的证书,并在 CRL 中更新被撤销证书的序列号。

CRL 从证书中作为 CRL 分发点的 URL 下载。证书允许在 CRL 分发点中支持多个 URL,因此一个证书可有多个 CRL。支持 PEM 和 DER 格式的 CRL。目前只支持基本 CRL,不支持 delta CRL。

如何进行证书验证?

对于一个证书链,无论是根 CA➜客户机还是根 CA➜中间 CA➜客户机,都要通过分发点(URL/s)下载每个已签发证书的 CRL。然后根据 CRL 验证已签发的证书。

验证失败;因此,在以下任何一种情况下,身份验证都会失败:

  • 如果证书链无法验证或证书过期
  • 如果 URL 无法访问或不允许下载 CRL
  • 如果 CRL 格式不正确或为空文件或缺少字节
  • 如果 CRL 过期
  • 如果证书 URL 的签发证书没有生成 CRL
  • 如果已签发的证书被废止

局限性

该功能仍在开发中,目前有一些已知的限制:

  • 根据设计,会议不受 BYOC 限制。
  • 该功能目前仅与Windows 兼容。