# OPC UA

> Ein OPC UA-Client für fremde Server, mit Vertrauen über Zertifikate, Adressierung über Node-IDs und Gerätesuche im Adressraum.

Der Treiber OPC UA ist ein **Client** für fremde OPC UA-Server, also Steuerungen, Gateways,
Archivsysteme und andere Leitsysteme, über `opc.tcp`. Er ist das ausgehende Gegenstück zum
eingebetteten OPC UA-Server, der den eigenen Adressraum dieser Station veröffentlicht
(beschrieben unter [OPC UA-Server](connector-opcua-server)); beide teilen sich die
Anwendungsidentität der Station, vertrauen ihren Gegenstellen aber unabhängig voneinander.

## Gerät {#device}

| Feld | Bedeutung | Standard |
| --- | --- | --- |
| **Hostadresse** | DNS-Name, IPv4- oder IPv6-Adresse des Servers. Eine Endpunkt-URL kann so eingefügt werden, wie ein OPC UA-Client sie zeigt (`opc.tcp://192.168.0.10:4841/UA/Server`): `opc.tcp://` entfällt, der Port geht in das Portfeld und der Pfad in den Ressourcenpfad. Eine Adresse eines anderen Protokolls wird abgelehnt, mit dem Grund unter dem Feld. | leer: Das Gerät wird erst verbunden, wenn einer eingetragen ist |
| **Port** | TCP-Port des Endpunkts, 1 bis 65535. Ein leeres Feld zeigt 4840 grau, und das Gerät wird über diesen Port angewählt; ein mit 0 gespeichertes Gerät liest sich genauso. | 4840 |
| **Ressourcenpfad** | Der Pfad des Endpunkts, den manche Server nach Host und Port verlangen, was `opc.tcp://host:port/path` ergibt. Leer lassen, wenn der Server an der Wurzel antwortet. | leer |
| **Sitzungssicherheit** | Aus wird die Sitzung signiert und verschlüsselt, und eine Anlage, die nichts Besseres anbietet, wird abgewiesen. **Sitzung ohne Sicherheit zulassen** öffnet sie trotzdem, unverschlüsselt, für eine Anlage, die keinen sicheren Endpunkt anbietet. | aus |
| **Benutzername** / **Passwort** | Die Benutzeridentität der Sitzung. Ein leerer Benutzername bedeutet eine anonyme Sitzung. Das Passwort ist im Ruhezustand mit der Windows-DPAPI je Benutzer geschützt und lässt sich nur auf dem Rechner und im Windows-Konto lesen, in dem es eingegeben wurde. | anonym |
| **Abfrageintervall (ms)** | Standardtakt des zyklischen Lesens für Tags, die ihn nicht selbst festlegen. | 1000 |

## Server vorbereiten {#prepare-the-server}

Die meisten OPC UA-Server weisen einen neuen Client ab Werk ab, wegen zweier eigener
Einstellungen, die beide am Server vorgenommen werden:

| Einstellung am Server | Was sie verlangt | Ohne sie |
| --- | --- | --- |
| Vertrauen in das Zertifikat dieser Station | Der Server vertraut dem Anwendungszertifikat, das diese Station vorlegt, demselben, das der eingebettete [OPC UA-Server](connector-opcua-server) vorlegt. Die Station bewahrt es als Datei `.der` in ihrem Datenstamm auf, unter `ua\pki\own\certs`. | Der Server weist den sicheren Kanal ab (`BadSecurityChecksFailed` oder `BadCertificateUntrusted`) oder schließt ihn während des Handshakes, und es öffnet sich keine Sitzung. |
| Ein Benutzer, den er annimmt | Anonymer Zugriff am Server erlaubt, oder ein **Benutzername** und ein **Passwort** am Gerät, die der Server kennt. | Der Server weist die Sitzung ab (`BadIdentityTokenRejected`, `BadIdentityTokenInvalid` oder `BadUserAccessDenied`). |

Wo gängige Server dem Zertifikat eines Clients vertrauen:

| Server | Wo |
| --- | --- |
| Ein Server, der abgewiesene Zertifikate in Ordnern ablegt, wie das SDK der OPC Foundation und viele darauf aufbauende Server | Das abgewiesene Zertifikat wartet in seinem Ordner `rejected`: Verschieben Sie es nach `trusted/certs`, oder kopieren Sie die Datei der Station dorthin. |
| KEPServerEX | Klicken Sie mit der rechten Maustaste auf das Symbol **Administration** im Infobereich und wählen Sie **OPC UA Configuration**; wählen Sie auf der Registerkarte Trusted Clients das Zertifikat und klicken Sie auf Trust, oder klicken Sie auf **Import...** und wählen Sie die Datei; danach **Reinitialize** über dasselbe Symbol. |
| Siemens S7-1500, in TIA Portal | Importieren Sie die Datei unter **Global security settings > Certificate manager**, Registerkarte **Device certificates**; fügen Sie sie in den Properties der CPU unter **OPC UA > Server > Security > Secure Channel** mit `<Add new>` der Liste Trusted clients hinzu; laden Sie dann in die CPU. |

Weist der Server aus einem der beiden Gründe ab, sagt die Seite des Geräts welchen, in
einem Hinweis, der an der Stelle des Status des Servers steht. Für das Zertifikat nennt
er dessen Namen und Fingerabdruck (SHA-1, den, unter dem Server es führen), jeweils mit
einer Schaltfläche zum Kopieren, und die Datei mit einer Schaltfläche, die ihren Ordner
öffnet. Für den Benutzer sagt er, ob der Server keine anonyme Sitzung annimmt oder den
Benutzer abgewiesen hat, und verweist auf **Benutzername** und **Passwort** des Geräts.
Der Hinweis verschwindet von selbst, sobald sich eine Sitzung öffnet, und das Journal und
der Agent lesen dieselbe Anweisung. Diese Station stellt ein neues Zertifikat aus, wenn
sich ihr Anwendungsname oder Netzwerkname ändert, und der Server muss dann dem neuen
vertrauen.

## Sicherheit und Zertifikate {#security-and-certificates}

Das Verbinden beginnt mit der Endpunktliste des Servers: Der Client wählt den **sichersten
Endpunkt, den der Server anbietet**, und weist die Anwendung mit dem eigenen Zertifikat
dieser Station aus, derselben OPC UA-Anwendungsidentität, die auch der eingebettete Server
verwendet. Viele Server verlangen, dass dieses Zertifikat auf ihrer Seite als
vertrauenswürdig gilt, bevor sie die Sitzung annehmen: Wo, sagt
[Server vorbereiten](#prepare-the-server).

Eine Anlage, die nichts Besseres als einen **ungesicherten Endpunkt** anbietet, wird
abgewiesen, und das Gerät sagt, warum. Diese Sitzung würde die Messwerte und die Anmeldung
unverschlüsselt übertragen und keine Identität der Anlage belegen, deshalb öffnet sie nur
dort, wo Sie sie an diesem Gerät verlangt haben: **Sitzungssicherheit**, **Sitzung ohne
Sicherheit zulassen**, auf der Verbindungskarte. Die Wahl gehört zu diesem einen Gerät,
reist in seiner Adresse als `?security=none` und gilt für die lesende Sitzung wie für das
Durchsuchen der Gerätesuche. Sie einzuschalten stuft eine Anlage, die Sicherheit anbietet,
nie herab: Genommen wird weiterhin der sicherste angebotene Endpunkt.

In der anderen Richtung ist das Vertrauen **im Zweifel geschlossen und ausdrücklich**. Das
Zertifikat der Anlage wird geprüft, bevor die Sitzung geöffnet wird:

- Ein Zertifikat, das diese Station nie freigegeben hat, wird abgewiesen, zur Prüfung
  aufgezeichnet, und der Bereich des Geräts zeigt einen Hinweis, der die Freigabe nennt,
  auf die er wartet: Das Gerät ist nicht "offline", es wartet auf eine Entscheidung.
- Sie prüfen Zertifikate auf der Karte [Anlagenzugriff](#equipment-access) dieser Seite, der ausgehenden Hälfte
  des Vertrauens über Zertifikate: Ein aufgezeichnetes Zertifikat sitzt unter **Wartet auf
  Freigabe**, bis Sie es **Freigeben** (neue Sitzungen dürfen öffnen) oder **Sperren**
  (abgewiesen, ohne immer wieder zu fragen). Das ist die Liste der Anlagen;
  **Clientzugriff** im Bereich des [OPC UA-Servers](connector-opcua-server) ist die andere Richtung, also wer eingehend zum
  eigenen Server dieser Station verbinden darf.
- **Freigabe zurücknehmen** in einer freigegebenen Zeile schließt die laufenden Sitzungen
  auf diesem Zertifikat und legt es zurück in die Prüfliste, die nächste Verbindung fragt
  Sie also erneut.
- Eine Anlage, die **gar kein Zertifikat** vorlegt, belegt nichts darüber, wer geantwortet
  hat, also gibt es nichts freizugeben und die Sitzung wird abgewiesen, mit ihrer Adresse
  im Journal. Sie verbindet nur unter demselben **Sitzung ohne Sicherheit zulassen**, das
  dann an die Stelle der Freigabe tritt.

Den Server einer Anlage freizugeben erlaubt diesem Zertifikat nie, eingehend zum eigenen
Server dieser Station zu verbinden: Die beiden Richtungen führen ihre Listen mit Absicht
getrennt.

## Verhalten der Sitzung {#session-behavior}

Tags werden **zyklisch gelesen**: Jeder Lesevorgang fragt den Server nach dem aktuellen
Wert des Knotens. Das Urteil des Servers reist mit jedem Abtastwert mit: Ein Wert, der als
Bad oder Uncertain gestempelt ist, wird abgewiesen, und das Tag liest schlechte Qualität,
eine zweifelhafte Quelle wird also nie zu einem guten Messwert weißgewaschen. Ein Knoten,
den es auf dem Server nicht mehr gibt, liest als kein Wert, statt das ganze Gerät
fehlschlagen zu lassen.

Auch der Zeitstempel des Servers kommt mit: Der SourceTimestamp, den er einem guten Wert gegeben hat, wird auf der [Seite des Tags](connector-tags#the-live-value-card) zum **Zeitstempel der Quelle**. Ein Server darf diesen Zeitstempel behalten, bis sich der Wert oder seine Qualität ändert, sodass ein gleichbleibender Wert einen früheren Zeitstempel zeigen kann als der **Zeitstempel der Anwendung**, der immer der Zeitpunkt ist, zu dem die Station den Messwert empfangen hat.

Die Sitzung wird mit Keep-Alive-Nachrichten überwacht; nach drei ausgebliebenen
Keep-Alive-Nachrichten beginnt der Client, sich automatisch neu zu verbinden, und macht
weiter. Die Wiederholschleife der Anwendung im Hintergrund besitzt die erste Verbindung,
ein nicht erreichbarer Server kostet beim Start also nichts.

## Adressierung der Tags {#tag-addressing}

Ein Tag wird über seine **Node-ID** adressiert, als Freitext eingetippt und wortgetreu
gesendet. Angenommen werden die üblichen Schreibweisen von OPC UA:

| Beispiel | Bedeutung |
| --- | --- |
| `ns=2;s=Temperature` | Zeichenkette als Bezeichner im Namensraum mit Index 2 |
| `ns=2;g=5f2c7a1e-8b3d-4c9a-9e61-2d4b7f0a3c58` | GUID als Bezeichner im Namensraum mit Index 2 |
| `ns=3;i=1042` | Numerischer Bezeichner im Namensraum mit Index 3 |
| `nsu=urn:vendor:app;s=Line1.Speed` | Ausgeschriebene Form, die den Namensraum über seine URI statt über den Index nennt, robust gegen Indexwechsel über Neustarts hinweg |

Das Tag liest und schreibt das Attribut **Value** des Knotens.

### Werttypen {#value-types}

| Angebotene Typen |
| --- |
| Boolean, Byte, Int16, Int32, Int64, Float, Double und String |

Werte sind **nur Skalare**: Felder, Strukturen und andere zusammengesetzte Werte werden als
unlesbar abgewiesen, statt zu einer irreführenden Zahl plattgedrückt zu werden, und das Tag
liest schlechte Qualität. Ein solches Tag scheitert für sich allein; die übrigen Tags des
Geräts lesen weiter, und deswegen wird nichts neu verbunden. Eine leere Zeichenkette ist
ein Wert, kein Fehlschlag. Typen außerhalb der angebotenen Menge gibt es bei diesem Treiber
nicht als Typ eines Tags: SByte, die vorzeichenlosen Breiten außer Byte (UInt16, UInt32,
UInt64), DateTime, Guid und ByteString.

Ein Tag, dessen Typ vom Typ des Knotens abweicht, wird über seine Zahl umgerechnet und nie über
seine Bytes neu gelesen, und dieselbe Regel gilt beim Lesen und beim Schreiben. Eine
Gleitkommazahl geht in eine Gleitkommazahl (Float und Double), eine ganze Zahl in eine ganze
Zahl anderer Breite, wenn der Wert hineinpasst; ein Boolean-Tag über einem ganzzahligen Knoten
liest 0 und 1 als aus und ein und schreibt sie als 0 und 1. Ein Wert, der nicht passt, oder ein
Knoten, der eine andere Art von Wert hält (eine Gleitkommazahl für ein ganzzahliges Tag, eine
Zahl für ein Text-Tag), wird nur an diesem einen Punkt abgewiesen, und ein so abgewiesener
Schreibvorgang wird nie an den Server geschickt.

Ein Suchlauf über einen Server bietet deshalb weniger Kanäle an, als der Server hält: Ein
Knoten, der eine Liste von Werten erklärt oder beim Lesen durch den Suchlauf eine hält, und ein
Knoten, dessen Typ außerhalb der angebotenen Menge liegt, bleiben außen vor. Viele Server
lassen die erklärte Form einer Variablen offen (ein ValueRank von Any oder
ScalarOrOneDimension), auch wo sie immer nur einen Wert hält; ein solcher Knoten wird daher
nach dem Wert beurteilt, den er beim Lesen durch den Suchlauf hält, und angeboten, sofern
dieser Wert keine Liste ist. Hält er später eine Liste, scheitert dieses eine Tag an seinen
eigenen Lesevorgängen, wie bei jedem Wert, den ein Tag nicht halten kann, und die übrigen Tags
des Geräts lesen weiter. Der Typ eines Knotens ist der Grundtyp, von dem
sein erklärter Typ abgeleitet ist: Ein als VersionTime erklärter Knoten hält einen UInt32
und ein als UtcTime erklärter eine DateTime, beide bleiben also außen vor, während ein als
Duration erklärter Knoten einen Double hält und angeboten wird. Server, die die Form offen
lassen, lassen oft auch den erklärten Typ offen (BaseDataType oder Number, Integer oder
UInteger, Typen, als die kein Wert übertragen wird); ein solcher Knoten übernimmt daher den
Typ des Werts, den er beim Lesen durch den Suchlauf hält, und wird nach diesem Typ angeboten
oder bleibt außen vor. Ein solcher Knoten, dessen Lesen keinen Wert zurückbringt, zeigt
keinen Typ und bleibt außen vor. Schickt der Server später einen Wert eines anderen Typs,
wird dieser Wert nach der Umrechnungsregel oben gelesen, und dieses eine Tag scheitert nur
dort, wo die Regel ihn abweist.
Sie fallen aber nicht stillschweigend weg. Der
Suchlauf zählt sie, und seine Abschlussmeldung sagt, wie viele und welcher Art, zum
Beispiel "5 Kanäle blieben außen vor: 3 vom Typ UInt32, 2, die eine Liste von Werten
statt eines Werts halten.", eine kurze Liste liest sich also als kurze Liste und nicht als
nackte Steuerung.

Ein Knoten, den der Server ganz ohne Wert beantwortet, bleibt ebenfalls außen vor und wird
nicht gezählt: Er hält nichts, und importiert würde er nie lesen. Ein Knoten, dessen Wert
als Bad zurückkommt, wird trotzdem angeboten, es sei denn, er erklärt eine Liste, oder er
erklärt einen offenen Typ und bringt keinen Wert zurück, dem ein Typ zu entnehmen wäre: Dieser Status sagt nur, dass seine Quelle
noch nicht geantwortet hat oder dass die anonyme Sitzung des Suchlaufs ihn nicht lesen
darf, und das Gerät meldet sich mit seinen eigenen Zugangsdaten an.

## Schreiben {#writes}

Ein schreibbares Tag schreibt das Attribut Value des Knotens über den Dienst Write von OPC
UA. Die Antwort des Servers ist das Urteil: Ein abgelehnter Schreibvorgang zeigt sich als
Fehlschlag, und der zwischengespeicherte Wert rückt nur bei Annahme nach. Wie überall nimmt
das Schreibfeld den technischen Wert, und die [Wertkette](connector-value-pipeline) wird
rückwärts durchlaufen, bevor der Rohwert gesendet wird.

## Gerätesuche {#discovery}

Der Befehl **Geräte suchen** nimmt ein Ziel im Feld daneben: die Adresse eines OPC UA-Servers wie
`opc.tcp://plc-host:4840`. Der Suchlauf hat zwei Stufen, und die Fortschrittszeile nennt
die laufende:

1. **Endpunkte**: Der Standarddienst zur Suche am Ziel wird abgefragt, und jede angebotene
   Such-URL wird zu einem Kandidaten für einen Endpunkt. Eigene Ports und Serverpfade
   wandern unverändert in die Verbindungsfelder des Kandidaten.
2. **Kanäle**: Der Adressraum jedes Kandidaten wird vom Ordner Objects abwärts durchsucht,
   und jede lesbare Variable wird als Kandidat für ein Tag aufgeführt, mit ihrem Typ und
   ihrem Zugriff, außer den Knoten, die nach [Werttypen](#value-types) außen vor bleiben.
   Die Diagnosebereiche des Servers werden übersprungen.

Ein Kandidat für ein Tag heißt nach dem Namen seines eigenen Knotens (dessen BrowseName),
mit so wenigen Namen der darüberliegenden Knoten davor, wie nötig sind, um ihn von den
anderen Kanälen des Servers zu unterscheiden: `Level` statt
`Devices.Simulated.Tank.Level` auf dem Server einer anderen Station,
und `Line1.Speed` neben `Line2.Speed` nur dort, wo sich zwei Knoten namens Speed begegnen
würden. Zwei Namen, die sich dann noch gleich lesen und sich nur in Groß- und
Kleinschreibung oder Satzzeichen unterscheiden, werden durch eine Nummer auseinandergehalten.
Der ganze Pfad des Durchsuchens bleibt auf der Karte des Kandidaten, in einer zweiten Zeile
unter dem Namen, damit Sie sehen, welchen Knoten jedes Tag liest. Das Tag liest seine
Node-ID, der Name ist also nur, wie es heißt: in der Tabelle der Tags und am Ende seiner
Adresse (`Connector.OpcUa.Peer.Level`).

Das Durchsuchen meldet sich anonym an (mit derselben Wahl des sichersten Endpunkts,
derselben Abweisung einer ungesicherten Sitzung und demselben Tor über das Zertifikat der
Anlage). Ein Server, der anonyme Sitzungen ablehnt, ein Server, der keinen sicheren
Endpunkt anbietet, oder ein Durchsuchen, das aus irgendeinem Grund fehlschlägt, lässt den
Endpunkt trotzdem mit null Tags hinzufügbar: Fügen Sie ihn hinzu, hinterlegen Sie die
Anmeldedaten und die Sitzungssicherheit am Gerät und richten Sie die Tags von Hand ein. Nichts wird gespeichert, bevor Sie einen Kandidaten
**Hinzufügen**, und ein Abbruch behält die Kandidaten, die bereits vollständig waren.

Ein Server, den Sie schon haben, liest weitere seiner Knoten von der eigenen Seite seines Geräts aus: **Tags suchen** im Kopf der Karte der Tags durchsucht den Endpunkt dieses Geräts, angemeldet wie die eigene Sitzung des Geräts, mit seinem Benutzernamen, seinem Passwort und seiner Sitzungssicherheit, sodass dort auch ein Server, der anonyme Sitzungen ablehnt, seine Knoten zeigt. Angeboten werden nur die Knoten, die noch kein Tag des Geräts liest, verglichen über die Namensraumtabelle des Servers: Ein Tag, das mit dem Index seines Namensraums geschrieben ist (`ns=2;s=Level`), liest den Knoten, den das Durchsuchen mit dem URI seines Namensraums nennt (`nsu=…;s=Level`), daher wird dieser Knoten nicht noch einmal angeboten. Ein Server, der die Sitzung ablehnt, beendet den Suchlauf mit der Ursache, die die eigene Sitzung des Geräts nennt (siehe [Die Tags eines Geräts suchen](connector-discovery#discovering-a-devices-tags)).

## Grenzen, die man kennen sollte {#limits-worth-knowing}

- Lesevorgänge sind zyklische Abfragen des Attributs Value; der Treiber legt auf dem
  fremden Server keine Abonnements an.
- Nur skalare Werte: Ein Tag kann weder ein Element eines Feldes noch ein Feld einer
  Struktur adressieren.
- Das Tor der Freigabe gilt je Zertifikat: Eine Anlage, die ihr Zertifikat wechselt, kehrt
  in die Prüfliste zurück und wartet auf eine neue Entscheidung.

## Anlagenzugriff {#equipment-access}

Die Seite des OPC UA-Treibers endet mit ihrer Karte **Anlagenzugriff**: der ausgehenden Hälfte des Vertrauens in Zertifikate. Wenn der Connector einen OPC UA-Server einer Anlage anwählt, weist sich dieser Server mit einem Zertifikat aus, und die Station liest nichts von einer Anlage, deren Zertifikat Sie nicht freigegeben haben. Der Kopf der Karte sagt es: "Wenn der Connector einen OPC UA-Server einer Anlage anwählt, weist sich dieser Server mit einem Zertifikat aus. Geben Sie nur einen Fingerabdruck frei, den Sie mit derjenigen Person geprüft haben, die die Anlage in Betrieb genommen hat." Connector anzeigen liest die Karte; Connector konfigurieren entscheidet, und entschieden wird auf dem Desktop der Station selbst.

Der Grundsatz unter dem Kopf: "Von einer Anlage, die Sie nicht freigegeben haben, wird nichts gelesen. Ein Gerät, dessen Zertifikat hier wartet, bleibt still und sagt das im Connector. Es freizugeben startet das Lesen; die Freigabe zurückzunehmen schließt die Sitzung und fragt Sie erneut. Namen in Zertifikaten sind eine Behauptung der Anlage; der SHA-256-Fingerabdruck ist die Identität, die zu prüfen ist."

Die Karte hat bewusst dieselbe Form wie [Client-Zugriff](connector-opcua-client-access), mit denselben Worten überall dort, wo der Gedanke derselbe ist, und mit derselben Regel dafür, wer entscheiden darf: ein Browser auf einem anderen Gerät sieht "Der Anlagenzugriff lässt sich nur in der Desktop-Anwendung an der Station ändern." und den Hinweis "Öffnen Sie die Desktop-Anwendung, um den Anlagenzugriff zu ändern"; einer Rolle ohne Connector konfigurieren werden die Schaltflächen nicht gezeichnet, und eine laufende Einheit und eine bereits laufende Änderung lehnen jeweils mit ihrem eigenen Satz ab. Jedes Ergebnis landet in der Statusleiste.

### Was ein wartendes Gerät im Connector tut {#what-a-waiting-device-does-in-the-connector}

Beim ersten Anwählen eines OPC UA-Geräts durch den Connector wird das Zertifikat der Anlage abgewiesen, hier als wartend aufgezeichnet, und das Gerät liest nichts. Auf der [Seite des Geräts](connector-devices) zeigt der Connector einen Hinweis in Vorsichtsfarbe, **Wartet auf Freigabe des Zertifikats**, mit einer Schaltfläche **Zertifikat prüfen**, die diesen Abschnitt auf der Zeile des Geräts öffnet, und der Zustand des Geräts nennt denselben Stand im Baum. Der eigene Fehlschlag des Treibers nennt den Grund statt eines namenlosen Fehlers beim Handschlag: "Das Zertifikat dieser Anlage (die ersten 16 Zeichen des Fingerabdrucks) wartet unter Anlagenzugriff auf der Seite des OPC UA-Treibers auf Ihre Freigabe. Das Lesen beginnt, sobald Sie es freigeben." Ein gesperrtes liest "…ist an dieser Station gesperrt. Prüfen Sie es unter Anlagenzugriff auf der Seite des OPC UA-Treibers." Das Durchsuchen bei der Gerätesuche geht durch dasselbe Tor, bevor seine Sitzung öffnet.

Nach der Freigabe beginnt der Connector beim nächsten Versuch zu lesen. Eine Anlage, die gelesen hat und unter derselben Adresse plötzlich ein anderes Zertifikat vorlegt, wird nicht mehr gelesen und löst eine haftende Karte aus, "Zertifikat geändert: `<Name>`": "Die Anlage unter `<Adresse>` hat mit einem Zertifikat gelesen, das diese Station freigegeben hat, und legt nun ein anderes vor (…), deshalb wird nichts von ihr gelesen. Prüfen Sie den Fingerabdruck mit dem, der die Anlage betreut, und geben Sie ihn dann frei.", mit **Prüfen**, dazu eine Windows-Benachrichtigung bei verborgenem Fenster. Ein Gerät, das gerade eingerichtet wird, wird nicht auf diese Weise angesagt: wer es einrichtet, schaut ohnehin auf den Connector.

### Wartet auf Freigabe {#waiting-for-approval}

Gezeichnet, solange mindestens ein Zertifikat wartet, mit der Überschrift "Diese Geräte bleiben ungelesen, bis Sie entscheiden." und der Anzahl. Jede Zeile zeigt einen bernsteinfarbenen Punkt, den Namen, den das Zertifikat behauptet, "Behauptete Identität der Anlage", den Fingerabdruck, "`<Adresse>` · Letzter Versuch `<Datum und Uhrzeit>` · N Verbindungsversuche" und eine Aufklappung **Einzelheiten des Zertifikats** mit Betreff, Aussteller, Anwendungs-URI, Domänennamen, Gültig ab, Gültig bis und Zuerst gesehen. Die Zeile, auf die eine Schaltfläche Prüfen geführt hat, ist mit "Zur Prüfung ausgewählt" markiert und in den Blick gescrollt.

| Befehl | Was er tut | Ausgegraut, wenn (Situation) |
| --- | --- | --- |
| Freigeben | Verschiebt das Zertifikat zu Freigegebene Anlagen und frischt den lebenden Prüfer auf: "`<Name>` ist freigegeben. Der Connector beginnt beim nächsten Versuch zu lesen." | Nach der Regel oben. |
| Sperren | Verschiebt es zu Gesperrte Anlagen und weist es weiterhin ab: "`<Name>` ist gesperrt. Die Station wird dieses Zertifikat weiterhin ablehnen." | Nach der Regel oben. |
| Alle wartenden Zertifikate verwerfen (im Kopf der Gruppe) | Fragt "Das Zertifikat verwerfen, das auf Prüfung wartet?" oder "Die N Zertifikate verwerfen, die auf Prüfung warten?" ("Damit wird nichts freigegeben und nichts gesperrt: Die Anfragen werden entfernt, und die Liste hat wieder Platz. Eine Anlage, die der Connector danach anwählt, erscheint hier als neue Anfrage."), mit **Verwerfen** und **Die Liste behalten**. | Nach der Regel oben. |

Die Liste hält höchstens 100 Zertifikate. Solange sie voll ist, bleibt ein weiteres Zertifikat abgewiesen, wird aber nicht aufbewahrt, und die Karte sagt das: "Die Prüfliste unten ist voll. Solange das so ist, wird ein neues Zertifikat abgelehnt, ohne hier aufgenommen zu werden, deshalb erscheint die Anlage, auf die Sie warten, womöglich nie. Verwerfen Sie die Zertifikate, die auf Prüfung warten, um Platz zu schaffen.", mit der Anzahl der Abweisungen, seit sie voll ist, sobald es welche gibt. Jede solche Abweisung wird ins Journal geschrieben.

### Freigegebene Anlagen {#approved-equipment}

"Zertifikate, mit denen der Connector Sitzungen öffnen darf.", mit der Anzahl. Jede Zeile zeigt einen neutralen Punkt, den behaupteten Namen, "Behauptete Identität der Anlage · Freigegeben von `<Benutzer>` am `<Datum und Uhrzeit>`" (oder "an dieser Station"), den Fingerabdruck und eine Aufklappung mit Adresse, Betreff, Aussteller, Anwendungs-URI, Gültig bis und Zuletzt gesehen. Gibt es keine: "Kein Anlagenzertifikat freigegeben."

| Befehl | Was er tut | Ausgegraut, wenn (Situation) |
| --- | --- | --- |
| Zertifikat einspielen (im Kopf der Gruppe) | Öffnet einen Dateidialog für das öffentliche Zertifikat der Anlage (`.der`, `.cer`, `.crt` oder `.pem`, bis 64 KB) und gibt es vor der ersten Verbindung frei: "`<Name>` ist aus `<Datei>` freigegeben. Prüfen Sie den Fingerabdruck unten gegen den in der Dokumentation der Anlage." Eine größere Datei: "`<Datei>` ist größer als ein Anlagenzertifikat. Importieren Sie die Datei mit dem öffentlichen Zertifikat (.der, .cer oder .pem), kein Archiv." | Nach der Regel oben. |
| Freigabe zurücknehmen (auf der Zeile, in der Warnfarbe) | Fragt "Die Freigabe für `<Name>` zurücknehmen?": "Die laufende Sitzung mit dieser Anlage wird geschlossen, und die Station hört auf, aus ihr zu lesen. Das Zertifikat kehrt in die Prüfliste zurück, deshalb fragt die nächste Verbindung Sie erneut.", mit **Zurücknehmen** und **Freigabe behalten**. Danach: "Die Freigabe für `<Name>` wurde zurückgenommen. Ihre Sitzung wurde geschlossen, und sie wartet wieder auf Prüfung." | Nach der Regel oben. |

Der Hinweis unter dem Kopf: "Haben Sie das öffentliche Zertifikat der Anlage schon? Importieren Sie es hier, um es vor der ersten Verbindung freizugeben, statt die Verbindung einmal scheitern zu lassen. Prüfen Sie den Fingerabdruck, den es hinzufügt, gegen den in der Dokumentation der Anlage." Eine Anlage bringt ihr Zertifikat meist mit, deshalb steht auf dieser Seite das Einspielen zuerst. Ein gesperrtes Zertifikat einzuspielen hebt die Sperre auf. Das Zurücknehmen schickt das Zertifikat zurück in die Prüfung, nicht in eine Sperre: Sie haben darum gebeten, erneut gefragt zu werden.

### Gesperrte Anlagen {#blocked-equipment}

Eine zugeklappte Aufklappung, "Gesperrte Anlagen" mit der Anzahl, nur gezeichnet, solange es mindestens eine gibt. Jede Zeile zeigt einen roten Punkt, den behaupteten Namen, "Behauptete Identität der Anlage · Gesperrt von `<Benutzer>` am `<Datum und Uhrzeit>`", den Fingerabdruck und **Entsperren**, was sie ohne Freigabe in die Prüfliste zurückgibt: "`<Name>` ist entsperrt und steht wieder in der Prüfliste." Ein gesperrtes Zertifikat kehrt nie von selbst zurück.

### Wo die Entscheidungen wohnen {#where-the-decisions-live}

Die Speicher der Anlagen sitzen unter `ua\pki\southbound` in der Datenwurzel der Station (`pending`, `trusted`, `blocked` und das `rejected` des SDK), mit der Adresse, unter der jedes Zertifikat gesehen wurde, den Zählungen der Versuche und den Entscheidungen in `equipment-access.json`. Sie sind von den eingehenden Speichern getrennt, ein Zertifikat einer Anlage kann also nie zur Erlaubnis für eine Anwendung werden, sich mit dem eigenen Server der Station zu verbinden, und nie als eingehende Anfrage erscheinen. Sie sind nicht Teil einer [Sicherung](settings-backups) der Konfiguration.

### Was dieser Abschnitt nicht tut {#what-this-section-does-not-do}

Nichts wird automatisch freigegeben, und keine Einstellung schaltet das ab. Die Karte richtet das Gerät selbst nicht ein (Adresse, Zugangsdaten und das zyklische Lesen stehen im [Connector](connector-devices)), zeigt die lebenden Werte der Anlage nicht und entscheidet nicht über Anwendungen, die diese Station anwählen, was der [Client-Zugriff](connector-opcua-client-access) ist.
