mirror of
https://github.com/OPCFoundation/UA-.NETStandard.git
synced 2026-10-28 22:55:49 +08:00
# Description This PR fixes bounded ManagedSession reconnect cleanup and reorganizes the sample applications into domain-focused folders. ## Reconnect cleanup - Bounds reconnect integration cleanup with independent 30-second close and dispose limits. - Sends `CloseSession` through the awaited transport request path during `Session.DisposeAsync`. - Preserves explicit `Session.CloseAsync` behavior that waits for or cancels outstanding publish requests. - Covers the disposal request path with a regression test. ## Sample organization - `samples/OpenUsd`: `GeneratorServer`, `SiteCompositionServer` - `samples/Redundancy`: `RedundantClient`, `RedundantServer`, `RedundantPubSub` - `samples/Isa95`: `MinimalIsa95Server` - `samples/MinimalApi`: `MinimalBoilerServer`, `MinimalCalcServer`, `MinimalClient` - `samples/DI`: `PumpDeviceIntegrationServer` - `samples/Lds`: `ConsoleLdsServer` - `samples/Reference`: `ConsoleReferenceClient`, `ConsoleReferenceServer` - `samples/PubSub`: `ConsoleReferencePubSubClient` `UA.slnx` now exposes the same requested domain groups. Project references, tests, runtime sample probes, CI workflows, Dockerfiles, Compose files, helper scripts, and documentation were updated to the new paths. `samples/Robotics/MinimalRobotServer` remains under `Robotics`. ## Validation - `dotnet build UA.slnx` - 3 Redundancy short-haul sample tests - 70 DI sample tests - 914 OpenUSD tests - 1 WotCon model-materialization test - 137 AOT tests - `docker compose config` for all 6 moved Redundancy Compose files ## Related Issues - Fixes #4273 ## Checklist - [ ] I have signed the [CLA](https://opcfoundation.org/license/cla/ContributorLicenseAgreementv1.0.pdf) and read the [CONTRIBUTING](https://github.com/OPCFoundation/UA-.NETStandard/blob/master/CONTRIBUTING.md) doc. - [x] I have added tests that prove my fix is effective or that my feature works and increased code coverage. - [x] I have added all necessary documentation. - [x] I have verified that my changes do not introduce new build or analyzer warnings. - [x] I built the complete `UA.slnx` solution locally. - [ ] I ran all tests locally against at least .NET Framework and .NET 10. - [ ] I fixed all failing and flaky tests in the CI pipelines and all CodeQL warnings. - [x] I have addressed all PR feedback received. --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: marcschier <11168470+marcschier@users.noreply.github.com> Co-authored-by: Marc Schier <mschier@microsoft.com> Co-authored-by: Marc Schier <marcschier@users.noreply.github.com> Copilot-Session: a2c2838f-74ae-4997-a1d4-50574d9e0636
573 lines
31 KiB
Markdown
573 lines
31 KiB
Markdown
# OPC UA Profiles and Facets Support
|
|
|
|
This document describes which [OPC UA Profiles and Facets](https://profiles.opcfoundation.org/) are implemented in the OPC UA .NET Standard Stack, and where in the codebase / documentation each one lives.
|
|
|
|
## Overview
|
|
|
|
The OPC UA .NET Standard Stack is a reference implementation that targets
|
|
**OPC UA specification version 1.05.07**. The stack has been certified for
|
|
compliance through an OPC Foundation Certification Test Lab and is
|
|
continuously tested for compliance using the latest Compliance Test Tool (CTT).
|
|
|
|
Version 2.0 substantially extends companion-spec coverage over the
|
|
previous 1.5.378 version. The stack now
|
|
ships full server- and client-side support for: Part 9 (Alarms &
|
|
Conditions), Part 11 (Historical Access) + Part 13 (Aggregates), Part 16
|
|
(State Machines), Part 17 (Alias Names), Part 18 (Role Management), Part 20
|
|
(File Transfer), Part 100 (Device Integration / Software Update), OPC 30270 /
|
|
OPC UA for Asset Administration Shell V2 plus the AAS V3 draft, OPC 10100-1
|
|
(WoT Connectivity), OPC 40001-1 (Industrial Automation), OPC 40010-1
|
|
(Robotics), and the Local Discovery Server. See
|
|
[What's New in 2.0](WhatsNewIn2.0.md) for the broader change narrative.
|
|
|
|
The canonical list of all OPC UA profile and facet URIs is maintained by the
|
|
OPC Foundation at <https://profiles.opcfoundation.org/>. Where this document
|
|
hyperlinks a URI, that URI is the same string the reference server
|
|
advertises in `ServerProfileArray`; URIs not yet present in a shipping
|
|
config are referred to *by name* and the reader should consult the OPC
|
|
Foundation registry for the canonical URI form.
|
|
|
|
## Server Profiles
|
|
|
|
The reference server (`samples/Reference/ConsoleReferenceServer`) advertises the
|
|
following profiles in its `ServerProfileArray`:
|
|
|
|
### Core Server Profiles
|
|
|
|
- **[Standard UA Server Profile (2017)](http://opcfoundation.org/UA-Profile/Server/StandardUA2017)** — The core OPC UA Server profile that includes:
|
|
- Basic server capabilities
|
|
- Discovery services
|
|
- Session management
|
|
- Subscription management
|
|
- MonitoredItem services
|
|
- View services (Browse, BrowseNext, TranslateBrowsePathsToNodeIds)
|
|
- Attribute services (Read, Write, HistoryRead, HistoryUpdate)
|
|
- Query services
|
|
|
|
### Functional Facets
|
|
|
|
- **[Data Access Server Facet](http://opcfoundation.org/UA-Profile/Server/DataAccess)** — Variables, data types, and data-change notifications.
|
|
- **[Method Server Facet](http://opcfoundation.org/UA-Profile/Server/Methods)** — Method calls on objects in the address space.
|
|
- **[Reverse Connect Facet](http://opcfoundation.org/UA-Profile/Server/ReverseConnect)** — Server-initiated connections to a client (see [Reverse Connect documentation](ReverseConnect.md)).
|
|
- **[Client Redundancy Facet](http://opcfoundation.org/UA-Profile/Server/ClientRedundancy)** — Subscription transfer between sessions/servers; see [Transfer Subscriptions](TransferSubscription.md).
|
|
- **[Historical Raw Data Server Facet (2022)](http://opcfoundation.org/UA-Profile/Server/HistoricalRawData2022)** — Historical read (and insert/replace/update/delete) of raw data values. The reference server historizes the full static scalar type set via `InMemoryHistorianProvider`; see [Historical Access](HistoricalAccess.md).
|
|
- **[Historical Aggregate Server Facet (2022)](http://opcfoundation.org/UA-Profile/Server/AggregateHistorical2022)** — Aggregate (processed) history reads computed from the raw values by `AggregateManager`; see [Aggregates](Aggregates.md).
|
|
|
|
### Local Discovery Server (LDS) Profile
|
|
|
|
The `Opc.Ua.Lds.Server` library plus the `ConsoleLdsServer` reference
|
|
application implement the Local Discovery Server. The LDS application
|
|
advertises the **[Local Discovery Server 2017 Facet](http://opcfoundation.org/UA-Profile/Server/LocalDiscovery2017)**
|
|
(see `samples/Lds/ConsoleLdsServer/Lds.Server.Config.xml`).
|
|
|
|
### Additional facets supported by the implementation (beyond the default advertised set)
|
|
|
|
Beyond the seven facets advertised by default in the reference server's
|
|
`ServerProfileArray`, the master branch implements the following facets in
|
|
the SDK. They can be enabled per-application by registering the
|
|
corresponding NodeManager and, where applicable, adding the matching URI to
|
|
`ServerProfileArray` (consult <https://profiles.opcfoundation.org/> for the
|
|
canonical URI string before claiming a facet):
|
|
|
|
- **Alarms and Conditions** (Part 9) — Full server-side implementation
|
|
with latched / silenced / out-of-service alarms, alarm groups, a
|
|
suppression engine, and rate metrics. The reference server's
|
|
`AlarmNodeManager` exposes a working sample. See
|
|
[Alarms and Conditions](AlarmsAndConditions.md).
|
|
- **State Machine** (Part 16) — `StateMachineBuilder` and the
|
|
`FluentFiniteStateMachineState` extensibility in
|
|
`src/Opc.Ua.Server/StateMachines/`. The reference server's
|
|
`BoilerStateMachineState` is an end-to-end sample. See
|
|
[State Machines](StateMachines.md).
|
|
- **File Access** (Part 20) — Server-side `FileSystemNodeManager` +
|
|
`IFileSystemProvider` in `src/Opc.Ua.Server/FileSystem/`. The
|
|
reference server enables it via the `EnableFileSystemNodeManager`
|
|
option. The matching System.IO-style client lives in
|
|
[`FileSystemClient`](FileSystemClient.md).
|
|
- **Node Management** (Part 4 service set) —
|
|
`INodeManagementAsyncNodeManager` opt-in plus a per-NodeManager
|
|
`AllowNodeManagement` gate for `AddNodes` / `DeleteNodes` /
|
|
`AddReferences` / `DeleteReferences`. See
|
|
[Node Management](NodeManagement.md).
|
|
- **Alias Names** (Part 17) — `AliasNameStore` and the optional
|
|
`AliasNameNodeManager` for `AliasNameCategory` / `FindAlias` /
|
|
`FindAliasVerbose` / `AddAliasesToCategory` / `DeleteAliasesFromCategory`
|
|
/ `LastChange`. The reference server wires the standard Aliases and
|
|
Topics nodes via `ConfigureAliasNameStore`. See
|
|
[Alias Names](AliasNames.md).
|
|
- **WoT Connectivity** (OPC 10100-1) — `Opc.Ua.WotCon` /
|
|
`Opc.Ua.WotCon.Server` / `Opc.Ua.WotCon.Client` library trio for
|
|
surfacing OPC UA servers as Web-of-Things Thing Descriptions. See
|
|
[WoT Connectivity](WoTConnectivity.md).
|
|
- **Asset Administration Shell** — `Opc.Ua.Aas` / `Opc.Ua.Aas.Server` /
|
|
`Opc.Ua.Aas.Client` / `Opc.Ua.Aas.WoT` carry two alternative halves: OPC 30270
|
|
/ AAS V2 ingestion-only metamodel support and the AAS V3 draft model with
|
|
serialization, metamodel server/client, xRegistry-based registry, packages,
|
|
federation and WoT bridge. See [Asset Administration Shell](Aas.md).
|
|
- **Device Integration** (Part 100) — `Opc.Ua.Di` / `Opc.Ua.Di.Server` /
|
|
`Opc.Ua.Di.Client` library trio, including the lock service and the
|
|
software-update package store. See [Device Integration](DeviceIntegration.md)
|
|
and [Software Update](SoftwareUpdate.md).
|
|
- **Relative Spatial Location and Global Positioning** (Parts 210 and 211) —
|
|
`Opc.Ua.Positioning` / `Opc.Ua.Positioning.Server` /
|
|
`Opc.Ua.Positioning.Client` implement the released RSL and GPOS models,
|
|
including RSL spatial lists and model changes plus the GPOS GlobalPosition,
|
|
GlobalLocation, and Zones conformance units. See
|
|
[Positioning](Positioning.md).
|
|
- **Robotics** (OPC 40010-1) over **Industrial Automation** (OPC 40001-1) —
|
|
`Opc.Ua.Robotics` / `Opc.Ua.Robotics.Server` / `Opc.Ua.Robotics.Client`
|
|
library trio implementing the released Robotics 1.02 model over IA and
|
|
Device Integration, with validated fluent topology builders for motion
|
|
device systems, controllers, motion devices, axes, power trains, motors,
|
|
gears, drives, safety states, and task controls. See
|
|
[Robotics](Robotics.md).
|
|
- **Role Management** (Part 18) — Server-side role administration plus a
|
|
pluggable [identity-provider model](IdentityProviders.md) for anonymous,
|
|
username, X.509, and token-issuer flows. The server automatically
|
|
assigns the OPC UA Part 3 §4.9 `TrustedApplication` role; see also
|
|
[Role-Based User Management](RoleBasedUserManagement.md).
|
|
- **Auditing** — The server raises audit events for security-relevant
|
|
service calls (channel/secure-channel/session/activate/cancel). The
|
|
audit and redaction APIs are provided by `Opc.Ua.Server`.
|
|
- **Model Change Tracking** — Server-side `ModelChangeAggregator` with
|
|
auto-emitted `GeneralModelChangeEvent` from `CustomNodeManager`;
|
|
client-side per-node `INodeCache.InvalidateNode`. See
|
|
[Model Change Tracking](ModelChangeTracking.md).
|
|
- **Durable Subscriptions** — Subscriptions that persist across reconnects.
|
|
See [Durable Subscriptions](DurableSubscription.md).
|
|
- **Complex Types** — Custom structures and enumerations; see
|
|
[Complex Types](ComplexTypes.md).
|
|
- **Async server NodeManagers** — TAP-based `AsyncCustomNodeManager` is the
|
|
recommended base for new NodeManagers, and every NodeManager shipped with
|
|
the stack has migrated to it. See [Async Server Support](AsyncServerSupport.md).
|
|
- **Server redundancy (Part 4 §6.6)** — `AddServerRedundancy(...)` publishes
|
|
the `Server.ServerRedundancy` object, drives `Server.ServiceLevel`, and
|
|
supports every `RedundancySupport` mode (None / Cold / Warm / Hot /
|
|
HotAndMirrored / Transparent). Non-transparent modes advertise the **`NTRS`**
|
|
discovery capability and return the peer set from `FindServers`;
|
|
`RequestServerStateChange` supports administrator-driven Maintenance / NoData
|
|
failover. Opt-in distributed high availability — address-space, session, and
|
|
subscription mirroring over an in-package CRDT (eventual) or Raft (strong)
|
|
shared store, plus a Kubernetes deployment — is provided by the
|
|
`Opc.Ua.Redundancy`, `.Server`, `.Client`, and `.Kubernetes` packages. See
|
|
[High Availability](HighAvailability.md).
|
|
|
|
## Client Profiles
|
|
|
|
The client (`Opc.Ua.Client`) supports the standard UA Client functionality
|
|
through two coexisting paths:
|
|
|
|
- **Classic `Session`** — the lowest-level OPC UA session primitive,
|
|
paired with `SessionReconnectHandler` for caller-driven reconnect.
|
|
- **`ManagedSession`** — recommended for new code. Encapsulates the
|
|
connection state machine, reconnect policy, and pluggable subscription
|
|
engine behind a fluent builder. See [Sessions, Reconnection, and
|
|
Subscription Engines](Sessions.md).
|
|
|
|
Client-side feature coverage:
|
|
|
|
- **Subscriptions and monitored items** — Both the classic publish
|
|
engine and the V2 subscription engine (`ISubscriptionManager` /
|
|
`DefaultSubscriptionEngine`) are supported and selectable per session.
|
|
The V2 surface includes a declarative + imperative
|
|
[`SetTriggering`](Subscriptions.md#triggering-settriggering) API with
|
|
N:M support and automatic replay on recreate / reconnect, plus an
|
|
`IStreamingSubscription` (`IAsyncEnumerable`-based) facade for
|
|
state-machine waits and short-lived monitoring
|
|
(`ManagedSession.DefaultStreaming`, `TakeUntilAsync` /
|
|
`WithTimeoutAsync` helpers). See
|
|
[Subscriptions and Monitored Items](Subscriptions.md).
|
|
- **Transfer Subscriptions** — Subscription transfer between servers;
|
|
see [Transfer Subscriptions](TransferSubscription.md). An opt-in
|
|
`SubscriptionRecoveryPolicy` lets the client tolerate
|
|
`Good_SubscriptionTransferred` notifications from the server.
|
|
- **Reverse Connect** — Client can accept connections initiated by the
|
|
server; see [Reverse Connect](ReverseConnect.md).
|
|
- **Model Change Tracking** — Client-side per-node cache invalidation
|
|
driven by server-emitted model-change events; see
|
|
[Model Change Tracking](ModelChangeTracking.md).
|
|
- **File System Operations** — Async, `System.IO`-style client over OPC
|
|
UA file methods; see [FileSystemClient](FileSystemClient.md).
|
|
- **Alarms and Conditions** — Typed `AlarmClient` event records, fluent
|
|
`AlarmEventFilterBuilder`, and `IAsyncEnumerable` alarm streaming via
|
|
`AlarmStreamExtensions`; see
|
|
[Alarms and Conditions](AlarmsAndConditions.md).
|
|
- **Historical Access** — `HistoryClient` (`session.Historian()`) for
|
|
raw, modified, at-time, processed (aggregate), and annotation reads /
|
|
updates; see [Historical Access](HistoricalAccess.md).
|
|
- **State Machines** — Streaming and read helpers
|
|
(`GetCurrentFiniteStateAsync`, `ObserveFiniteTransitionsAsync`,
|
|
`WaitForStateAsync`) on the source-generated `*TypeClient` proxies;
|
|
see [State Machines](StateMachines.md).
|
|
- **NodeSet Export** — Extract a server's address space to NodeSet2 XML;
|
|
see [NodeSet Export](NodeSetExport.md).
|
|
- **Source-generated typed proxies** — `*TypeClient` proxies for
|
|
ObjectTypes inside loaded models give strongly-typed method-call
|
|
signatures; see [Source-Generated NodeManagers](NodeManagers.md#source-generated-node-managers).
|
|
- **Complex types** — Decode and consume server-defined structures and
|
|
enumerations on the client; see [Complex Types](ComplexTypes.md).
|
|
|
|
## Transport Profiles
|
|
|
|
The stack implements the following transport profiles:
|
|
|
|
### Client and server transports
|
|
|
|
- **[UA TCP Transport](http://opcfoundation.org/UA-Profile/Transport/uatcp-uasc-uabinary)** (`opc.tcp://`) — Primary OPC UA binary transport over TCP.
|
|
- Full UA Secure Conversation (UASC)
|
|
- Binary encoding
|
|
- Reverse-connect capability
|
|
|
|
- **[HTTPS Binary Transport](http://opcfoundation.org/UA-Profile/Transport/https-uabinary)** (`opc.https://` and `https://`) — OPC UA binary protocol over HTTPS with TLS.
|
|
|
|
- **[HTTPS JSON Transport](http://opcfoundation.org/UA-Profile/Transport/https-uajson)** (`opc.https://` and `https://`) - OPC UA JSON (compact / reversible) over HTTPS (OPC UA Part 6 §7.4.5)
|
|
- Compact JSON encoding (`application/opcua+uajson`)
|
|
- TLS/SSL encryption only — no UA SecureChannel layer
|
|
- Restricted to `MessageSecurityMode.None`; transport security is provided exclusively by TLS
|
|
|
|
- **[WebSocket Secure (UA Binary)](http://opcfoundation.org/UA-Profile/Transport/wss-uasc-uabinary)** (`opc.wss://` and `wss://`) - UA Binary + UASC over secure WebSockets (OPC UA Part 6 §7.5.2, sub-protocol `opcua+uacp`)
|
|
- Same UASC SecureChannel pipeline as `opc.tcp` carried over WebSocket binary frames (one frame per MessageChunk)
|
|
- Supports all security modes (None / Sign / SignAndEncrypt)
|
|
- TLS/SSL encryption at the WebSocket layer
|
|
|
|
- **[WebSocket Secure (JSON)](http://opcfoundation.org/UA-Profile/Transport/wss-uajson)** (`opc.wss://` and `wss://`) - OPC UA JSON over secure WebSockets (Part 6 §7.5.2, sub-protocol `opcua+uajson`)
|
|
- Compact JSON encoding per WebSocket text frame
|
|
- TLS/SSL encryption only — no UA SecureChannel layer
|
|
- Restricted to `MessageSecurityMode.None`
|
|
|
|
- **[HTTPS OpenAPI](https://profiles.opcfoundation.org/profile/2338)** (`opc.https://` and `https://`) - OPC UA OpenAPI Mapping (Part 6 §G.3) — official OPC Foundation profile/2338, URI `http://opcfoundation.org/UA-Profile/Transport/https-uajson-openapi`
|
|
- Path-routed REST surface: `POST /<service>` (e.g. `/read`, `/browse`, `/createsubscription`)
|
|
- Body is the bare `<Service>Request` / `<Service>Response` — no `{UaTypeId, UaBody}` envelope at the HTTPS layer
|
|
- Compact (default, mandatory per §5.4.9) and Verbose JSON flavours selected via the `application/json; encoding=compact|verbose` media-type parameter
|
|
- TLS/SSL encryption only — no UA SecureChannel layer
|
|
- Restricted to `MessageSecurityMode.None`
|
|
- Authentication via Anonymous, Bearer JWT, HTTP Basic, or Mutual TLS (see [WebApi.md](WebApi.md))
|
|
- Server-side discovery emission: `HttpsServiceHost` emits this sub-profile as a discovery-only twin alongside each `SecurityMode.None` HTTPS-binary endpoint, so discovery-driven clients can find the OpenAPI endpoint without hard-coding the URL.
|
|
- Shipped as part of the `OPCFoundation.NetStandard.Opc.Ua.Bindings.Https` package (net8+ only)
|
|
- Surfaced via `Profiles.HttpsOpenApiTransport`
|
|
|
|
- **[WSS OpenAPI](https://profiles.opcfoundation.org/profile/2339)** (`opc.wss://` and `wss://`) - OPC UA OpenAPI Mapping over secure WebSockets (Part 6 §7.5.2, sub-protocol `opcua+openapi` / `opcua+openapi+<accesstoken>`) — official OPC Foundation profile/2339, URI `http://opcfoundation.org/UA-Profile/Transport/wss-uajson-openapi`
|
|
- Same on-wire `{TypeId, Body}` OPC UA JSON envelope as `opcua+uajson`, multiplexed over WebSocket text frames; distinguished by the negotiated sub-protocol and the advertised TransportProfileUri
|
|
- Bearer-token variant negotiates the access token in the sub-protocol name (no `Authorization` header — required for browser fetch compatibility); the server extracts the token from the sub-protocol name and feeds it through the standard `ISessionlessIdentityProvider` pipeline
|
|
- Server-side discovery emission: the WSS factories emit this sub-profile as a discovery-only twin alongside each `SecurityMode.None` WSS binary endpoint, mirroring the HTTPS OpenAPI emission.
|
|
- Client surface: `src/Opc.Ua.Client/WebApi/WebApiWssTransportChannel.cs`; fluent shortcut `ManagedSessionBuilder.UseWssOpenApiEndpoint(url)`; DI registration via `services.AddWebApiTransportChannel()` (registers both HTTPS and WSS WebApi channel factories).
|
|
- Surfaced via `Profiles.WssOpenApiTransport`
|
|
|
|
### PubSub transports
|
|
|
|
The [PubSub library](PubSub.md) supports the following PubSub transport
|
|
facets (URIs surfaced by `Profiles.PubSub*Transport` constants in
|
|
`src/Opc.Ua.Core/Security/Constants/SecurityConstants.cs`). Facet
|
|
machinery and conformance unit semantics are defined by
|
|
[Part 7 §4.3](https://reference.opcfoundation.org/specs/OPC-10000-7/v1.05.06/4.3).
|
|
|
|
- **[PubSub UDP UADP](http://opcfoundation.org/UA-Profile/Transport/pubsub-udp-uadp)** — UDP transport with UADP message encoding.
|
|
- **[PubSub Ethernet UADP](http://opcfoundation.org/UA-Profile/Transport/pubsub-eth-uadp)** — Ethernet (Layer 2) transport with UADP message encoding (see [PubSub transports](PubSub.md#transports)).
|
|
- **[PubSub MQTT UADP](http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-uadp)** — MQTT transport with UADP message encoding.
|
|
- **[PubSub MQTT JSON](http://opcfoundation.org/UA-Profile/Transport/pubsub-mqtt-json)** — MQTT transport with JSON message encoding.
|
|
- **Datagram-v2 connection profile** —
|
|
[`DatagramConnectionTransport2DataType`](https://reference.opcfoundation.org/specs/OPC-10000-14/v1.05.06/6.4.1.4)
|
|
(Part 14 §6.4.1.4) is honoured for UDP transports. The
|
|
`DiscoveryAnnounceRate`, `DiscoveryMaxMessageSize`, and `QosCategory`
|
|
fields drive discovery cadence and the IP DSCP TOS byte.
|
|
- **PubSub SKS pull / push** —
|
|
[Part 14 §8.5.1](https://reference.opcfoundation.org/specs/OPC-10000-14/v1.05.06/8.5.1)
|
|
/ §8.5.2: the
|
|
`AddPubSubSecurityKeyServiceClient` extension implements the pull
|
|
client (calls `GetSecurityKeys` on a remote SKS), and
|
|
`AddPubSubSecurityKeyServiceServer` hosts the in-memory SKS with
|
|
`Get/SetSecurityKeys` and `AddSecurityGroup` methods bound on the
|
|
address space.
|
|
- **AES-128-CTR / AES-256-CTR with HMAC-SHA-256** —
|
|
[Part 14 §8.4.3](https://reference.opcfoundation.org/specs/OPC-10000-14/v1.05.06/8.4.3)
|
|
message security. Profiles registered as
|
|
`PubSubAes128CtrPolicy` / `PubSubAes256CtrPolicy`; conformance to NIST
|
|
SP 800-38A F.5.1 / F.5.5 is asserted by the test suite.
|
|
- **Anonymous certificate-based MQTT auth** — the MQTT transport
|
|
exposes the `MqttClientAuthenticationOptions` with the
|
|
certificate-based variant from
|
|
[Part 14 §6.4.2.2.4](https://reference.opcfoundation.org/specs/OPC-10000-14/v1.05.06/6.4.2.2.4).
|
|
|
|
PubSub additionally supports certificate-based MQTT authentication and
|
|
considers `WriterGroup`s in MQTT keep-alive calculations.
|
|
|
|
All transport profiles defined in OPC UA Part 6 §7.4 (HTTPS) and §7.5
|
|
(WebSockets) are supported, including the `opcua+openapi` and
|
|
`opcua+openapi+<accesstoken>` WebSocket sub-protocols (Part 6 §7.5.2
|
|
Table 81).
|
|
|
|
## Security Profiles
|
|
|
|
The stack supports the following security profiles for secure
|
|
communication. The canonical set is defined in
|
|
`src/Opc.Ua.Core/Security/Constants/SecurityPolicies.cs`.
|
|
|
|
### RSA-based security policies
|
|
|
|
- **[Basic256Sha256](http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256)**
|
|
- 256-bit AES encryption
|
|
- RSA-OAEP for key encryption
|
|
- HMAC-SHA256 for message authentication
|
|
- Minimum key size: 2048 bits
|
|
- **[Aes128_Sha256_RsaOaep](http://opcfoundation.org/UA/SecurityPolicy#Aes128_Sha256_RsaOaep)**
|
|
- 128-bit AES encryption
|
|
- RSA-OAEP for key encryption
|
|
- HMAC-SHA256 for message authentication
|
|
- **[Aes256_Sha256_RsaPss](http://opcfoundation.org/UA/SecurityPolicy#Aes256_Sha256_RsaPss)**
|
|
- 256-bit AES encryption
|
|
- RSA-PSS signatures
|
|
- HMAC-SHA256 for message authentication
|
|
|
|
### ECC-based security policies
|
|
|
|
ECC support is documented in detail in [ECC Profiles](EccProfiles.md).
|
|
|
|
#### Traditional ECC curves
|
|
|
|
- **[ECC_nistP256](http://opcfoundation.org/UA/SecurityPolicy#ECC_nistP256)** — NIST P-256 with SHA-256
|
|
- **[ECC_nistP384](http://opcfoundation.org/UA/SecurityPolicy#ECC_nistP384)** — NIST P-384 with SHA-384
|
|
- **[ECC_brainpoolP256r1](http://opcfoundation.org/UA/SecurityPolicy#ECC_brainpoolP256r1)** — Brainpool P-256r1 with SHA-256
|
|
- **[ECC_brainpoolP384r1](http://opcfoundation.org/UA/SecurityPolicy#ECC_brainpoolP384r1)** — Brainpool P-384r1 with SHA-384
|
|
|
|
#### Modern ECC curves (v2.0)
|
|
|
|
- **[ECC_curve25519](http://opcfoundation.org/UA/SecurityPolicy#ECC_curve25519)** — Curve25519 with ChaCha20-Poly1305
|
|
- **[ECC_curve25519_AesGcm](http://opcfoundation.org/UA/SecurityPolicy#ECC_curve25519_AesGcm)** — Curve25519 with AES-GCM
|
|
- **[ECC_curve448](http://opcfoundation.org/UA/SecurityPolicy#ECC_curve448)** — Curve448 with ChaCha20-Poly1305
|
|
- **[ECC_curve448_AesGcm](http://opcfoundation.org/UA/SecurityPolicy#ECC_curve448_AesGcm)** — Curve448 with AES-GCM
|
|
|
|
#### AES-GCM and ChaCha20-Poly1305 variants (v2.0)
|
|
|
|
Modern AEAD cipher alternatives for traditional ECC curves:
|
|
|
|
- **ECC_nistP256_AesGcm**, **ECC_nistP256_ChaChaPoly**
|
|
- **ECC_nistP384_AesGcm**, **ECC_nistP384_ChaChaPoly**
|
|
- **ECC_brainpoolP256r1_AesGcm**, **ECC_brainpoolP256r1_ChaChaPoly**
|
|
- **ECC_brainpoolP384r1_AesGcm**, **ECC_brainpoolP384r1_ChaChaPoly**
|
|
|
|
#### RSA Diffie-Hellman (v2.0)
|
|
|
|
- **RSA_DH_AesGcm** — RSA Diffie-Hellman key agreement with AES-GCM
|
|
- **RSA_DH_ChaChaPoly** — RSA Diffie-Hellman key agreement with ChaCha20-Poly1305
|
|
|
|
**Platform requirements for ECC.** ECC support is available on .NET
|
|
Framework 4.8, .NET Standard 2.1, and .NET 5.0 or later. Modern curves
|
|
(Curve25519, Curve448) and AEAD ciphers (AES-GCM, ChaCha20-Poly1305)
|
|
require .NET 8.0 or later (`AesGcm.IsSupported` /
|
|
`ChaCha20Poly1305.IsSupported` guard the runtime registration). Not all
|
|
curves are supported by every OS platform and .NET implementation.
|
|
|
|
### Deprecated security policies
|
|
|
|
The following security policies are deprecated but still supported for
|
|
backward compatibility:
|
|
|
|
- **[Basic256](http://opcfoundation.org/UA/SecurityPolicy#Basic256)** — uses SHA-1
|
|
- **[Basic128Rsa15](http://opcfoundation.org/UA/SecurityPolicy#Basic128Rsa15)** — uses SHA-1 and RSA-PKCS#1 v1.5
|
|
|
|
**Note.** SHA-1 signed certificates are rejected by default
|
|
(`RejectSHA1SignedCertificates` configuration option). These deprecated
|
|
policies should only be enabled for compatibility with legacy systems.
|
|
|
|
### Security policy None
|
|
|
|
- **[None](http://opcfoundation.org/UA/SecurityPolicy#None)** — No security.
|
|
- For testing or isolated networks only.
|
|
- Not recommended for production environments.
|
|
|
|
## User Authentication
|
|
|
|
The stack supports the following user authentication mechanisms:
|
|
|
|
- **Anonymous** — No user authentication.
|
|
- **Username / Password** — User credentials encrypted using the active
|
|
security policy.
|
|
- **X.509 Certificate** — User authentication via X.509 certificates.
|
|
- **Issued Token** — Includes **JSON Web Tokens (JWT)** and other
|
|
IssuerEndpointUrl-driven flows (OAuth2 / OIDC / Entra). The
|
|
[Identity Providers](IdentityProviders.md) pluggable model
|
|
(`IClientIdentityProvider`, `IUserTokenAuthenticator`,
|
|
`IAccessTokenProvider`, `ITokenIssuer`, `IIdentityClaims`) is the
|
|
recommended way to wire these in.
|
|
|
|
## Certificate Types
|
|
|
|
The stack supports the following certificate types for application
|
|
authentication:
|
|
|
|
### RSA certificates
|
|
|
|
- **RsaSha256ApplicationCertificateType** — RSA with SHA-256 signatures
|
|
- Default minimum key size: 2048 bits
|
|
- Recommended for production use
|
|
|
|
### ECC certificates
|
|
|
|
- **EccNistP256ApplicationCertificateType**
|
|
- **EccNistP384ApplicationCertificateType**
|
|
- **EccBrainpoolP256r1ApplicationCertificateType**
|
|
- **EccBrainpoolP384r1ApplicationCertificateType**
|
|
|
|
The `RejectSHA1SignedCertificates` configuration option (on by default)
|
|
prevents SHA-1 signed certificates from being accepted. See
|
|
[Certificates](Certificates.md) and [Certificate Manager](CertificateManager.md)
|
|
for storage, ref-counted lifetime, and the segregated-interface design.
|
|
|
|
## Global Discovery Server (GDS)
|
|
|
|
The stack ships a Global Discovery Server implementation that is
|
|
**full OPC UA Part 12 compliance**, including:
|
|
|
|
- Application registration and discovery.
|
|
- Pull and Push certificate-management models, including pushing to
|
|
arbitrary certificate groups and custom certificate groups on the GDS
|
|
itself.
|
|
- Sub-CA revocation without auto-creating an empty CRL.
|
|
- Support for both RSA and ECC certificate types and CRLs.
|
|
- **[AuthorizationService](AuthorizationService.md)** (OPC 10000-12 §9) —
|
|
OAuth2-style `StartRequestToken` / `FinishRequestToken` issuance with a
|
|
pluggable `IAccessTokenProvider` / `ITokenIssuer`.
|
|
- **[KeyCredentialService](KeyCredentialService.md)** (OPC 10000-12 §8) —
|
|
Credential issuance for non-OPC UA services such as MQTT brokers and
|
|
REST APIs, backed by `IKeyCredentialRequestStore` / `ISecretStore`.
|
|
|
|
See the [GDS Developer Guide](GDS.md) for the full feature breakdown and
|
|
hosting integration. The Local Discovery Server is a separate library
|
|
(`Opc.Ua.Lds.Server`) and reference application (`ConsoleLdsServer`) that
|
|
advertises the
|
|
[Local Discovery Server 2017](http://opcfoundation.org/UA-Profile/Server/LocalDiscovery2017)
|
|
facet.
|
|
|
|
## Message Encoding
|
|
|
|
The stack supports the following message encoding formats:
|
|
|
|
- **UA Binary** — OPC UA binary encoding (primary for UA-TCP and HTTPS).
|
|
- **UA XML** — OPC UA XML encoding (for configuration import / export and
|
|
PubSub Dataset XML).
|
|
- **UA JSON** — OPC UA JSON encoding for PubSub MQTT.
|
|
- **UADP** — UA Data Protocol for PubSub.
|
|
|
|
The 2.0 release ships a new JSON decoder / encoder, array / matrix
|
|
abstractions, and a first-class `ByteString` type. See the
|
|
[2.0 migration guide — Encoders and Complex Types](migrate/2.0.x/encoders.md#encoders-and-decoders)
|
|
for the encoder/decoder migration details and
|
|
[Complex Types](ComplexTypes.md) for client-side decode of
|
|
server-defined types.
|
|
|
|
## Specification Compliance
|
|
|
|
- **OPC UA Specification:** Version 1.05.07.
|
|
- **Certification:** The reference server has been certified for
|
|
compliance through an OPC Foundation Certification Test Lab.
|
|
- **Testing:** All releases are verified for compliance using the latest
|
|
Compliance Test Tool (CTT).
|
|
- **Redundancy (Part 4 §6.6):** Server and client redundancy are implemented
|
|
(opt-in) — `RedundancySupport`, `Server.ServiceLevel`, non-transparent
|
|
(`ServerUriArray` / `RedundantServerArray`) and transparent (`CurrentServerId`)
|
|
modes, `RequestServerStateChange`, and client-side transparent failover via
|
|
`ManagedSession.WithServerRedundancy()`; see
|
|
[High Availability](HighAvailability.md).
|
|
|
|
## Configuration
|
|
|
|
### Server profile configuration
|
|
|
|
Server profiles are configured in the server configuration file using the
|
|
`ServerProfileArray` element. The reference server's default array is:
|
|
|
|
```xml
|
|
<ServerConfiguration>
|
|
<!-- see https://profiles.opcfoundation.org/ for the canonical list of profile and facet URIs -->
|
|
<ServerProfileArray>
|
|
<ua:String>http://opcfoundation.org/UA-Profile/Server/StandardUA2017</ua:String>
|
|
<ua:String>http://opcfoundation.org/UA-Profile/Server/DataAccess</ua:String>
|
|
<ua:String>http://opcfoundation.org/UA-Profile/Server/Methods</ua:String>
|
|
<ua:String>http://opcfoundation.org/UA-Profile/Server/ReverseConnect</ua:String>
|
|
<ua:String>http://opcfoundation.org/UA-Profile/Server/ClientRedundancy</ua:String>
|
|
</ServerProfileArray>
|
|
</ServerConfiguration>
|
|
```
|
|
|
|
To advertise additional facets (Historical Access, Aggregates, Alarms &
|
|
Conditions, File Access, Auditing, NodeManagement, State Machine, etc.)
|
|
look up the canonical URI for the facet on
|
|
<https://profiles.opcfoundation.org/> and add it to `ServerProfileArray`.
|
|
Only advertise a facet that the application genuinely implements — the
|
|
Compliance Test Tool will exercise every claimed facet. Bringing the
|
|
reference-server and CTT configs in line with the facets the stack
|
|
actually implements is tracked in
|
|
[#3875](https://github.com/OPCFoundation/UA-.NETStandard/issues/3875).
|
|
|
|
### Security policy configuration
|
|
|
|
Security policies are configured in the `SecurityPolicies` section:
|
|
|
|
```xml
|
|
<SecurityPolicies>
|
|
<ServerSecurityPolicy>
|
|
<SecurityMode>SignAndEncrypt_3</SecurityMode>
|
|
<SecurityPolicyUri>http://opcfoundation.org/UA/SecurityPolicy#Basic256Sha256</SecurityPolicyUri>
|
|
</ServerSecurityPolicy>
|
|
<ServerSecurityPolicy>
|
|
<SecurityMode>SignAndEncrypt_3</SecurityMode>
|
|
<SecurityPolicyUri>http://opcfoundation.org/UA/SecurityPolicy#Aes128_Sha256_RsaOaep</SecurityPolicyUri>
|
|
</ServerSecurityPolicy>
|
|
<!-- ECC security policies -->
|
|
<ServerSecurityPolicy>
|
|
<SecurityMode>SignAndEncrypt_3</SecurityMode>
|
|
<SecurityPolicyUri>http://opcfoundation.org/UA/SecurityPolicy#ECC_nistP256</SecurityPolicyUri>
|
|
</ServerSecurityPolicy>
|
|
</SecurityPolicies>
|
|
```
|
|
|
|
See the [reference server configuration file](../samples/Reference/ConsoleReferenceServer/Quickstarts.ReferenceServer.Config.xml)
|
|
for a complete example, or the
|
|
[CTT configuration file](../samples/Reference/ConsoleReferenceServer/Ctt.ReferenceServer.Config.xml)
|
|
for the variant selected by `--ctt`.
|
|
|
|
## Related Documentation
|
|
|
|
- [What's New in 2.0](WhatsNewIn2.0.md) — Narrative tour of the
|
|
1.5.378 → 2.0 changes, grouped by theme and layer.
|
|
- [Migration Guide](MigrationGuide.md) — Prescriptive, per-API migration
|
|
reference.
|
|
- [Subscriptions and Monitored Items](Subscriptions.md) —
|
|
V2 `ISubscriptionManager`, declarative + imperative `SetTriggering`
|
|
(N:M, replay on recreate / reconnect), and `IStreamingSubscription`.
|
|
- [Async Server Support](AsyncServerSupport.md) — TAP-based
|
|
`AsyncCustomNodeManager` and the `IAsyncNodeManager` family.
|
|
- [Dependency Injection](DependencyInjection.md) — `services.AddOpcUa()`
|
|
and the `IOpcUaBuilder` hosting surface.
|
|
- [Native AOT](NativeAoT.md) — AOT publishing, AOT-clean source
|
|
generators, and the AOT test matrix.
|
|
|
|
### Core and companion spec related documentation
|
|
|
|
- [Alarms and Conditions](AlarmsAndConditions.md) (Part 9)
|
|
- [Historical Access](HistoricalAccess.md) (Part 11)
|
|
- [Aggregates](Aggregates.md) (Part 13)
|
|
- [State Machines](StateMachines.md) (Part 16)
|
|
- [Alias Names](AliasNames.md) (Part 17)
|
|
- [Role-Based User Management](RoleBasedUserManagement.md) (Part 18)
|
|
- [Identity Providers](IdentityProviders.md)
|
|
- [Authorization Service](AuthorizationService.md) (Part 12 §9)
|
|
- [Key Credential Service](KeyCredentialService.md) (Part 12 §8)
|
|
- [GDS Developer Guide](GDS.md) (Part 12 full compliance)
|
|
- [File System Client](FileSystemClient.md) (Part 20)
|
|
- [Device Integration](DeviceIntegration.md) (Part 100)
|
|
- [Relative Spatial Location and Global Positioning](Positioning.md)
|
|
(Parts 210 and 211)
|
|
- [Robotics](Robotics.md) (OPC 40010-1 over OPC 40001-1)
|
|
- [Software Update](SoftwareUpdate.md)
|
|
- [Asset Administration Shell](Aas.md) (OPC 30270 / AAS V2 and AAS V3 draft)
|
|
- [WoT Connectivity](WoTConnectivity.md) (OPC 10100-1)
|
|
- [Node Management](NodeManagement.md) (Part 4)
|
|
|
|
## References
|
|
|
|
- [OPC Foundation Profile Reporting](https://profiles.opcfoundation.org/) — canonical profile and facet URI registry.
|
|
- [OPC UA Specification](https://reference.opcfoundation.org/) — online reference for the OPC 10000 series.
|
|
- [OPC UA Compliance Test Tool (CTT)](https://opcfoundation.org/developer-tools/certification-test-tools/opc-ua-compliance-test-tool-uactt/) — official conformance test tool.
|
|
|