node-opcua-server-discovery 2.181.1 → 2.182.2
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,
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
//
|
|
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.
|
|
3
|
+
"version": "2.182.2",
|
|
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.
|
|
18
|
-
"node-opcua-certificate-manager": "2.
|
|
19
|
-
"node-opcua-common": "2.
|
|
17
|
+
"node-opcua-basic-types": "2.182.0",
|
|
18
|
+
"node-opcua-certificate-manager": "2.182.1",
|
|
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.
|
|
23
|
-
"node-opcua-server": "2.
|
|
24
|
-
"node-opcua-service-discovery": "2.
|
|
25
|
-
"node-opcua-service-endpoints": "2.
|
|
23
|
+
"node-opcua-secure-channel": "2.182.1",
|
|
24
|
+
"node-opcua-server": "2.182.2",
|
|
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": "
|
|
46
|
+
"gitHead": "cb72d06e8bcb611479f44f9f45f67bbee93bc32e",
|
|
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 {
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
//
|
|
804
|
+
// BadServerUriInvalid (serverUri vs certificate ApplicationUri) is enforced
|
|
805
|
+
// by #checkRegistrationChannel before we get here.
|
|
641
806
|
// #endregion
|
|
642
807
|
|
|
643
808
|
if (!discoveryConfigurations) {
|