node-opcua-server-discovery 2.181.1 → 2.182.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * @module node-opcua-server-discovery
3
3
  */
4
- import { type Message, type MessageSecurityMode, type SecurityPolicy, type ServerSecureChannelLayer } from "node-opcua-secure-channel";
4
+ import { type Message, MessageSecurityMode, type SecurityPolicy, type ServerSecureChannelLayer } from "node-opcua-secure-channel";
5
5
  import { OPCUABaseServer, type OPCUABaseServerEvents, type OPCUABaseServerOptions } from "node-opcua-server";
6
6
  import { BonjourHolder, MdnsDiscoveryConfiguration, type RegisteredServer } from "node-opcua-service-discovery";
7
7
  import { ApplicationDescription, type ApplicationDescriptionOptions } from "node-opcua-service-endpoints";
8
+ import { type StatusCode } from "node-opcua-status-code";
8
9
  import { MDNSResponder } from "./mdns_responder.js";
9
10
  export interface OPCUADiscoveryServerOptions extends OPCUABaseServerOptions {
10
11
  certificateFile?: string;
@@ -13,6 +14,38 @@ export interface OPCUADiscoveryServerOptions extends OPCUABaseServerOptions {
13
14
  securityPolicies?: SecurityPolicy[];
14
15
  securityModes?: MessageSecurityMode[];
15
16
  hostname?: string;
17
+ /**
18
+ * Accept `RegisterServer` / `RegisterServer2` over a SecureChannel with
19
+ * `MessageSecurityMode.None`, i.e. from a caller that presented no
20
+ * application certificate.
21
+ *
22
+ * OPC UA Part 4 §5.5.5 / §5.5.6 require these services to be invoked
23
+ * over a SecureChannel that authenticates the caller. Enable only for
24
+ * legacy registrants that cannot open a secured channel, on a network
25
+ * you control.
26
+ *
27
+ * The `FindServers`, `FindServersOnNetwork` and `GetEndpoints` services
28
+ * are not affected: they stay available without message security, as
29
+ * Part 4 §5.5.1 requires.
30
+ *
31
+ * @default false
32
+ */
33
+ allowUnsecuredRegistration?: boolean;
34
+ /**
35
+ * Trust any unknown application certificate presented by a registrant.
36
+ * Only used when `serverCertificateManager` is not provided.
37
+ *
38
+ * When false (the default), a registrant whose certificate is not in the
39
+ * trusted folder is refused at `OpenSecureChannel` and its certificate is
40
+ * placed in the rejected folder; an administrator moves it to the trusted
41
+ * folder to allow the registration. This matches the OPC Foundation
42
+ * UA-LDS default and OPC UA Part 12 §5.3.5, which makes the
43
+ * administrator-managed trust list the primary mechanism for establishing
44
+ * trust between applications.
45
+ *
46
+ * @default false
47
+ */
48
+ automaticallyAcceptUnknownCertificate?: boolean;
16
49
  }
17
50
  interface RegisteredServerExtended extends RegisteredServer {
18
51
  bonjourHolder: BonjourHolder;
@@ -23,9 +56,22 @@ interface MdnsDiscoveryConfigurationExtended extends MdnsDiscoveryConfiguration
23
56
  bonjourHolder?: BonjourHolder;
24
57
  }
25
58
  type RegisterServerMap = Map<string, RegisteredServerExtended>;
59
+ export interface RegistrationRefusedInfo {
60
+ statusCode: StatusCode;
61
+ remoteAddress: string;
62
+ remotePort: number;
63
+ securityMode: MessageSecurityMode;
64
+ /** ApplicationUri(s) found in the caller's certificate, empty when no certificate was presented */
65
+ certificateApplicationUris: string[];
66
+ }
26
67
  export interface OPCUADiscoveryServerEvents extends OPCUABaseServerEvents {
27
68
  onUnregisterServer: [server: RegisteredServer, forced: boolean];
28
69
  onRegisterServer: [server: RegisteredServer, firstTime: boolean];
70
+ /**
71
+ * a `RegisterServer` / `RegisterServer2` request was refused before reaching the registry.
72
+ * (OPC UA Part 4 requires Discovery Servers to audit failed registrations.)
73
+ */
74
+ onRegistrationRefused: [server: RegisteredServer, info: RegistrationRefusedInfo];
29
75
  }
30
76
  export declare class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEvents> {
31
77
  #private;
@@ -15,6 +15,7 @@ const env_paths_1 = __importDefault(require("env-paths"));
15
15
  const node_opcua_assert_1 = require("node-opcua-assert");
16
16
  const node_opcua_certificate_manager_1 = require("node-opcua-certificate-manager");
17
17
  const node_opcua_common_1 = require("node-opcua-common");
18
+ const node_opcua_crypto_1 = require("node-opcua-crypto");
18
19
  const node_opcua_debug_1 = require("node-opcua-debug");
19
20
  const node_opcua_secure_channel_1 = require("node-opcua-secure-channel");
20
21
  const node_opcua_server_1 = require("node-opcua-server");
@@ -25,6 +26,7 @@ const mdns_responder_js_1 = require("./mdns_responder.js");
25
26
  const debugLog = (0, node_opcua_debug_1.make_debugLog)("LDSSERVER");
26
27
  const doDebug = (0, node_opcua_debug_1.checkDebugFlag)("LDSSERVER");
27
28
  const errorLog = (0, node_opcua_debug_1.make_errorLog)("LDSSERVER");
29
+ const warningLog = (0, node_opcua_debug_1.make_warningLog)("LDSSERVER");
28
30
  function hasCapabilities(serverCapabilities, serverCapabilityFilter) {
29
31
  if (serverCapabilities == null) {
30
32
  return true; // filter is empty => no filtering should take place
@@ -37,24 +39,39 @@ function hasCapabilities(serverCapabilities, serverCapabilityFilter) {
37
39
  const defaultProductUri = "NodeOPCUA-LocalDiscoveryServer";
38
40
  const defaultApplicationUri = (0, node_opcua_common_1.makeApplicationUrn)(node_os_1.default.hostname(), defaultProductUri);
39
41
  let _discoveryDefaultCertificateManager;
40
- function getDefaultCertificateManager() {
42
+ function getDefaultCertificateManager(automaticallyAcceptUnknownCertificate) {
41
43
  if (!_discoveryDefaultCertificateManager) {
42
44
  const config = (0, env_paths_1.default)(defaultProductUri).config;
43
45
  _discoveryDefaultCertificateManager = new node_opcua_certificate_manager_1.OPCUACertificateManager({
44
46
  name: "PKI",
45
47
  rootFolder: node_path_1.default.join(config, "PKI"),
46
- automaticallyAcceptUnknownCertificate: true
48
+ automaticallyAcceptUnknownCertificate
47
49
  });
48
50
  }
49
51
  _discoveryDefaultCertificateManager.referenceCounter++;
50
52
  return _discoveryDefaultCertificateManager;
51
53
  }
54
+ /**
55
+ * ApplicationUri(s) carried by the SubjectAltName extension of the leaf certificate.
56
+ * Returns `null` when the certificate cannot be parsed.
57
+ */
58
+ function extractApplicationUris(certificateChain) {
59
+ try {
60
+ const leaf = (0, node_opcua_crypto_1.split_der)(certificateChain)[0];
61
+ const info = (0, node_opcua_crypto_1.exploreCertificate)(leaf);
62
+ return info.tbsCertificate.extensions?.subjectAltName?.uniformResourceIdentifier ?? [];
63
+ }
64
+ catch (_err) {
65
+ return null;
66
+ }
67
+ }
52
68
  // const weakMap = new WeakMap<MdnsDiscoveryConfiguration, BonjourHolder>;
53
69
  class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
54
70
  mDnsLDSAnnouncer;
55
71
  mDnsResponder;
56
72
  registeredServers;
57
73
  _delayInit;
74
+ #allowUnsecuredRegistration;
58
75
  constructor(options) {
59
76
  options.serverInfo = options.serverInfo || {};
60
77
  const serverInfo = options.serverInfo;
@@ -68,8 +85,10 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
68
85
  serverInfo.gatewayServerUri = serverInfo.gatewayServerUri || "";
69
86
  serverInfo.discoveryProfileUri = serverInfo.discoveryProfileUri || "";
70
87
  serverInfo.discoveryUrls = serverInfo.discoveryUrls || [];
71
- options.serverCertificateManager = options.serverCertificateManager || getDefaultCertificateManager();
88
+ options.serverCertificateManager =
89
+ options.serverCertificateManager || getDefaultCertificateManager(!!options.automaticallyAcceptUnknownCertificate);
72
90
  super(options);
91
+ this.#allowUnsecuredRegistration = !!options.allowUnsecuredRegistration;
73
92
  // see OPC UA Spec 1.2 part 6 : 7.4 Well Known Addresses
74
93
  // opc.tcp://localhost:4840/UADiscovery
75
94
  const port = options.port || 4840;
@@ -106,6 +125,7 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
106
125
  await this._delayInit?.();
107
126
  });
108
127
  await new Promise((resolve, reject) => super.start((err) => (err ? reject(err) : resolve())));
128
+ this.#logRegistrationPolicy();
109
129
  const endpointUri = this.getEndpointUrl();
110
130
  const { hostname } = new node_url_1.URL(endpointUri);
111
131
  this.mDnsResponder = new mdns_responder_js_1.MDNSResponder();
@@ -147,12 +167,11 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
147
167
  }
148
168
  // c8 ignore next
149
169
  doDebug && debugLog("Shutting down Discovery Server");
170
+ // OPCUAServerEndPoint#shutdown only calls back once the listening socket has emitted
171
+ // 'close', so the port is free when this resolves: no extra delay is needed.
150
172
  await new Promise((resolve, reject) => super.shutdown((err) => (err ? reject(err) : resolve())));
151
173
  // c8 ignore next
152
174
  doDebug && debugLog("stopping announcement of LDS on mDNS - DONE");
153
- // add a extra delay to ensure that the port is really closed
154
- // and registered server propagated the fact that LDS is not here anymore
155
- await new Promise((resolve) => setTimeout(resolve, 1000));
156
175
  }
157
176
  /**
158
177
  * returns the number of registered servers
@@ -169,10 +188,78 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
169
188
  }
170
189
  return servers;
171
190
  }
191
+ #logRegistrationPolicy() {
192
+ const cm = this.serverCertificateManager;
193
+ if (!cm.automaticallyAcceptUnknownCertificate) {
194
+ warningLog(`LDS: registrations from applications with an unknown certificate are refused.\n` +
195
+ ` To allow a server, move its certificate from ${node_path_1.default.join(cm.rootDir, "rejected")}\n` +
196
+ ` to ${node_path_1.default.join(cm.rootDir, "trusted", "certs")}`);
197
+ }
198
+ else {
199
+ warningLog("LDS: automaticallyAcceptUnknownCertificate is enabled: any application certificate is trusted (not recommended)");
200
+ }
201
+ if (this.#allowUnsecuredRegistration) {
202
+ warningLog("LDS: allowUnsecuredRegistration is enabled: RegisterServer over MessageSecurityMode.None is accepted (not conformant to OPC UA Part 4 §5.5.5)");
203
+ }
204
+ }
205
+ /**
206
+ * Enforce OPC UA Part 4 §5.5.5 / §5.5.6 on a registration request:
207
+ *
208
+ * - "This Service can only be invoked via SecureChannels that support Client authentication."
209
+ * A `MessageSecurityMode.None` channel carries no certificate (Part 4 §5.6.2), so it is refused
210
+ * with `Bad_SecurityModeInsufficient` unless `allowUnsecuredRegistration` is set.
211
+ * `Bad_ServiceUnsupported` is deliberately not used: Part 4 §5.5.6 tells the caller to fall back
212
+ * to `RegisterServer` on that code, which is the wrong signal here.
213
+ *
214
+ * - "Discovery Servers shall reject registrations if the serverUri provided does not match the
215
+ * applicationUri in the Certificate used to create the SecureChannel." -> `Bad_ServerUriInvalid`.
216
+ *
217
+ * The certificate on `channel` was already validated against the trust list at `OpenSecureChannel`.
218
+ */
219
+ #checkRegistrationChannel(channel, server) {
220
+ const clientCertificate = channel.clientCertificate;
221
+ if (channel.securityMode === node_opcua_secure_channel_1.MessageSecurityMode.None || !clientCertificate || clientCertificate.length === 0) {
222
+ if (this.#allowUnsecuredRegistration) {
223
+ warningLog(`LDS: accepting unauthenticated registration of ${server.serverUri} (allowUnsecuredRegistration)`);
224
+ return node_opcua_status_code_1.StatusCodes.Good;
225
+ }
226
+ return node_opcua_status_code_1.StatusCodes.BadSecurityModeInsufficient;
227
+ }
228
+ const uris = extractApplicationUris(clientCertificate);
229
+ if (uris === null) {
230
+ return node_opcua_status_code_1.StatusCodes.BadCertificateInvalid;
231
+ }
232
+ if (!server.serverUri || !uris.includes(server.serverUri)) {
233
+ return node_opcua_status_code_1.StatusCodes.BadServerUriInvalid;
234
+ }
235
+ return node_opcua_status_code_1.StatusCodes.Good;
236
+ }
237
+ #refuseRegistration(message, channel, server, statusCode) {
238
+ const uris = (channel.clientCertificate && extractApplicationUris(channel.clientCertificate)) || [];
239
+ const info = {
240
+ statusCode,
241
+ remoteAddress: channel.remoteAddress,
242
+ remotePort: channel.remotePort,
243
+ securityMode: channel.securityMode,
244
+ certificateApplicationUris: uris
245
+ };
246
+ warningLog(`LDS: registration refused ${statusCode.toString()}: serverUri=${server.serverUri} ` +
247
+ `serverNames=[${(server.serverNames || []).map((n) => n.text).join(", ")}] ` +
248
+ `discoveryUrls=[${(server.discoveryUrls || []).join(", ")}] ` +
249
+ `from ${info.remoteAddress}:${info.remotePort} securityMode=${node_opcua_secure_channel_1.MessageSecurityMode[info.securityMode]} ` +
250
+ `certificateApplicationUris=[${uris.join(", ")}]`);
251
+ this.emit("onRegistrationRefused", server, info);
252
+ const response = new node_opcua_secure_channel_1.ServiceFault({ responseHeader: { serviceResult: statusCode } });
253
+ channel.send_response("MSG", response, message);
254
+ }
172
255
  _on_RegisterServer2Request(message, channel) {
173
256
  (0, node_opcua_assert_1.assert)(message.request instanceof node_opcua_service_discovery_1.RegisterServer2Request);
174
257
  const request = message.request;
175
258
  (0, node_opcua_assert_1.assert)(request.schema.name === "RegisterServer2Request");
259
+ const gate = this.#checkRegistrationChannel(channel, request.server);
260
+ if (gate.isNotGood()) {
261
+ return this.#refuseRegistration(message, channel, request.server, gate);
262
+ }
176
263
  request.discoveryConfiguration = request.discoveryConfiguration || [];
177
264
  this.#internalRegisterServer(node_opcua_service_discovery_1.RegisterServer2Response, request.server, request.discoveryConfiguration)
178
265
  .then((response) => {
@@ -196,6 +283,10 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
196
283
  (0, node_opcua_assert_1.assert)(message.request instanceof node_opcua_service_discovery_1.RegisterServerRequest);
197
284
  const request = message.request;
198
285
  (0, node_opcua_assert_1.assert)(request.schema.name === "RegisterServerRequest");
286
+ const gate = this.#checkRegistrationChannel(channel, request.server);
287
+ if (gate.isNotGood()) {
288
+ return this.#refuseRegistration(message, channel, request.server, gate);
289
+ }
199
290
  this.#internalRegisterServer(node_opcua_service_discovery_1.RegisterServerResponse, request.server, undefined)
200
291
  .then((response) => {
201
292
  channel.send_response("MSG", response, message);
@@ -335,7 +426,10 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
335
426
  // serverCapabilities [] String The set of Server capabilities supported by the Server.
336
427
  // A Server capability is a short identifier for a feature
337
428
  // The set of allowed Server capabilities are defined in Part 12.
338
- discoveryConfiguration.mdnsServerName ??= server1.serverNames?.[0].text || null;
429
+ // an absent name may be null, undefined or "" (the structure default), all mean "not specified"
430
+ if (!discoveryConfiguration.mdnsServerName) {
431
+ discoveryConfiguration.mdnsServerName = server1.serverNames?.[0]?.text || null;
432
+ }
339
433
  serverInfo.discoveryUrls ??= [];
340
434
  const endpointUrl = serverInfo.discoveryUrls[0] || this.getEndpointUrl();
341
435
  const parsedUrl = new node_url_1.URL(endpointUrl);
@@ -477,8 +571,8 @@ class OPCUADiscoveryServer extends node_opcua_server_1.OPCUABaseServer {
477
571
  if (server.discoveryUrls.length === 0 || !server.discoveryUrls[0]) {
478
572
  return sendError(node_opcua_status_code_1.StatusCodes.BadDiscoveryUrlMissing);
479
573
  }
480
- // BadServerUriInvalid
481
- // TODO
574
+ // BadServerUriInvalid (serverUri vs certificate ApplicationUri) is enforced
575
+ // by #checkRegistrationChannel before we get here.
482
576
  // #endregion
483
577
  if (!discoveryConfigurations) {
484
578
  discoveryConfigurations = [
@@ -1 +1 @@
1
- {"version":3,"file":"opcua_discovery_server.js","sourceRoot":"","sources":["../source/opcua_discovery_server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opcua_discovery_server.js","sourceRoot":"","sources":["../source/opcua_discovery_server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-opcua-server-discovery",
3
- "version": "2.181.1",
3
+ "version": "2.182.0",
4
4
  "description": "pure nodejs OPCUA SDK - module server-discovery",
5
5
  "scripts": {
6
6
  "build": "tsc -b",
@@ -14,15 +14,16 @@
14
14
  "chalk": "4.1.2",
15
15
  "env-paths": "2.2.1",
16
16
  "node-opcua-assert": "2.179.0",
17
- "node-opcua-basic-types": "2.181.0",
18
- "node-opcua-certificate-manager": "2.181.0",
19
- "node-opcua-common": "2.181.0",
17
+ "node-opcua-basic-types": "2.182.0",
18
+ "node-opcua-certificate-manager": "2.182.0",
19
+ "node-opcua-common": "2.182.0",
20
+ "node-opcua-crypto": "5.10.1",
20
21
  "node-opcua-debug": "2.181.0",
21
22
  "node-opcua-object-registry": "2.181.0",
22
- "node-opcua-secure-channel": "2.181.1",
23
- "node-opcua-server": "2.181.1",
24
- "node-opcua-service-discovery": "2.181.0",
25
- "node-opcua-service-endpoints": "2.181.0",
23
+ "node-opcua-secure-channel": "2.182.0",
24
+ "node-opcua-server": "2.182.0",
25
+ "node-opcua-service-discovery": "2.182.0",
26
+ "node-opcua-service-endpoints": "2.182.0",
26
27
  "node-opcua-status-code": "2.181.0",
27
28
  "sterfive-bonjour-service": "1.1.4",
28
29
  "thenify-ex": "4.4.0"
@@ -42,7 +43,7 @@
42
43
  "internet of things"
43
44
  ],
44
45
  "homepage": "http://node-opcua.github.io/",
45
- "gitHead": "b3b762ed8259fb8eaec07b8f1e19f920a78e85ca",
46
+ "gitHead": "7172ac8333d34505a72221e8f56e8708c2c96bd7",
46
47
  "files": [
47
48
  "dist",
48
49
  "source"
@@ -11,10 +11,11 @@ import { assert } from "node-opcua-assert";
11
11
  import type { UAString } from "node-opcua-basic-types";
12
12
  import { OPCUACertificateManager } from "node-opcua-certificate-manager";
13
13
  import { makeApplicationUrn } from "node-opcua-common";
14
- import { checkDebugFlag, make_debugLog, make_errorLog } from "node-opcua-debug";
14
+ import { exploreCertificate, split_der } from "node-opcua-crypto";
15
+ import { checkDebugFlag, make_debugLog, make_errorLog, make_warningLog } from "node-opcua-debug";
15
16
  import {
16
17
  type Message,
17
- type MessageSecurityMode,
18
+ MessageSecurityMode,
18
19
  type Response,
19
20
  type SecurityPolicy,
20
21
  type ServerSecureChannelLayer,
@@ -49,6 +50,7 @@ import { MDNSResponder } from "./mdns_responder.js";
49
50
  const debugLog = make_debugLog("LDSSERVER");
50
51
  const doDebug = checkDebugFlag("LDSSERVER");
51
52
  const errorLog = make_errorLog("LDSSERVER");
53
+ const warningLog = make_warningLog("LDSSERVER");
52
54
 
53
55
  function hasCapabilities(serverCapabilities: UAString[] | null, serverCapabilityFilter: string): boolean {
54
56
  if (serverCapabilities == null) {
@@ -67,6 +69,40 @@ export interface OPCUADiscoveryServerOptions extends OPCUABaseServerOptions {
67
69
  securityPolicies?: SecurityPolicy[];
68
70
  securityModes?: MessageSecurityMode[];
69
71
  hostname?: string;
72
+
73
+ /**
74
+ * Accept `RegisterServer` / `RegisterServer2` over a SecureChannel with
75
+ * `MessageSecurityMode.None`, i.e. from a caller that presented no
76
+ * application certificate.
77
+ *
78
+ * OPC UA Part 4 §5.5.5 / §5.5.6 require these services to be invoked
79
+ * over a SecureChannel that authenticates the caller. Enable only for
80
+ * legacy registrants that cannot open a secured channel, on a network
81
+ * you control.
82
+ *
83
+ * The `FindServers`, `FindServersOnNetwork` and `GetEndpoints` services
84
+ * are not affected: they stay available without message security, as
85
+ * Part 4 §5.5.1 requires.
86
+ *
87
+ * @default false
88
+ */
89
+ allowUnsecuredRegistration?: boolean;
90
+
91
+ /**
92
+ * Trust any unknown application certificate presented by a registrant.
93
+ * Only used when `serverCertificateManager` is not provided.
94
+ *
95
+ * When false (the default), a registrant whose certificate is not in the
96
+ * trusted folder is refused at `OpenSecureChannel` and its certificate is
97
+ * placed in the rejected folder; an administrator moves it to the trusted
98
+ * folder to allow the registration. This matches the OPC Foundation
99
+ * UA-LDS default and OPC UA Part 12 §5.3.5, which makes the
100
+ * administrator-managed trust list the primary mechanism for establishing
101
+ * trust between applications.
102
+ *
103
+ * @default false
104
+ */
105
+ automaticallyAcceptUnknownCertificate?: boolean;
70
106
  }
71
107
 
72
108
  interface RegisteredServerExtended extends RegisteredServer {
@@ -88,22 +124,50 @@ const defaultApplicationUri = makeApplicationUrn(os.hostname(), defaultProductUr
88
124
 
89
125
  let _discoveryDefaultCertificateManager: OPCUACertificateManager | undefined;
90
126
 
91
- function getDefaultCertificateManager(): OPCUACertificateManager {
127
+ function getDefaultCertificateManager(automaticallyAcceptUnknownCertificate: boolean): OPCUACertificateManager {
92
128
  if (!_discoveryDefaultCertificateManager) {
93
129
  const config = envPaths(defaultProductUri).config;
94
130
  _discoveryDefaultCertificateManager = new OPCUACertificateManager({
95
131
  name: "PKI",
96
132
  rootFolder: path.join(config, "PKI"),
97
- automaticallyAcceptUnknownCertificate: true
133
+ automaticallyAcceptUnknownCertificate
98
134
  });
99
135
  }
100
136
  _discoveryDefaultCertificateManager.referenceCounter++;
101
137
  return _discoveryDefaultCertificateManager;
102
138
  }
103
139
 
140
+ /**
141
+ * ApplicationUri(s) carried by the SubjectAltName extension of the leaf certificate.
142
+ * Returns `null` when the certificate cannot be parsed.
143
+ */
144
+ function extractApplicationUris(certificateChain: Buffer): string[] | null {
145
+ try {
146
+ const leaf = split_der(certificateChain)[0];
147
+ const info = exploreCertificate(leaf);
148
+ return info.tbsCertificate.extensions?.subjectAltName?.uniformResourceIdentifier ?? [];
149
+ } catch (_err) {
150
+ return null;
151
+ }
152
+ }
153
+
154
+ export interface RegistrationRefusedInfo {
155
+ statusCode: StatusCode;
156
+ remoteAddress: string;
157
+ remotePort: number;
158
+ securityMode: MessageSecurityMode;
159
+ /** ApplicationUri(s) found in the caller's certificate, empty when no certificate was presented */
160
+ certificateApplicationUris: string[];
161
+ }
162
+
104
163
  export interface OPCUADiscoveryServerEvents extends OPCUABaseServerEvents {
105
164
  onUnregisterServer: [server: RegisteredServer, forced: boolean];
106
165
  onRegisterServer: [server: RegisteredServer, firstTime: boolean];
166
+ /**
167
+ * a `RegisterServer` / `RegisterServer2` request was refused before reaching the registry.
168
+ * (OPC UA Part 4 requires Discovery Servers to audit failed registrations.)
169
+ */
170
+ onRegistrationRefused: [server: RegisteredServer, info: RegistrationRefusedInfo];
107
171
  }
108
172
 
109
173
  // const weakMap = new WeakMap<MdnsDiscoveryConfiguration, BonjourHolder>;
@@ -115,6 +179,8 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
115
179
 
116
180
  private _delayInit?: () => Promise<void>;
117
181
 
182
+ readonly #allowUnsecuredRegistration: boolean;
183
+
118
184
  constructor(options: OPCUADiscoveryServerOptions) {
119
185
  options.serverInfo = options.serverInfo || {};
120
186
  const serverInfo = options.serverInfo;
@@ -134,10 +200,13 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
134
200
  serverInfo.discoveryProfileUri = serverInfo.discoveryProfileUri || "";
135
201
  serverInfo.discoveryUrls = serverInfo.discoveryUrls || [];
136
202
 
137
- options.serverCertificateManager = options.serverCertificateManager || getDefaultCertificateManager();
203
+ options.serverCertificateManager =
204
+ options.serverCertificateManager || getDefaultCertificateManager(!!options.automaticallyAcceptUnknownCertificate);
138
205
 
139
206
  super(options);
140
207
 
208
+ this.#allowUnsecuredRegistration = !!options.allowUnsecuredRegistration;
209
+
141
210
  // see OPC UA Spec 1.2 part 6 : 7.4 Well Known Addresses
142
211
  // opc.tcp://localhost:4840/UADiscovery
143
212
  const port = options.port || 4840;
@@ -188,6 +257,8 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
188
257
 
189
258
  await new Promise<void>((resolve, reject) => super.start((err?: Error | null) => (err ? reject(err) : resolve())));
190
259
 
260
+ this.#logRegistrationPolicy();
261
+
191
262
  const endpointUri = this.getEndpointUrl();
192
263
  const { hostname } = new URL(endpointUri);
193
264
 
@@ -236,12 +307,11 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
236
307
 
237
308
  // c8 ignore next
238
309
  doDebug && debugLog("Shutting down Discovery Server");
310
+ // OPCUAServerEndPoint#shutdown only calls back once the listening socket has emitted
311
+ // 'close', so the port is free when this resolves: no extra delay is needed.
239
312
  await new Promise<void>((resolve, reject) => super.shutdown((err) => (err ? reject(err) : resolve())));
240
313
  // c8 ignore next
241
314
  doDebug && debugLog("stopping announcement of LDS on mDNS - DONE");
242
- // add a extra delay to ensure that the port is really closed
243
- // and registered server propagated the fact that LDS is not here anymore
244
- await new Promise<void>((resolve) => setTimeout(resolve, 1000));
245
315
  }
246
316
 
247
317
  /**
@@ -264,12 +334,98 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
264
334
  return servers;
265
335
  }
266
336
 
337
+ #logRegistrationPolicy(): void {
338
+ const cm = this.serverCertificateManager as OPCUACertificateManager;
339
+ if (!cm.automaticallyAcceptUnknownCertificate) {
340
+ warningLog(
341
+ `LDS: registrations from applications with an unknown certificate are refused.\n` +
342
+ ` To allow a server, move its certificate from ${path.join(cm.rootDir, "rejected")}\n` +
343
+ ` to ${path.join(cm.rootDir, "trusted", "certs")}`
344
+ );
345
+ } else {
346
+ warningLog(
347
+ "LDS: automaticallyAcceptUnknownCertificate is enabled: any application certificate is trusted (not recommended)"
348
+ );
349
+ }
350
+ if (this.#allowUnsecuredRegistration) {
351
+ warningLog(
352
+ "LDS: allowUnsecuredRegistration is enabled: RegisterServer over MessageSecurityMode.None is accepted (not conformant to OPC UA Part 4 §5.5.5)"
353
+ );
354
+ }
355
+ }
356
+
357
+ /**
358
+ * Enforce OPC UA Part 4 §5.5.5 / §5.5.6 on a registration request:
359
+ *
360
+ * - "This Service can only be invoked via SecureChannels that support Client authentication."
361
+ * A `MessageSecurityMode.None` channel carries no certificate (Part 4 §5.6.2), so it is refused
362
+ * with `Bad_SecurityModeInsufficient` unless `allowUnsecuredRegistration` is set.
363
+ * `Bad_ServiceUnsupported` is deliberately not used: Part 4 §5.5.6 tells the caller to fall back
364
+ * to `RegisterServer` on that code, which is the wrong signal here.
365
+ *
366
+ * - "Discovery Servers shall reject registrations if the serverUri provided does not match the
367
+ * applicationUri in the Certificate used to create the SecureChannel." -> `Bad_ServerUriInvalid`.
368
+ *
369
+ * The certificate on `channel` was already validated against the trust list at `OpenSecureChannel`.
370
+ */
371
+ #checkRegistrationChannel(channel: ServerSecureChannelLayer, server: RegisteredServer): StatusCode {
372
+ const clientCertificate = channel.clientCertificate;
373
+
374
+ if (channel.securityMode === MessageSecurityMode.None || !clientCertificate || clientCertificate.length === 0) {
375
+ if (this.#allowUnsecuredRegistration) {
376
+ warningLog(`LDS: accepting unauthenticated registration of ${server.serverUri} (allowUnsecuredRegistration)`);
377
+ return StatusCodes.Good;
378
+ }
379
+ return StatusCodes.BadSecurityModeInsufficient;
380
+ }
381
+
382
+ const uris = extractApplicationUris(clientCertificate);
383
+ if (uris === null) {
384
+ return StatusCodes.BadCertificateInvalid;
385
+ }
386
+ if (!server.serverUri || !uris.includes(server.serverUri)) {
387
+ return StatusCodes.BadServerUriInvalid;
388
+ }
389
+ return StatusCodes.Good;
390
+ }
391
+
392
+ #refuseRegistration(
393
+ message: Message,
394
+ channel: ServerSecureChannelLayer,
395
+ server: RegisteredServer,
396
+ statusCode: StatusCode
397
+ ): void {
398
+ const uris = (channel.clientCertificate && extractApplicationUris(channel.clientCertificate)) || [];
399
+ const info: RegistrationRefusedInfo = {
400
+ statusCode,
401
+ remoteAddress: channel.remoteAddress,
402
+ remotePort: channel.remotePort,
403
+ securityMode: channel.securityMode,
404
+ certificateApplicationUris: uris
405
+ };
406
+ warningLog(
407
+ `LDS: registration refused ${statusCode.toString()}: serverUri=${server.serverUri} ` +
408
+ `serverNames=[${(server.serverNames || []).map((n) => n.text).join(", ")}] ` +
409
+ `discoveryUrls=[${(server.discoveryUrls || []).join(", ")}] ` +
410
+ `from ${info.remoteAddress}:${info.remotePort} securityMode=${MessageSecurityMode[info.securityMode]} ` +
411
+ `certificateApplicationUris=[${uris.join(", ")}]`
412
+ );
413
+ this.emit("onRegistrationRefused", server, info);
414
+ const response = new ServiceFault({ responseHeader: { serviceResult: statusCode } });
415
+ channel.send_response("MSG", response, message);
416
+ }
417
+
267
418
  protected _on_RegisterServer2Request(message: Message, channel: ServerSecureChannelLayer) {
268
419
  assert(message.request instanceof RegisterServer2Request);
269
420
  const request = message.request as RegisterServer2Request;
270
421
 
271
422
  assert(request.schema.name === "RegisterServer2Request");
272
423
 
424
+ const gate = this.#checkRegistrationChannel(channel, request.server);
425
+ if (gate.isNotGood()) {
426
+ return this.#refuseRegistration(message, channel, request.server, gate);
427
+ }
428
+
273
429
  request.discoveryConfiguration = request.discoveryConfiguration || [];
274
430
  this.#internalRegisterServer(
275
431
  RegisterServer2Response,
@@ -299,6 +455,12 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
299
455
  assert(message.request instanceof RegisterServerRequest);
300
456
  const request = message.request as RegisterServerRequest;
301
457
  assert(request.schema.name === "RegisterServerRequest");
458
+
459
+ const gate = this.#checkRegistrationChannel(channel, request.server);
460
+ if (gate.isNotGood()) {
461
+ return this.#refuseRegistration(message, channel, request.server, gate);
462
+ }
463
+
302
464
  this.#internalRegisterServer(RegisterServerResponse, request.server, undefined)
303
465
  .then((response) => {
304
466
  channel.send_response("MSG", response, message);
@@ -464,7 +626,10 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
464
626
  // serverCapabilities [] String The set of Server capabilities supported by the Server.
465
627
  // A Server capability is a short identifier for a feature
466
628
  // The set of allowed Server capabilities are defined in Part 12.
467
- discoveryConfiguration.mdnsServerName ??= server1.serverNames?.[0].text || null;
629
+ // an absent name may be null, undefined or "" (the structure default), all mean "not specified"
630
+ if (!discoveryConfiguration.mdnsServerName) {
631
+ discoveryConfiguration.mdnsServerName = server1.serverNames?.[0]?.text || null;
632
+ }
468
633
 
469
634
  serverInfo.discoveryUrls ??= [];
470
635
 
@@ -636,8 +801,8 @@ export class OPCUADiscoveryServer extends OPCUABaseServer<OPCUADiscoveryServerEv
636
801
  return sendError(StatusCodes.BadDiscoveryUrlMissing);
637
802
  }
638
803
 
639
- // BadServerUriInvalid
640
- // TODO
804
+ // BadServerUriInvalid (serverUri vs certificate ApplicationUri) is enforced
805
+ // by #checkRegistrationChannel before we get here.
641
806
  // #endregion
642
807
 
643
808
  if (!discoveryConfigurations) {