## Summary
### Documentation
- Stage the documentation index as a learning path: a first application,
independent client, server, and PubSub paths, then data and services,
companion models, production, advanced integration, and draft or
experimental capabilities.
- Add Getting started (repository samples or NuGet packages), OPC UA
concepts, Your first information model, and a production readiness
checklist.
- Add Native AOT application publishing, a first PubSub publisher and
subscriber exchange, and the UDP transport options.
- Add or expand contents navigation throughout `docs/`, and keep
contributor documentation separate.
- Correct outdated SDK examples and capability guidance, consolidate
repeated explanations into canonical guides, and repair local links and
heading structure.
- Rewrite What's New in 2.0 as a concise feature overview with short
linked details; keep migration instructions in the Migration Guide.
- Expand the feature catalogue with specification IDs, GDS, LDS, the OPC
10000-21 onboarding registrar, ISA-95, xRegistry, OpenUSD, and
sample-local models; distinguish draft status, explain crypto
pluggability, and bring performance guidance forward.
- Address review feedback on wording, active monitored items during
shadow reload, and the `Samples.md` filename and references.
- Regenerate the `opcua-v20-migration` plugin's bundled copy of the
migration guides so it matches the edited `docs/migrate/2.0.x` guides.
- Merge the latest `master`, preserving upstream resource-isolation
guidance within the task-based documentation index.
- Retain deferred Lingity findings where appropriate; this PR does not
claim that every document meets the Lingity score thresholds.
### Fixes found while verifying the guides
Each fix has regression tests that fail without it.
- **Client:** V2 subscriptions compared their lifetime with the
operation timeout instead of the session timeout, and logged a spurious
warning. `ISubscriptionEngineContext`, which is new in 2.0, gains a
`SessionTimeout` property; implementations must add it.
- **PubSub:** a subscriber now registers the `DataSetMetaData`
configured on its readers (OPC 10000-14 6.2.9.4), and the UADP decoder
decodes DataSetMessages that carry no ConfigurationVersion. Before, a
secured subscriber of the reference sample received no DataSets.
- **Source generator:** a ModelDesign method that declares its arguments
inline, without a method type, produced code that did not compile; it
now uses `MethodState`. The generated code of existing models is
unchanged.
- **MinimalClient sample:** waits for its first data-change notification
before it disconnects.
### Known issues, not addressed here
- UDP multicast: the publisher does not send on the interface that the
subscriber joins, and `MulticastLoopback` defaults to false. The PubSub
guide uses unicast for the exchange on one computer.
- The UDP metadata announcement is sent unsecured on secured writer
groups; a secured subscriber drops it with a warning.
- A server does not start in globalization-invariant mode, because
`ResourceManager` creates `CultureInfo("en-US")`. The Native AOT guide
cautions against the mode.
## Validation
- `git diff --check` and
`./.azurepipelines/validate-migration-plugin.ps1` (15 bundled migration
docs validated, plugin manifests synchronized).
- Local Markdown links, anchors, file-link casing, and contents lists
checked across all 87 documents under `docs/`. The index links every
top-level guide and every target of the previous index.
- Both Getting started routes, Your first information model, the PubSub
exchange, and the Native AOT publish of the Getting started client and
server were run as documented. The NuGet route and the tutorial use the
public `2.0.0-preview.5` packages.
- The changed libraries build for all target frameworks in Release
without warnings.
- Tests on .NET 10: Opc.Ua.SourceGeneration.Tests 199 passed;
Opc.Ua.SourceGeneration.Core.Tests 3,977 passed, 8 skipped;
Opc.Ua.Server.Tests `Fluent` category 621 passed; Opc.Ua.Client.Tests
subscription-engine tests 70 passed; Opc.Ua.PubSub.Tests 1,374 passed, 2
skipped; PubSub fuzz replay 145 passed. The new and affected tests also
pass on .NET Framework 4.8.
- Earlier merge validation: 174 resource-isolation tests passed on .NET
10.
- The full solution suite was not run locally.
Review and validation artifacts are maintained outside the repository.
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
6.5 KiB
Provisioning Mode
Overview
Provisioning mode is a special server startup mode designed to facilitate secure certificate provisioning and initial server configuration. When enabled, the server starts with a limited default namespace and enhanced security settings to allow administrators to safely configure the server before exposing the full application functionality.
Contents
Purpose
The provisioning mode addresses the need for secure server initialization by:
- Providing a minimal server environment during initial setup
- Requiring authenticated user access (anonymous access is disabled)
- Enabling automatic certificate acceptance to simplify certificate provisioning
- Preventing access to application-specific data and functionality until the server is properly configured
This mode is particularly useful when:
- Setting up a new OPC UA server installation
- Provisioning certificates for production environments
- Performing initial server configuration in a secure manner
How to Enable Provisioning Mode
ConsoleReferenceServer
The ConsoleReferenceServer application supports provisioning mode via the --provision command line option:
dotnet ConsoleReferenceServer.dll --provision
Command Line Options
When using provisioning mode, you can combine it with other options:
# Enable provisioning mode with console logging
dotnet ConsoleReferenceServer.dll --provision --console --log
# Enable provisioning mode with timeout
dotnet ConsoleReferenceServer.dll --provision --timeout 300
Note: When provisioning mode is enabled, auto-accept for untrusted certificates is automatically activated. You don't need to specify the --autoaccept option separately.
Behavior in Provisioning Mode
When the server starts in provisioning mode:
1. Limited Namespace
- Only the core OPC UA namespace is exposed
- Application-specific node managers are not loaded
- Standard OPC UA objects (Objects, Types, Views) remain accessible
- Custom server nodes and data are not available
2. Authentication Requirements
- Anonymous authentication is disabled
- Users must authenticate using:
- Username/password
- X.509 certificate
- Other supported authentication mechanisms
3. Certificate Handling
- Auto-accept for untrusted certificates is enabled
- Administrators can provision certificates without manual approval
- Certificate validation still occurs, but untrusted certificates are accepted
4. Reduced Attack Surface
- No application-specific functionality is exposed
- Minimal node managers are active
- Only core server capabilities are available
Use Cases
Initial Server Setup
- Start the server in provisioning mode
- Connect as an authenticated administrator
- Provision required certificates
- Configure server settings
- Restart the server in normal mode
Certificate Provisioning
- Start the server with
--provision - Use a GDS (Global Discovery Server) or certificate management tool
- Push certificates to the server
- Verify certificate installation
- Exit provisioning mode
Secure Configuration
- Enable provisioning mode for configuration changes
- Make necessary updates to server configuration
- Test changes in the limited environment
- Restart in production mode
Implementation Details
ReferenceServer Class
The provisioning mode is implemented in the ReferenceServer class:
public bool ProvisioningMode { get; set; }
When ProvisioningMode is true:
CreateMasterNodeManagerskips loading application-specific node managersGetUserTokenPoliciesremoves anonymous authentication policies
Programmatic Usage
To enable provisioning mode programmatically:
var server = new ReferenceServer();
Quickstarts.Servers.Utils.EnableProvisioningMode(server);
Or directly:
var server = new ReferenceServer
{
ProvisioningMode = true
};
Security Considerations
Benefits
- Reduces attack surface during initial setup
- Requires authenticated access for configuration
- Prevents unauthorized access to application data
Limitations
- Auto-accept mode accepts all certificates (including potentially malicious ones)
- Should only be used during controlled setup/configuration periods
- Not intended for long-term operation
Best Practices
- Use provisioning mode only during initial setup or maintenance windows
- Ensure the server is not accessible from untrusted networks while in provisioning mode
- Switch to normal mode as soon as provisioning is complete
- Monitor and review all certificates that were auto-accepted
- Remove or properly validate any questionable certificates before exiting provisioning mode
Comparison with Normal Mode
| Feature | Normal Mode | Provisioning Mode |
|---|---|---|
| Namespace | Full application namespace | Core namespace only |
| Node Managers | All configured | Core managers only |
| Anonymous Access | Allowed (if configured) | Disabled |
| Auto-Accept Certificates | Optional | Enabled |
| Application Data | Accessible | Not available |
| Security Admin Access | Available | Required |
Examples
Start Server in Provisioning Mode
Windows:
ConsoleReferenceServer.exe --provision --console --log
Linux/Mac:
dotnet ConsoleReferenceServer.dll --provision --console --log
Expected Output
When provisioning mode is active, you should see log messages similar to:
[INF] Enabling provisioning mode.
[INF] Auto-accept enabled for provisioning mode.
[INF] Server is in provisioning mode - limited namespace enabled.
[INF] MasterNodeManager.Startup - NodeManagers=2
The NodeManagers=2 indicates only the core node managers are loaded (CoreNodeManager and SystemNodeManager), confirming the limited namespace is in effect.
Related Documentation
- Certificates - Certificate management and storage
- RoleBasedUserManagement - User authentication and authorization