# Einführung

> Konzept: Die Konzepte, die jede Server-Entwicklung mit dem OPC UA .NET SDK voraussetzt: Server starten und stoppen, Adresse, Endpunkte und Sicherheit.

## Der Server

### Starten

Das passiert beim Aufruf der Methode `Start`:

1. Der Server prüft, ob eine Adresse festgelegt ist (Eigenschaft `OpcServer.Address`). Ohne Angabe verwendet der Server die Adresse `opc.tcp://localhost:4840`. Wenn alle Adressen wieder abgemeldet wurden, löst `Start` eine `InvalidOperationException` aus.
2. Der Server prüft seine Lizenz und ändert seinen Status (Eigenschaft `OpcServer.State`) auf den Wert `Starting`. Wenn sich der Server nicht im Status `Created` oder `Stopped` befindet, bleibt der Aufruf ohne Wirkung.
3. Der Server prüft seine Konfiguration auf Gültigkeit und Schlüssigkeit.
4. Anschließend versucht der Server, für jede Endpunktbeschreibung einen Host zu erstellen.
5. Danach startet der Server alle Manager, zum Beispiel die Node-Manager und den `SessionManager`.
6. Schließlich startet der Server jeden erstellten Host. Die Hosts sind für die endpunktspezifische Kommunikation mit den Clients zuständig.
7. Der Server ändert seinen Status (Eigenschaft `OpcServer.State`) auf den Wert `Started`.

### Stoppen

Das passiert beim Aufruf der Methode `Stop`:

1. Der Server ändert seinen Status (Eigenschaft `OpcServer.State`) auf den Wert `Stopping`.
2. Der Server beendet alle Manager, zum Beispiel die Node-Manager und den `SessionManager`.
3. Der Server gibt alle erworbenen Ressourcen wieder frei.
4. Der Server beendet die Hosts der Endpunktbeschreibungen.
5. Der Server ändert seinen Status (Eigenschaft `OpcServer.State`) auf den Wert `Stopped`.

Ein Server lässt sich auch aus dem Status `Suspended` heraus beenden.

### Anhalten und fortsetzen

Wenn der Server für eine Wartung vorübergehend als nicht verfügbar gelten soll, ohne dass Sie ihn beenden, rufen Sie die Methode `Suspend` auf. Der Server wechselt dann über den Status `Suspending` in den Status `Suspended` und meldet seinen Clients über den Serverstatus den Zustand `Suspended`. Seine Endpunkte bleiben dabei erreichbar. Über die Eigenschaft `OpcServer.EstimatedReturnTime` kann der Server den Clients zuvor mitteilen, wann er voraussichtlich wieder verfügbar ist. Die Eigenschaft lässt sich nur im Status `Started` setzen. Die Methode `Resume` setzt den Server über `Starting` wieder in den Status `Started`. Beide Methoden wirken nur aus dem jeweils passenden Status heraus: `Suspend` aus `Started`, `Resume` aus `Suspended`.

```csharp
// Announce the expected end of the maintenance to the clients.
server.EstimatedReturnTime = DateTime.UtcNow.AddMinutes(10);
server.Suspend();
...
server.Resume();
```

```vbnet
'Announce the expected end of the maintenance to the clients.
server.EstimatedReturnTime = DateTime.UtcNow.AddMinutes(10)
server.Suspend()
...
server.Resume()
```

### Adresse und Parameter

Damit der Server den Clients Zugang zu seinen OPC-UA-Services geben kann, legen Sie die richtigen Parameter fest. Der Server benötigt immer die Adresse, unter der er erreichbar ist (Eigenschaft `OpcServer.Address`). Die Adresse ist ein URI (= Uniform Resource Identifier) und liefert allen Clients die wesentlichen Informationen über den Server. Die Serveradresse `opc.tcp://192.168.0.80:4840` enthält zum Beispiel das Schema `opc.tcp`. Das Schema legt fest, über welches Protokoll die Daten wie ausgetauscht werden. Möglich sind `opc.tcp` und `https`. Für OPC UA Server im lokalen Netzwerk empfehlen wir `opc.tcp`. Für Server außerhalb des lokalen Netzwerks kann sich `https` anbieten. Außerdem legt die Adresse fest, dass der Server auf dem Rechner mit der IP-Adresse `192.168.0.80` läuft und auf Anfragen über den Port `4840` wartet. Das ist der Standardport für OPC UA, benutzerdefinierte Portnummern sind ebenfalls möglich. Anstelle der statischen IP-Adresse können Sie auch den DNS-Namen des Rechners verwenden, zum Beispiel `localhost` anstelle von `127.0.0.1`.

Wenn der Server keinen Endpunkt (engl. Endpoint) bereitstellen soll, dessen Policy den Sicherheitsmodus `None` hat, konfigurieren Sie mindestens eine Endpoint-Policy (Eigenschaft `OpcServer.Security.EndpointPolicies`). Möglich sind zudem die Sicherheitsmodi `Sign` und `SignAndEncrypt`. Wenn der Server dagegen einen Endpunkt mit der Policy `None` bereitstellt, kann ein Client diesen automatisch für eine einfache und schnelle Verbindung auswählen. Jeder Endpoint-Policy ordnet das SDK einen Policy-Level zu, also eine Zahl. Das SDK berechnet ihn aus dem Sicherheitsmodus und dem Sicherheitsalgorithmus und teilt ihn den Clients mit (Eigenschaft `OpcSecurityPolicy.Level`). Zuweisen lässt sich der Level nicht. Die OPC Foundation sieht vor: Je höher der Level der Policy eines Endpunkts, desto besser ist der Endpunkt. Das ist lediglich eine Richtlinie, die niemand prüft oder durchsetzt.

Wenn der Server eine Zugriffssteuerung verwenden soll, zum Beispiel über eine ACL (= Access Control List, also eine Zugriffskontrollliste), legen Sie die gültigen Identitäten seiner Benutzer fest. Das funktioniert auch im laufenden Betrieb. Die Identitäten der Benutzer lassen sich über ein Benutzername-Passwort-Paar (Klasse `OpcServerIdentity`) oder über ein Zertifikat (Klasse `OpcCertificateIdentity`) festlegen. Übergeben Sie die Identitäten dem Server über die Eigenschaften `OpcServer.Security.UserNameAcl` und `OpcServer.Security.CertificateAcl`. Damit der Server diese Zugriffskontrolllisten berücksichtigt, aktivieren Sie sie über ihre Eigenschaft `IsEnabled`. Die Zugriffskontrollliste für anonyme Benutzer (Eigenschaft `OpcServer.Security.AnonymousAcl`) ist nur so lange aktiv, wie keine andere Zugriffskontrollliste aktiv ist, es sei denn, ihre Eigenschaft `IsEnabled` ist ausdrücklich gesetzt. Wenn Sie also zum Beispiel die `UserNameAcl` aktivieren, schalten Sie damit den anonymen Zugriff ab. Weitere Möglichkeiten wie Rollen und eigene Zugriffskontrolllisten beschreibt die Seite [Server absichern](https://www.traeger.de/docs/development/opcua/security/server).

### Endpunkte

Die Endpunkte ergeben sich aus dem Kreuzprodukt der Basis-Adressen des Servers und der Sicherheitsstrategien, die der Server unterstützt. Jede Basis-Adresse ergibt sich aus einem unterstützten Paar aus Schema und Port. Für den Datenaustausch lassen sich mehrere Schemen (möglich sind `opc.tcp` und `https`) auf unterschiedlichen Ports festlegen. Die so verknüpften Strategien (engl. Policies) legen das Vorgehen beim Datenaustausch fest. Jede Policy besteht aus dem Policy-Level, dem Sicherheitsmodus (engl. Security Mode) und dem Sicherheitsalgorithmus (engl. Security Algorithm) und legt damit die Art des sicheren Datenaustauschs fest.

Angenommen, der Server unterstützt zwei Sicherheitsstrategien:

- Security Policy A: Level 0, Sicherheitsmodus `None`, Sicherheitsalgorithmus `None`
- Security Policy B: Level 1, Sicherheitsmodus `Sign`, Sicherheitsalgorithmus `Basic256Sha256`

Dazu kommen drei Basis-Adressen für verschiedene Schemen:

- Basis-Adresse A: `https://mydomain.com/`
- Basis-Adresse B: `opc.tcp://192.168.0.123:4840/`
- Basis-Adresse C: `opc.tcp://192.168.0.123:12345/`

Das Kreuzprodukt ergibt daraus die folgenden Endpunktbeschreibungen:

- Endpunkt 1: Adresse `https://mydomain.com/`, Level 0, Sicherheitsmodus `None`, Sicherheitsalgorithmus `None`
- Endpunkt 2: Adresse `https://mydomain.com/`, Level 1, Sicherheitsmodus `Sign`, Sicherheitsalgorithmus `Basic256Sha256`
- Endpunkt 3: Adresse `opc.tcp://192.168.0.123:4840/`, Level 0, Sicherheitsmodus `None`, Sicherheitsalgorithmus `None`
- Endpunkt 4: Adresse `opc.tcp://192.168.0.123:4840/`, Level 1, Sicherheitsmodus `Sign`, Sicherheitsalgorithmus `Basic256Sha256`
- Endpunkt 5: Adresse `opc.tcp://192.168.0.123:12345/`, Level 0, Sicherheitsmodus `None`, Sicherheitsalgorithmus `None`
- Endpunkt 6: Adresse `opc.tcp://192.168.0.123:12345/`, Level 1, Sicherheitsmodus `Sign`, Sicherheitsalgorithmus `Basic256Sha256`

Den Adressteil des Endpunkts legt immer der Server fest, über den Konstruktor oder über die Eigenschaft `Address`. Solange keine Policy konfiguriert ist, definiert der Server einen Endpunkt mit dem Sicherheitsmodus `None`. Wenn der Server stattdessen oder zusätzlich andere Policies verwenden soll, konfigurieren Sie sie über die Eigenschaft `OpcServer.Security.EndpointPolicies`.

## Zertifikate und Sicherheit

Das SDK soll den Einstieg in OPC UA so einfach wie möglich machen. Deshalb ist die Verbindung zwischen Client und Server ohne weitere Konfiguration des Servers nicht vollständig abgesichert. Sobald Sie den finalen [Spike](https://en.wikipedia.org/wiki/Spike_%28software_development%29) implementiert und getestet haben, sollten Sie sich mit der Sicherheit befassen:

- Wie Zertifikate Client und Server ausweisen, wo sie liegen und wie die Anwendungen sie prüfen, beschreibt die Seite [Zertifikate verstehen](https://www.traeger.de/docs/development/opcua/security/certificates).
- Wie sich Benutzer anmelden und welche Rechte sie erhalten, beschreibt die Seite [Benutzer und Rollen](https://www.traeger.de/docs/development/opcua/security/users-roles).
- Alle Einstellungen für den Produktivbetrieb und eine Checkliste enthält der Abschnitt [Härtung für den Produktivbetrieb](https://www.traeger.de/docs/development/opcua/security/server#hartung-fur-den-produktivbetrieb).
