# 客户端访问

> 拨号连上这台工作站的那些 OPC UA 应用程序的证书：登记一个客户端、审核并信任或者阻止证书、连接地址、Windows 防火墙规则、实时会话和受信任名单。

客户端访问是 Connector 上 OPC UA 服务器面板的第三张卡片。它是内置服务器见过的那些应用程序证书的名单，以及你对每一份做了什么决定：未知的证书在它第一次尝试时就被拒绝，并留在这里等你审核；信任它，这个应用程序就够得到服务器；阻止它，它就被安安静静挡在外面。卡片抬头就是这么说的：“客户端证书标识的是请求连接的那个应用程序。只信任你已经和调试该客户端的人核对过的指纹。”查看 Connector 可以读这张卡片，由配置 Connector 来决定；每一个决定都在工作站自己的桌面上做。

抬头下面立着一条原则：“证书信任和登录是两道彼此独立的检查。信任允许这份应用程序证书连上服务器。上面的‘客户端认证’设置仍然决定它是匿名连接，还是用配置好的用户名和密码连接。证书上的名称是客户端自称的；要核对的身份是 SHA-256 指纹。”

## 谁可以决定 {#who-may-decide}

这张卡片上的每一个按钮都听同一条规则，而它的提示文字说明是哪一部分拒绝了：在另一台设备的浏览器里是“客户端访问只能在工作站本机的桌面应用中更改。”（卡片上还有那条提示条“要更改客户端访问，请打开桌面应用”：远程浏览器可以查看这份名单，不能改动它）；没有配置 Connector 的角色根本不会被画出这些按钮；有单元在运行时给出的是“有单元在运行时配置是锁住的。”；一个决定、一次导入或者那条防火墙命令正在执行时是“另一项客户端访问更改正在进行。”一次仍然挤过去的按下，会在状态栏上被同一句话答复，而这张卡片上每一种结果都落在那里。

## 添加客户端 {#add-client}

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| 添加客户端 | 打开一个五分钟的监听窗口：“添加客户端的窗口已打开五分钟。请现在在 OPC UA 客户端里发起连接；如果它先要求你信任本工作站，请在那边确认后重试。”窗口开着的时候，抬头显示剩余时间（mm:ss），一下一下地跳。 | 按上面那条规则。 | 没有窗口开着的时候才画出来。 |
| 取消 | 关掉这个窗口：“添加客户端的窗口已关闭。未知证书保持断开。” | 按上面那条规则。 | 有窗口开着的时候才画出来。 |

这个窗口解释一次尝试；它从不辨认哪一次，也绝不信任任何东西。窗口开着的时候，卡片带着那条警示提示条“正在等待客户端证书 · mm:ss”：“现在请在 OPC UA 客户端里发起连接。如果该客户端先拒绝了本工作站的服务器证书，请确认那就是这台 Ganter Lab 工作站，在客户端里信任它，然后重试。客户端的证书随后会出现在‘待批准’下面；Ganter Lab 不会自动信任任何东西。”到了截止时刻，窗口自己失效。

### 这是你正在添加的客户端吗？ {#is-this-the-client-you-are-adding}

窗口开着的时候到来的一份证书，会显示在一条同名的提示条里：“有一个客户端在‘添加客户端’打开期间出示了这份证书。在本工作站把它称作‘预期的’之前，请先和你正在调试的客户端核对。在你回答之前，它在下面的列表里仍是未知证书，并保持断开。”，带着它的名称、主体和指纹。

| 命令 | 作用 |
| --- | --- |
| 就是这个客户端 | 把它标记成你要的那个客户端并关掉窗口：“`<name>` 已确认为你正在添加的客户端，添加客户端的窗口已关闭。在你于下面信任它之前，它保持断开。”它仍然要在“待批准”下面被信任。 |
| 不是这个 | 让它仍然是一份普通的未知证书，并继续听着：“`<name>` 仍是一份等待审核的未知证书。添加客户端的窗口仍在监听。” |

只有你的回答或者那个截止时刻能关掉这个窗口，所以别人的一次尝试既花不掉它，也借不到它的措辞。新开的窗口会忘掉上一个窗口里没有回答的那些询问。

## 待批准 {#pending-approval}

至少有一份证书等着的时候这一组才画出来，抬头是“在你做出决定之前，未知的应用程序保持断开。”，带着数量。每一行显示一个警示色调的圆点、证书自称的名称、“自称的应用程序身份”、SHA-256 指纹、“最近一次尝试 `<date and time>` · N 次连接尝试”，以及一个**证书详情**折叠块，里面是主体、颁发者、应用程序 URI、域名、有效期起、有效期至和首次出现。一条通知的“审核”带过去的那一行标着“已选中待审核”，并被滚动到视野里。

| 命令 | 作用 | 什么时候变灰（情形） |
| --- | --- | --- |
| 信任 | 把这份证书挪到受信任的客户端里，并刷新实时校验器，于是客户端可以立刻重试：“`<name>` 已被信任。该客户端可以重试连接了。” | 按上面那条规则。 |
| 阻止 | 把它挪到被阻止的客户端里，断开正在用它的任何会话，并且此后不再询问地继续拒绝它：“`<name>` 已被阻止。今后来自这份证书的尝试仍会被拒绝。” | 按上面那条规则。 |
| 丢弃所有待处理的证书（在这一组抬头上，用危险色调） | 先问一句“要丢弃那份等待审核的证书吗？”或者“要丢弃那 N 份等待审核的证书吗？”（“这样做不会信任也不会阻止任何东西：这些请求被移除，列表重新腾出位置。此后再连接的客户端会作为新请求出现在这里。”），带**丢弃**和**保留列表**。然后是“已丢弃 N 份等待审核的证书。” | 按上面那条规则。 |

在你做出决定之前，一份证书一直保持断开；重试只更新它的尝试次数和最近尝试时间，不会再来一条通知。

### 待审列表已满 {#the-review-list-is-full}

这份列表最多装 100 份证书。它满着的时候，再来一份未知证书仍然会被拒绝，但不再留存，卡片会用一条警示提示条说明：“下面的待审列表已满。在它满着的时候，新证书会被拒绝而不会加进这里，因此你等待的那个客户端可能永远不会出现。请丢弃等待审核的证书来腾出位置。”；一旦真的丢掉过，就写“…自从它满了以后，已有 1 份证书被拒绝而没有加进这里。你等待的客户端可能就是它…”或者“…已有 N 份证书被拒绝…”。每一次这样的拒绝也都记进日志。重新有位置时这个计数归零。

## 连接地址 {#connection-addresses}

“请使用与客户端所在位置相符的那个地址。”两个只读地址：**本机**，`opc.tcp://localhost:<port>/UA/GanterLab`，给跑在工作站上的客户端用；**本地网络**，`opc.tcp://<network name>:<port>/UA/GanterLab`，给局域网上别处的客户端用。名字和端口都取自[配置](connector-opcua-configuration)：名字就是**网络名称**里写的那个，该字段为空时取这台计算机自己的名字。

## Windows 防火墙 {#windows-firewall}

一个圆点和一句话说明本应用拥有的那条入站规则有没有放行当前端口，没有放行时给出一个动作。

| 状态 | 文字 |
| --- | --- |
| 已放行（绿色） | “端口 N 上的入站 OPC UA 连接对专用网络和域网络放行。” |
| 未配置（警示色调） | “网络客户端可能被阻止，因为没有本应用拥有的规则放行端口 N。”**放行本地网络**按钮画出来。 |
| 不支持（灰色） | “这种启动方式无法管理 Windows 防火墙。如有需要，请在操作系统中配置入站访问。”开发运行、绿色运行或者演示运行，以及任何不是装出来的那个应用的运行方式。 |
| 未知（灰色） | “无法确定 Windows 防火墙的状态。” |

| 命令 | 作用 | 什么时候变灰（情形） |
| --- | --- | --- |
| 放行本地网络 | 以提权方式启动应用自己那个助手，于是 Windows 会请求管理员批准，然后为这个端口添加规则，限定在专用和域配置文件以及本地子网上。这期间写着“正在应用…”，然后是“Windows 防火墙现在允许端口 N 上的 OPC UA 连接。”或者把状态文字当作错误报出来；批准提示被取消时，状态留在“未配置”。 | 按上面那条规则（另一台设备的浏览器按不了它）。 |

页面打开时以及配置每一次改动时，这个状态都重新读一遍；因此换了端口之后，它一直显示“未配置”，直到你把新端口放行。这条规则只管 OPC UA 那个端口；Web 仪表画面有它自己的规则，由[远程访问](remote-access)自动应用。

## 当前已连接 {#connected-now}

“服务器已接受的实时 OPC UA 会话。”，带着数量。一张表列出每一次会话：状态（一个绿色圆点，“实时”）、会话（客户端给它起的名字）、自称的客户端（客户端报出的那个应用程序或者主机）、用户（它登录时用的身份，或者匿名）和连接时间（它连上来的那个时刻）。一个都没有时：“没有 OPC UA 客户端连接。”这份列表每秒重新读一次，服务器停着的时候它是空的。

## 受信任的客户端 {#trusted-clients}

“允许在今后建立安全连接的证书。”，带着数量。每一行显示一个中性色圆点、自称的名称、“自称的应用程序身份 · 由 `<user>` 于 `<date and time>`”（没有人登录时写“在本工作站上”）、指纹，以及一个详情折叠块，里面是主体、颁发者、应用程序 URI、域名、有效期至和最近出现。一个都没有时：“没有受信任的客户端证书。”

| 命令 | 作用 | 什么时候变灰（情形） |
| --- | --- | --- |
| 导入证书（在这一组抬头上） | 打开一个文件选择框，选客户端的公开证书（`.der`、`.cer`、`.crt` 或 `.pem`，最大 64 KB），在它第一次连接之前就信任它：“`<name>` 已从 `<file>` 获得信任。请把下面的指纹与客户端报告的指纹核对。”更大的文件被拒绝：“`<file>` 比一份客户端证书大。请导入公开证书文件（.der、.cer 或 .pem），而不是压缩包。”；不是证书的文件：“`<file>` 未能导入：…”。 | 按上面那条规则。 |
| 撤销信任（在行上，危险色调） | 先问一句“要撤销对 `<name>` 的信任吗？”：“这份证书将不再受信任，正在使用它的会话都会断开。该客户端必须重新经过审核才能重新连接。”，带**撤销信任**和**保持信任**。随后这份证书被阻止，它的会话被关掉，校验器被刷新：“已撤销对 `<name>` 的信任。新会话和重连都被阻止；服务器也已请求关闭与之匹配的活动会话。” | 按上面那条规则。 |

抬头下面那句提示说明这次导入为什么存在：“已经拿到客户端的公开证书了？在这里导入它，就可以在它第一次连接之前信任它，而不必先让连接失败一次。请把导入后出现的指纹与客户端报告的指纹核对。”导入一份曾经被阻止的证书会解除那次阻止。

## 被阻止的客户端 {#blocked-clients}

一个收起着的折叠块，“被阻止的客户端”，带着数量，只有至少存在一份时才画出来。每一行显示一个红色圆点、自称的名称、“自称的应用程序身份 · 由 `<user>` 于 `<date and time>` 阻止”、指纹，以及**解除阻止**，按下去这份证书就回到待批准，而不被信任：“`<name>` 已解除阻止，并回到待审核状态。”一份被阻止的证书不会一再弹出提示，并且一直待在外面，直到你再做一次决定。

## 你怎么知道有过一次尝试 {#how-you-learn-of-an-attempt}

来自一个未知应用程序的第一次尝试，会在外壳里立起一张常驻通知卡片，“有 OPC UA 客户端等待批准”（或者“有 N 个 OPC UA 客户端等待批准”），写出最近那份证书的名字和它指纹的头几个字符，并带一个**审核**动作，按下去就打开这一节并停在那一行上。窗口藏起来的时候，一条 Windows 通知说“已阻止一次 OPC UA 连接尝试”，或者在这次尝试发生于添加客户端期间时说“有一份 OPC UA 证书等待你核对”。这张卡片跟着列表走：证书到来时它被顶替，没有待处理的东西时它被关掉；启动时已经有请求等着的话，会恢复一张安静的汇总卡片，不发 Windows 通知。在你信任它之前，客户端那边看到的是一个证书不受信任的错误。

## 这些决定存在哪里 {#where-the-decisions-live}

那几个库是工作站数据根目录下 `ua\pki` 里的 OPC UA 目录库（`trusted`、`pending`、`blocked`、SDK 自己那个诊断用的 `rejected`，以及放工作站自己证书的 `own`），尝试次数和各项决定在 `client-access.json` 里。一个决定先写进库，然后才被宣告，所以屏幕和实时校验器不可能互相矛盾；每一次启动这些库都会被对齐，而一次明确的阻止永远压过信任，信任又压过一个待处理的请求。它们不属于配置[备份](settings-backups)的一部分。

## 这一节不做什么 {#what-this-section-does-not-do}

任何东西都不会被自动信任，永远不会：空的库不会让接受成立，也没有与发现服务器的集成。这张卡片不给客户端制作证书，不会在不撤销一份证书的前提下断开某一个会话，不发放按客户端的权限（一个受信任的应用程序拥有的权限就是认证方式给它的那些），也不管工作站拨号连接的那些现场设备的证书，那些在[现场设备访问](driver-opc-ua#equipment-access)上。
