@vitormnm/node-red-simple-opcua 1.6.3 → 1.8.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.
Files changed (45) hide show
  1. package/README.md +104 -136
  2. package/client/lib/opcua-client-browser.js +254 -11
  3. package/client/lib/opcua-client-method-service.js +1 -1
  4. package/client/lib/opcua-client-subscription-service.js +0 -2
  5. package/client/lib/opcua-client-write-service.js +14 -4
  6. package/client/opcua-client-config.html +118 -1
  7. package/client/opcua-client-config.js +112 -9
  8. package/client/opcua-client-help.html +6 -0
  9. package/client/opcua-client-utils.js +158 -10
  10. package/client/opcua-client.html +8 -0
  11. package/client/opcua-client.js +97 -1
  12. package/client/view/opcua-client.js +106 -14
  13. package/examples/flows_simple_opc.json +1 -1
  14. package/package.json +2 -2
  15. package/server/lib/opcua-address-space-alarm.js +95 -32
  16. package/server/lib/opcua-address-space-builder.js +717 -59
  17. package/server/lib/opcua-config.js +110 -35
  18. package/server/lib/opcua-server-events-child.js +31 -5
  19. package/server/lib/opcua-server-runtime-child.js +424 -27
  20. package/server/lib/opcua-server-runtime.js +52 -5
  21. package/server/lib/opcua-server-status-child.js +46 -15
  22. package/server/nodered/simple_opcua/server/certificates/mutex +0 -0
  23. package/server/nodered/simple_opcua/server/certificates/own/certs/server_selfsigned_cert_2048.pem +25 -0
  24. package/server/nodered/simple_opcua/server/certificates/own/certs/server_selfsigned_cert_2048.pem.mutex +0 -0
  25. package/server/nodered/simple_opcua/server/certificates/own/openssl.cnf +72 -0
  26. package/server/nodered/simple_opcua/server/certificates/own/private/private_key.pem +28 -0
  27. package/server/nodered/simple_opcua/server/certificates/trusted/certs/NodeOPCUA-Client@tuf[c5a9e20a8b680cdff76aaf0165bb3c9318da37a5].pem +25 -0
  28. package/server/nodered/simple_opcua/server/myServer1/mutex +0 -0
  29. package/server/nodered/simple_opcua/server/myServer1/own/certs/server_selfsigned_cert_2048.pem +25 -0
  30. package/server/nodered/simple_opcua/server/myServer1/own/certs/server_selfsigned_cert_2048.pem.mutex +0 -0
  31. package/server/nodered/simple_opcua/server/myServer1/own/openssl.cnf +72 -0
  32. package/server/nodered/simple_opcua/server/myServer1/own/private/private_key.pem +28 -0
  33. package/server/nodered/simple_opcua/server/myServer1/trusted/certs/NodeOPCUA-Client@tuf[91e520c64ff891c67168f08a46dd194071e15dae].pem +25 -0
  34. package/server/nodered/simple_opcua/server/myServer1/trusted/certs/NodeOPCUA-Client@tuf[98ae95da627cea4c500753c319161a3554ee38d7].pem +25 -0
  35. package/server/nodered/simple_opcua/server/myServer1/trusted/certs/NodeOPCUA-Client@tuf[aef8d7a1cfba13d84189a0bcf1694208fc51a7f9].pem +25 -0
  36. package/server/nodered/simple_opcua/server/myServer1/trusted/certs/NodeOPCUA-Client@tuf[c5a9e20a8b680cdff76aaf0165bb3c9318da37a5].pem +25 -0
  37. package/server/nodered/simple_opcua/server/myServer1/trusted/certs/NodeOPCUA-Client@tuf[ebdf9acf1d02e347917a14108d3144799c638ea3].pem +25 -0
  38. package/server/opcua-server-io.html +93 -1
  39. package/server/opcua-server-io.js +153 -29
  40. package/server/opcua-server-registry.js +8 -2
  41. package/server/opcua-server.css +64 -0
  42. package/server/opcua-server.html +168 -44
  43. package/server/opcua-server.js +115 -5
  44. package/server/view/opcua-server.css +100 -6
  45. package/server/view/opcua-server.js +746 -48
@@ -10,13 +10,6 @@ function OpcUaServerStatusNode(node, msg, nodeId) {
10
10
  const serverNode = resolveRegisteredServer(node, msg, registry);
11
11
  const snapshot = buildServerSnapshot(serverNode);
12
12
 
13
- msg.payload = snapshot;
14
- msg.opcua = msg.opcua || {};
15
- msg.opcua.server = snapshot.identity.serverRef;
16
- msg.opcua.endpointUrl = snapshot.endpointUrl;
17
-
18
-
19
-
20
13
  process.send({
21
14
  type: "status",
22
15
  data: {
@@ -27,11 +20,18 @@ function OpcUaServerStatusNode(node, msg, nodeId) {
27
20
  nodeId: nodeId
28
21
  });
29
22
 
30
- process.send({
31
- type: "send",
32
- data: msg,
33
- nodeId: nodeId
34
- });
23
+ if (msg) {
24
+ msg.payload = snapshot;
25
+ msg.opcua = msg.opcua || {};
26
+ msg.opcua.server = snapshot.identity.serverRef;
27
+ msg.opcua.endpointUrl = snapshot.endpointUrl;
28
+
29
+ process.send({
30
+ type: "send",
31
+ data: msg,
32
+ nodeId: nodeId
33
+ });
34
+ }
35
35
 
36
36
 
37
37
  } catch (error) {
@@ -41,9 +41,9 @@ function OpcUaServerStatusNode(node, msg, nodeId) {
41
41
  process.send({
42
42
  type: "status",
43
43
  data: {
44
- fill: "red",
44
+ fill: msg ? "red" : "yellow",
45
45
  shape: "ring",
46
- text: "Status: " + error
46
+ text: msg ? "Status: " + error.message : "waiting for server"
47
47
  },
48
48
  nodeId: nodeId
49
49
  });
@@ -99,10 +99,41 @@ function buildServerSnapshot(serverNode) {
99
99
  },
100
100
  endpoints: Array.isArray(server.endpoints)
101
101
  ? server.endpoints.map((endpoint) => buildEndpointSnapshot(endpoint))
102
- : []
102
+ : [],
103
+ users: buildUsersSnapshot(serverNode),
104
+ groups: buildGroupsSnapshot(serverNode)
103
105
  };
104
106
  }
105
107
 
108
+ function buildUsersSnapshot(serverNode) {
109
+ const rawUsers = Array.isArray(serverNode.users) ? serverNode.users : [];
110
+ const allowAnonymous = Boolean(serverNode.allowAnonymous);
111
+
112
+ const result = rawUsers.map((user) => ({
113
+ name: extractText(user && user.username),
114
+ groups: resolveUserGroups(user, serverNode.groups)
115
+ }));
116
+
117
+ if (allowAnonymous) {
118
+ result.unshift({ name: "anonymous", groups: [] });
119
+ }
120
+
121
+ return result;
122
+ }
123
+
124
+ function buildGroupsSnapshot(serverNode) {
125
+ const rawGroups = Array.isArray(serverNode.groups) ? serverNode.groups : [];
126
+ return rawGroups.map((g) => extractText(g && (g.name || g))).filter(Boolean);
127
+ }
128
+
129
+ function resolveUserGroups(user, rawGroups) {
130
+ if (!user) return [];
131
+ // normalizeUser stores groups as user.group (comma-separated string)
132
+ const groupsStr = extractText(user.group);
133
+ if (!groupsStr) return [];
134
+ return groupsStr.split(",").map((g) => g.trim()).filter(Boolean);
135
+ }
136
+
106
137
  function buildEndpointSnapshot(endpoint) {
107
138
  const descriptions = typeof endpoint.endpointDescriptions === "function"
108
139
  ? endpoint.endpointDescriptions()
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIENTCCAx2gAwIBAgIHAXgZZJFWWTANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxFjAUBgNV
4
+ BAMMDW15U2VydmVyMUB0dWYwHhcNMjYwNjIwMTQxNTE1WhcNMzYwNjE3MTQxNTE1
5
+ WjBKMQswCQYDVQQGEwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3Rl
6
+ cmZpdmUxFjAUBgNVBAMMDW15U2VydmVyMUB0dWYwggEiMA0GCSqGSIb3DQEBAQUA
7
+ A4IBDwAwggEKAoIBAQC7IYbSbk1mosq3NdM494XdHfuLulEf07RmRRcXhv53/iPC
8
+ HTzTpyyaT9P2KItUEMf1+1m26O53gl8BlwbS+oCuDt34ORO0dWDoftgBXjP0uUWz
9
+ seaZ7AVwXL1yorYAK11VLHU4cxfzVLKK5WbiB+qEiQSUG+EKHlEtmyIEbrsOGh8s
10
+ ZZCE4rFjavzSaCGN7bwqNMtGyFPS5FGZ8HvvtLqhzyz0ew0TaZKpnaFQGxtvGI68
11
+ 6yICgutmSXqyII8OHCXQ751gLzbhvADVUf/CvhX60ZCDMcGBQcFeLPkZF4CfQ2OP
12
+ 2OZkm/2ulS+NZXWqDFX6pvN/Zsy57q4RKR+x+nDFAgMBAAGjggEeMIIBGjBVBglg
13
+ hkgBhvhCAQ0ESAxGU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZ2VuZXJhdGVkIGJ5
14
+ IE5vZGUtT1BDVUEgQ2VydGlmaWNhdGUgdXRpbGl0eSBWMjAMBgNVHRMBAf8EAjAA
15
+ MCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAOBgNVHQ8BAf8EBAMC
16
+ AvQwHQYDVR0OBBYEFF3kmynfd5siPu9cso8NLIdURx8+MB8GA1UdIwQYMBaAFF3k
17
+ mynfd5siPu9cso8NLIdURx8+MEEGA1UdEQQ6MDiCA1RVRoIDdHVmhwTAqGQBhwTA
18
+ qA9khwTAqBEBhhp1cm46dHVmOm5vZGUtcmVkOm15c2VydmVyMTANBgkqhkiG9w0B
19
+ AQsFAAOCAQEAkDutnUHoeK6CQmYlTV2pJPW+1qcJ9QDCrDEJjoMReWY97CQqrPxm
20
+ 9/nTQtPiHedsiF7LbOqsPpiK/chEACSaQO+OYzGtMydKehlC89KUG26TH+OgtVjM
21
+ zVi3sfSpo33jJ1T1Z8YKw9rnOfjkWzfMa6RW4+4p1DNR4RJcvKsNRTkh/C8RDFr0
22
+ ZPave1jxaYpxPQGHKD1lqQD6uIGaYwAogkQDn41Bl1/PwC79gOgs0WmKDZuQ3BpR
23
+ wGSa6Bcqzj3zzBQapSs5fFjuUyowaFsGI48N3mJJx4LlYB17yuOD5R6a6nzVJyaL
24
+ QsKqGvKkNFP0c3F1H+pkUGFGgR9PkkA5Xg==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,72 @@
1
+ ##################################################################################################
2
+ ## SIMPLE OPENSSL CONFIG FILE FOR SELF-SIGNED CERTIFICATE GENERATION
3
+ ################################################################################################################
4
+
5
+ distinguished_name = req_distinguished_name
6
+ default_md = sha1
7
+
8
+ default_md = sha256 # The default digest algorithm
9
+
10
+ [ v3_ca ]
11
+ subjectKeyIdentifier = hash
12
+ authorityKeyIdentifier = keyid:always,issuer:always
13
+
14
+ # authorityKeyIdentifier = keyid
15
+ basicConstraints = CA:TRUE
16
+ keyUsage = critical, cRLSign, keyCertSign
17
+ nsComment = "Self-signed Certificate for CA generated by Node-OPCUA Certificate utility"
18
+ #nsCertType = sslCA, emailCA
19
+ #subjectAltName = email:copy
20
+ #issuerAltName = issuer:copy
21
+ #obj = DER:02:03
22
+ # crlDistributionPoints = @crl_info
23
+ # [ crl_info ]
24
+ # URI.0 = http://localhost:8900/crl.pem
25
+ subjectAltName = $ENV::ALTNAME
26
+
27
+ [ req ]
28
+ days = 390
29
+ req_extensions = v3_req
30
+ x509_extensions = v3_ca
31
+
32
+ [v3_req]
33
+ basicConstraints = CA:false
34
+ keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
35
+ subjectAltName = $ENV::ALTNAME
36
+
37
+ [ v3_ca_signed]
38
+ subjectKeyIdentifier = hash
39
+ authorityKeyIdentifier = keyid,issuer
40
+ basicConstraints = critical, CA:FALSE
41
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
42
+ extendedKeyUsage = clientAuth,serverAuth
43
+ nsComment = "certificate generated by Node-OPCUA Certificate utility and signed by a CA"
44
+ subjectAltName = $ENV::ALTNAME
45
+ [ v3_selfsigned]
46
+ subjectKeyIdentifier = hash
47
+ authorityKeyIdentifier = keyid,issuer
48
+ basicConstraints = critical, CA:FALSE
49
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
50
+ extendedKeyUsage = clientAuth,serverAuth
51
+ nsComment = "Self-signed certificate generated by Node-OPCUA Certificate utility"
52
+ subjectAltName = $ENV::ALTNAME
53
+ [ req_distinguished_name ]
54
+ countryName = Country Name (2 letter code)
55
+ countryName_default = FR
56
+ countryName_min = 2
57
+ countryName_max = 2
58
+ # stateOrProvinceName = State or Province Name (full name)
59
+ # stateOrProvinceName_default = Ile de France
60
+ # localityName = Locality Name (city, district)
61
+ # localityName_default = Paris
62
+ organizationName = Organization Name (company)
63
+ organizationName_default = NodeOPCUA
64
+ # organizationalUnitName = Organizational Unit Name (department, division)
65
+ # organizationalUnitName_default = R&D
66
+ commonName = Common Name (hostname, FQDN, IP, or your name)
67
+ commonName_max = 256
68
+ commonName_default = NodeOPCUA
69
+ # emailAddress = Email Address
70
+ # emailAddress_max = 40
71
+ # emailAddress_default = node-opcua (at) node-opcua (dot) com
72
+ subjectAltName = $ENV::ALTNAME
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7IYbSbk1mosq3
3
+ NdM494XdHfuLulEf07RmRRcXhv53/iPCHTzTpyyaT9P2KItUEMf1+1m26O53gl8B
4
+ lwbS+oCuDt34ORO0dWDoftgBXjP0uUWzseaZ7AVwXL1yorYAK11VLHU4cxfzVLKK
5
+ 5WbiB+qEiQSUG+EKHlEtmyIEbrsOGh8sZZCE4rFjavzSaCGN7bwqNMtGyFPS5FGZ
6
+ 8HvvtLqhzyz0ew0TaZKpnaFQGxtvGI686yICgutmSXqyII8OHCXQ751gLzbhvADV
7
+ Uf/CvhX60ZCDMcGBQcFeLPkZF4CfQ2OP2OZkm/2ulS+NZXWqDFX6pvN/Zsy57q4R
8
+ KR+x+nDFAgMBAAECggEAGofM0Q3BXIFNAz+W1DdHm8tR7AP812nQ5ET8WqIRdtqp
9
+ oC47/vfvG2ug7f/ejQsaBnZdyFBq6repl5Sda5EHaGYEM1qIQCf6FsxQ/JSqAhK4
10
+ XpskygLL3JvRYizOZ+S+BULZ1ah/p0iFTarrdLVRmvvAEe2H8MLOmIwrfPxj+cId
11
+ Lb02xSX3FEf7TC4fUkTJQP52PDNT/oIZhUE807tBmlCLhAIKg3DaZhnAXILpY9q6
12
+ HWbR1lZffzz912XY2fOeHhZI6yKH2BcciVMbP3MEuFLaEQKyYpQCYIraBlcYcGNT
13
+ 8pyIPBukaejOJ08MHZQrh6PFYzZrISRJHVriFYDfuwKBgQDm3T1UOq3DBOOo7TvG
14
+ VgNSfxZaXRCAua12qM9f0iz7DA5waFQ8l+0oHcBikRtuvaxGq9kfmINFqUQEow4w
15
+ YXloR5AdNgub4Q8Wb/kMYr1Qq750q5MvavhxT2PKNzONQ5f0g9E2DciSVoZeVSK4
16
+ 6q+ZyuodXw2ahLS5pJUSBCCFIwKBgQDPgVUakeePBL+g0Oy5i8DuuTErj1h2J/dA
17
+ IYDvA3MvccQMJNf1tKkDfTdXZd/CG4JL5JNYlCzPT7V2KInXrL8sFWi6/Y+t1MXA
18
+ E+LHI33Il4jbBBvWx9ItyBS6oouANGaO4pQZL0c720hGffK246P0RiER8T1fdeS3
19
+ JPv+ylPU9wKBgDeQFbuY58sg+R3mAtXoS6JmPd3/ugIRLiN523cnYXYGX89D/Moc
20
+ kpJuHqhaXizX74eOwpHtJeL1Kw6mo7qXKx4i4xd0s3SPxQ7UYi9N8FxjCVKRHLpz
21
+ 11mGDvFTOdAM7ZyGwSpuRNCbjHlVqiaxLRQplxD8mIyQ1eI8LziHz7/bAoGBAMBy
22
+ VWh/+v8ES2kteu8Wcwe0D6szlbp3lHMQ35BMZc6Rt13/6Z6CP+Hxhpry65QNiUkz
23
+ o4gaXHikl0oPjM/O8bpD3M7XjSKN3B0pFEDWZLjd+VoOtHb8+avmDXuOdsyfTKKl
24
+ 9u5oj6su0xg1hR4jf5J0XAVU9DONlmJY1bFXGmq/AoGAZmCwBdOA830uETdh3AOb
25
+ cI8F1SozJOqGbTrl7GzyzOUvFxsMkD9NOHCI4LD6sDRdJM1CE1As33hNKG2v9B+C
26
+ /MTpbWsTWCAmMhAy7QUXMqDq/g5J2WbfhcXErGps4fQxJzVt1sapedIzFBw9m5XP
27
+ QVMSTmXF6C3wg3QbzTVsQTM=
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXdVh2g4JzANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDQwNzE4NDgwM1oXDTM2MDQw
5
+ NDE4NDgwM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMhBslFMtRXQ2Ww7JAtPLoM7I1s
8
+ QP7mmHOv0U7mcSLib/yksMNT0G2U5J1EHI+Km1JwTYXujJnzi/ouuuQsWUsm3zP6
9
+ KAO1XzQuIYf8iEBblzOCA53eTvo056zNfeDoUb9l1CfQH/H6sL2js786dUpuJCG9
10
+ fuCfgrExRbzZQrELcduwRPuVio770NK086orAzFIXaRM20F4HMkTtorsRoGUIU5s
11
+ u6Fqy9nmdKY4w4JHQMafO3L1lHEbGuVwZmmkXmTQtBIS6W8tPSa9fh7GrlHJP4Zc
12
+ cgcp/xuXcpWfHjJaAmUQtCuNprlywJBChlstWkJ09zj1VvqoAWd0GL7ehQkCAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQUVOT0LzYI7XAMQ11FOV/+tUCUkvYw
17
+ HwYDVR0jBBgwFoAUVOT0LzYI7XAMQ11FOV/+tUCUkvYwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBABiN
19
+ x0XNf1nDyRyJQCQ4GMS9e/xrjO3FV106IJRPEosoB10R7zBL92ra4+3AilGnNOeM
20
+ 1O5eIel67DNL2kjw+5ggagtOmhJ3g3ZXFMpF08BeKnMwavoLs74yBZVFDq+2fOxs
21
+ kDdMX5TOpC4kZHMG5G9Cha9mcWjYSAYWVko/WCfby4D+MQiwraAraDL12uFcRVnP
22
+ htDTuNxs+dfKefiIsTgSlkJMisfGEV/EzmwSsTpvtuUZ5DwKddolRGsB/cXqTjc0
23
+ vGxHFjsuqp77gUyb9LNqE8ENi7pOZQFFhAmjSXTXcklWVynycgQ1E0TSNNQio4Xi
24
+ QZtA1NgPnLI6b2kubUQ=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIENTCCAx2gAwIBAgIHAXgjVGSHQzANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxFjAUBgNV
4
+ BAMMDW15U2VydmVyMUB0dWYwHhcNMjYwNjI1MDIzMDQ4WhcNMzYwNjIyMDIzMDQ4
5
+ WjBKMQswCQYDVQQGEwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3Rl
6
+ cmZpdmUxFjAUBgNVBAMMDW15U2VydmVyMUB0dWYwggEiMA0GCSqGSIb3DQEBAQUA
7
+ A4IBDwAwggEKAoIBAQDMu7IcLcSMHB8XwnAXhhsbSwixcERQNxvcFD9Gw5IKKm0W
8
+ MCQBxLfBnKtaM0JwgltKdtPAGuRnzvu0/SzXNN5gYknzeRBkHG576Xvsry3qEikS
9
+ vmF8xGSsXhoIm8oSOcPtrhAGk0C09ihLQ7KrACHWzt6jNfqTP+954lMsmMMgXXUj
10
+ F5Z7oxYFqj0zh483Zl+pOPYLvh5ReCVT873RNO84OsxREVAhE+047+BXJvLciYBc
11
+ 23OvtVmlguzRWVXQ7vqXHRgZv7csP8qPpoh9LzpB268ygiE7GSIr0R5GIRWGTZRG
12
+ Td6cOJGEP0jsKYcXByDAuzd4kzEBB4c9vHCkO76BAgMBAAGjggEeMIIBGjBVBglg
13
+ hkgBhvhCAQ0ESAxGU2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZ2VuZXJhdGVkIGJ5
14
+ IE5vZGUtT1BDVUEgQ2VydGlmaWNhdGUgdXRpbGl0eSBWMjAMBgNVHRMBAf8EAjAA
15
+ MCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAOBgNVHQ8BAf8EBAMC
16
+ AvQwHQYDVR0OBBYEFGdDutMKGJuBWyphlYeXv7kBCk+XMB8GA1UdIwQYMBaAFGdD
17
+ utMKGJuBWyphlYeXv7kBCk+XMEEGA1UdEQQ6MDiCA1RVRoIDdHVmhwTAqGQBhwTA
18
+ qA9khwTAqBEBhhp1cm46dHVmOm5vZGUtcmVkOm15c2VydmVyMTANBgkqhkiG9w0B
19
+ AQsFAAOCAQEAdFE1PbfbR7vGR8mOb2t4g/M4Z1TmFqSLsq1CG1KHthcIDTgT3tvV
20
+ SplsUWwmBr6yvrwkRNuE5MsSbakblr5C/lpNKZbzPQ9Yci7ss+Yl2e9jDP0Wp+CG
21
+ onOmTz1X1S3hMMcrSdC/JvmkbUIM78s06XIXGSCoEKJHTNRLPhAbE9iOagFEcXRC
22
+ JPMphoKmWyIhHwAbmhm05aljax4SanI6szMpk5+tOgeIcQ9nYq4vjTVOxQ+Sc897
23
+ 0HODJS6GmW/i4IhFYcaEB736X31Ssd62lyDddVh2zE5Ug3A6khrbPF3soDCR52+c
24
+ lZ6myJBVO3kSHeKBzXPFNDe1LWcffk4khA==
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,72 @@
1
+ ##################################################################################################
2
+ ## SIMPLE OPENSSL CONFIG FILE FOR SELF-SIGNED CERTIFICATE GENERATION
3
+ ################################################################################################################
4
+
5
+ distinguished_name = req_distinguished_name
6
+ default_md = sha1
7
+
8
+ default_md = sha256 # The default digest algorithm
9
+
10
+ [ v3_ca ]
11
+ subjectKeyIdentifier = hash
12
+ authorityKeyIdentifier = keyid:always,issuer:always
13
+
14
+ # authorityKeyIdentifier = keyid
15
+ basicConstraints = CA:TRUE
16
+ keyUsage = critical, cRLSign, keyCertSign
17
+ nsComment = "Self-signed Certificate for CA generated by Node-OPCUA Certificate utility"
18
+ #nsCertType = sslCA, emailCA
19
+ #subjectAltName = email:copy
20
+ #issuerAltName = issuer:copy
21
+ #obj = DER:02:03
22
+ # crlDistributionPoints = @crl_info
23
+ # [ crl_info ]
24
+ # URI.0 = http://localhost:8900/crl.pem
25
+ subjectAltName = $ENV::ALTNAME
26
+
27
+ [ req ]
28
+ days = 390
29
+ req_extensions = v3_req
30
+ x509_extensions = v3_ca
31
+
32
+ [v3_req]
33
+ basicConstraints = CA:false
34
+ keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
35
+ subjectAltName = $ENV::ALTNAME
36
+
37
+ [ v3_ca_signed]
38
+ subjectKeyIdentifier = hash
39
+ authorityKeyIdentifier = keyid,issuer
40
+ basicConstraints = critical, CA:FALSE
41
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
42
+ extendedKeyUsage = clientAuth,serverAuth
43
+ nsComment = "certificate generated by Node-OPCUA Certificate utility and signed by a CA"
44
+ subjectAltName = $ENV::ALTNAME
45
+ [ v3_selfsigned]
46
+ subjectKeyIdentifier = hash
47
+ authorityKeyIdentifier = keyid,issuer
48
+ basicConstraints = critical, CA:FALSE
49
+ keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
50
+ extendedKeyUsage = clientAuth,serverAuth
51
+ nsComment = "Self-signed certificate generated by Node-OPCUA Certificate utility"
52
+ subjectAltName = $ENV::ALTNAME
53
+ [ req_distinguished_name ]
54
+ countryName = Country Name (2 letter code)
55
+ countryName_default = FR
56
+ countryName_min = 2
57
+ countryName_max = 2
58
+ # stateOrProvinceName = State or Province Name (full name)
59
+ # stateOrProvinceName_default = Ile de France
60
+ # localityName = Locality Name (city, district)
61
+ # localityName_default = Paris
62
+ organizationName = Organization Name (company)
63
+ organizationName_default = NodeOPCUA
64
+ # organizationalUnitName = Organizational Unit Name (department, division)
65
+ # organizationalUnitName_default = R&D
66
+ commonName = Common Name (hostname, FQDN, IP, or your name)
67
+ commonName_max = 256
68
+ commonName_default = NodeOPCUA
69
+ # emailAddress = Email Address
70
+ # emailAddress_max = 40
71
+ # emailAddress_default = node-opcua (at) node-opcua (dot) com
72
+ subjectAltName = $ENV::ALTNAME
@@ -0,0 +1,28 @@
1
+ -----BEGIN PRIVATE KEY-----
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDMu7IcLcSMHB8X
3
+ wnAXhhsbSwixcERQNxvcFD9Gw5IKKm0WMCQBxLfBnKtaM0JwgltKdtPAGuRnzvu0
4
+ /SzXNN5gYknzeRBkHG576Xvsry3qEikSvmF8xGSsXhoIm8oSOcPtrhAGk0C09ihL
5
+ Q7KrACHWzt6jNfqTP+954lMsmMMgXXUjF5Z7oxYFqj0zh483Zl+pOPYLvh5ReCVT
6
+ 873RNO84OsxREVAhE+047+BXJvLciYBc23OvtVmlguzRWVXQ7vqXHRgZv7csP8qP
7
+ poh9LzpB268ygiE7GSIr0R5GIRWGTZRGTd6cOJGEP0jsKYcXByDAuzd4kzEBB4c9
8
+ vHCkO76BAgMBAAECggEAOYvEe4EtzsgUwUPo5+PM+LX1gpJw0S88SHb0djqAcRUN
9
+ xn/PjyOxFt2nmFnyIdeyO1L9H/EvJDKcs3m6Qd9dZjAaYzIzNkB7mZ6+M3/l4vYp
10
+ z1ft5Pj65ywoGyVW/hp4hPU5EfAP7w2Fs+oabVBDMrLBB5UjkoIVGOhRwqZJqm25
11
+ e7s8LZVTKYZJeqBW+WlrW2IrXC1eFmLREW1DBta16NVe0FVdJpbfk1fUsrkoiilM
12
+ cEw1LxuPbCwHlmLJe2p3J+9eJiMNUxHEtlTuYwbu9Z2sqXtiw3WG//C4FhnoAHNQ
13
+ dRYZsEx/MTLf7co4GV6sUjVbbYQjEKnKjCsKxrTUFQKBgQD1ly9dGQXrQUaVewnu
14
+ 1H0lCaX24ilFIF/ptwK6wvBzfYhllsw0+grKzJL8/kqHep9BDbwDo+UkRaSjH4k8
15
+ CMhloCvg17fGdec4TIXJUPSC9yeCMPbcVwKQg14mk0MbKjlJ1fdh6H/5NugdRbLh
16
+ QHYT5LBpNh3RmJClVxBZo9bjhwKBgQDVaS6WPByblik3qzw+7ctFFzUuL4iBCA6/
17
+ qSN67nJVaD2ymLEfREZnpGQAu2FQh1emx3oxiECS4OIrJI6FkMj59rn8vmhzJklX
18
+ 0ruCe/6nDWFxJ9gPwBOWrqpADMgvjZq7wDmZFqN9/7zau0sU6P9XspBHgBk57h2X
19
+ ELeHK1BftwKBgQDpglN1eHppQgqDzJYYMI/A7JiR0l4dLPglN25v9zQ7C0vqE+Sc
20
+ Jnamdrb3uC1S/aN4bj+rUmVoBJPSygRpQYyRHCc8RL+nAqnTnObEEKY79BXrsvS1
21
+ ckGs+EtH8FMo/A+2hawOussbQTqXwpKfm/PpXFLj5qGZjS9TFiIkqSSD9wKBgG1O
22
+ PUVHrqNmCuBvfSECLM3LcDqir/jexqcWG40YWkkyZf92w6mvD5yAD5RsZRCY8aUD
23
+ oKuEDQbt1gmg5Lq2iKm23FX+tILeBkzMK6xOlAS+Dr2lWb3fdGkGNz8tDM+GaM1n
24
+ TFkDxmN/vBwQOAmSuU4SsGFe1Aze0BsSvd2mqrkLAoGBAJX8y1oHcN8cZO/fJAR0
25
+ D/ZjTM06hhEBTHwhJ5yZFxZevhUlTo9eoynX1HjGUANotBN7WJ58UnwAt8l95UmU
26
+ ATnfItCQ7LAlMXQrYnXRHdoCKnjuKyDQhQyomB2aYHB4JS9KImKTaSlUk7/aLE6f
27
+ YNpYWLe/mtE+QIHAjXnDIdmD
28
+ -----END PRIVATE KEY-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXglY3c2ATANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDYyNzEyMzYxM1oXDTM2MDYy
5
+ NDEyMzYxM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIqfwxgDSAPGF2KIO8E7tlQoa90l
8
+ Xw/NsFKOlKhQZtyIAzG6oGjHs0Um2YJbRRFtsV9AR0f+2G3nqgjOWX5QGhmQqZap
9
+ qgJUuYAmI4HBUrZVNmpVNFE+ascIlZwfLH2CG2Gp9zUf1G6I/t19fs+O+Xxi2dpB
10
+ wpofYnvrPyiAxe+UqnWvLVNmA5RI5lVfxSxHxNIB9HnDNmpRfdPAibw+wWm6agzF
11
+ zSaYTWDmG8bTb1YhRZnLuMyiEd7LL/MaMn/o2VOwT3Mq7jvGjoZFrGLOnUDbyaY0
12
+ K6t3dk4BhSqH335d+NLW2YSiDkWTrU/QswGKrt550Qq6vDxLP+th1aqKVJ0CAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQUKbc82JmIG+zs+GMm3IdCd1pRMbIw
17
+ HwYDVR0jBBgwFoAUKbc82JmIG+zs+GMm3IdCd1pRMbIwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBABLZ
19
+ DD0diHmbZn/WwrqwweDDkxb1wxXjyLQVjQi0nPXrlTemSxio6BT5RwzgZNciwywY
20
+ aUoqM47jNDBV7o9KxB16F/OCFNf5qLhCDs9Kh+oOuGpgI9bpHpUi76NWnTGvzJzF
21
+ PTLclXkFSavX6jxZJYu5hc7UrMklczYg8Ca/GCocI93tPpnVuoq0aURfTBbkUJAE
22
+ KwO7GYdkLMxYb/vEweR3CSGzsNdoYnSokTbsR4OUu0N8xp4vETcIxPcrv15genHf
23
+ PDHwBNgr37g/hx+0iWoG4hkwJcdZEMRdmdSJ/D/vL13fGLxRI91cUaD9zhttdv6U
24
+ ht1iX/kdJ7b4zESDI1k=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXglY3cxcjANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDYyNzEyMzYxM1oXDTM2MDYy
5
+ NDEyMzYxM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKtBNLTDXkh2mLQ3Ih2KEQlGelcM
8
+ RVwb4eKNAolkdBwDKj9jX5IAGTQO5symrlt0jUh+ekeqPRz6wZH/PMzWKGppWNqc
9
+ 17OEeGXD4KrjYqHP+LSIUOJ2ZdCjVm1aLf+LDTDBwFyDv4kfHcetTiPrKFyANzWs
10
+ cLqpoqPDDPmThVVfvBbWqjLsqOBBD+ZdZxhHqvPes+JD3abVy70OZIrFupFdUsqC
11
+ 3PeIKOs4KupJbs/ENaWo+jrtwOA9+5CqlYkCK4Kifd9wWGdfcFKT7pWsCmC59uDH
12
+ VEe6zFe6eAV7780/O+I7i6pEIBdDv+AzK4AdD6U53BxJXs+6O8pyDJchZqcCAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQUyCs6aEBAGEzVjPxYd3To7pL+XGQw
17
+ HwYDVR0jBBgwFoAUyCs6aEBAGEzVjPxYd3To7pL+XGQwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBACxk
19
+ i94+5hdSwWNNoC+nRDU6euJjFs2y9MFCKg5uYg5tIp80rRBhrAqGweIs1skizACp
20
+ tenGtmIBvdqvcGGOGL9cRibb2cFA290dhcFhlJtU0c2WaxMaQgQknn9aG6paAN3N
21
+ 58GVuHsnN8qzHt3GTR8BQIG31QKKoYsAGMxxSlSF5feNpMUiRkZe/z5KmRO5LNZ6
22
+ +es7TAXFF31aZdyhGk74fZgUBzH2/N0iSujyW+rLX4MmS1VGpSVZjl8XTh6e/ArX
23
+ 7THS5gYGhsdR2aDDyxjUTKNyteHTLoxkHxTgsurX26RntGVGfLPQReUMWz4rftaM
24
+ NzhW+W+vbYv0zWK/wVo=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXglY3c5kjANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDYyNzEyMzYxM1oXDTM2MDYy
5
+ NDEyMzYxM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALExMVGfG1yMpIE4nIO4riyPIcA3
8
+ pAHNOIj7Y+Gzq7j9IwMCqHb08jzJ6tqqnInUOmH367aeo9/FJAsf5wXK3RySMtqG
9
+ v6L40/EvUkdrA/yPXTruAhZU0m36G+Iq5b8j7N4V5FbcUElsX7XhpCHiGj8Ar32q
10
+ uxKwiVX9/c73u72y5+OQgVfmhJtA41VpP+NPDhBUbeuRaN6KSIm9p4Pe38hWVP24
11
+ ANF9D5l/E8dtBPvZp6hJ5mJtapHHTMYSwwxGem2kFXeErD4i/2g0xBD+Y0xpHcFe
12
+ y9dNJAjaUXbeW6ihLPLhV1wbAN6TojhlstJ7ezVs1I+/RXr5psWVwIrWRVkCAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQUlCjIQiZ7wrPrKQLn29olSTNF2Kgw
17
+ HwYDVR0jBBgwFoAUlCjIQiZ7wrPrKQLn29olSTNF2KgwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBAHSe
19
+ i6LBDFpew317pGF0gDt2lgxG/b6A6yhCPZA/dT8hMLPm1mu2aosRxm2lvhxEIFEM
20
+ zqYJd8KXAeSLgBkEfoEYKjiOU+82SN8aPOnUT3/njZeTLwgajDECZQwH0Tsj+vcm
21
+ wpNVc1f+Ovy8B9Wg4BQgel5cQ4ItqIRxV/48c1mBSANykrGne1zor9f2RiVjw0dS
22
+ vuxDnOU2Hh5NGa1XWx2OCEMaLrVqaxyUAiXVZCjR67JAg2ZbTJ8IDV4FK4zz4/aH
23
+ fbtkz7qVd2pOc5MK2I8G3bnyvObf2bNKeydy7CdvEP0x8HMPIXk3fnMqUbvoZ47M
24
+ xg+xalW93QTyWI41KxI=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXdVh2g4JzANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDQwNzE4NDgwM1oXDTM2MDQw
5
+ NDE4NDgwM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMhBslFMtRXQ2Ww7JAtPLoM7I1s
8
+ QP7mmHOv0U7mcSLib/yksMNT0G2U5J1EHI+Km1JwTYXujJnzi/ouuuQsWUsm3zP6
9
+ KAO1XzQuIYf8iEBblzOCA53eTvo056zNfeDoUb9l1CfQH/H6sL2js786dUpuJCG9
10
+ fuCfgrExRbzZQrELcduwRPuVio770NK086orAzFIXaRM20F4HMkTtorsRoGUIU5s
11
+ u6Fqy9nmdKY4w4JHQMafO3L1lHEbGuVwZmmkXmTQtBIS6W8tPSa9fh7GrlHJP4Zc
12
+ cgcp/xuXcpWfHjJaAmUQtCuNprlywJBChlstWkJ09zj1VvqoAWd0GL7ehQkCAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQUVOT0LzYI7XAMQ11FOV/+tUCUkvYw
17
+ HwYDVR0jBBgwFoAUVOT0LzYI7XAMQ11FOV/+tUCUkvYwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBABiN
19
+ x0XNf1nDyRyJQCQ4GMS9e/xrjO3FV106IJRPEosoB10R7zBL92ra4+3AilGnNOeM
20
+ 1O5eIel67DNL2kjw+5ggagtOmhJ3g3ZXFMpF08BeKnMwavoLs74yBZVFDq+2fOxs
21
+ kDdMX5TOpC4kZHMG5G9Cha9mcWjYSAYWVko/WCfby4D+MQiwraAraDL12uFcRVnP
22
+ htDTuNxs+dfKefiIsTgSlkJMisfGEV/EzmwSsTpvtuUZ5DwKddolRGsB/cXqTjc0
23
+ vGxHFjsuqp77gUyb9LNqE8ENi7pOZQFFhAmjSXTXcklWVynycgQ1E0TSNNQio4Xi
24
+ QZtA1NgPnLI6b2kubUQ=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEKjCCAxKgAwIBAgIHAXglY3c3ZzANBgkqhkiG9w0BAQsFADBRMQswCQYDVQQG
3
+ EwJGUjEQMA4GA1UEBxMHT3JsZWFuczERMA8GA1UEChMIU3RlcmZpdmUxHTAbBgNV
4
+ BAMMFE5vZGVPUENVQS1DbGllbnRAdHVmMB4XDTI2MDYyNzEyMzYxM1oXDTM2MDYy
5
+ NDEyMzYxM1owUTELMAkGA1UEBhMCRlIxEDAOBgNVBAcTB09ybGVhbnMxETAPBgNV
6
+ BAoTCFN0ZXJmaXZlMR0wGwYDVQQDDBROb2RlT1BDVUEtQ2xpZW50QHR1ZjCCASIw
7
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIlhQT3T5fhiwtNe0Ae3yQ3XAZvA
8
+ sEdIzmPuhurL3MBR3JRZi3Morx+UD8jpb4/l4gZRWzX+TvRwUBQctbnDCj6ZLWen
9
+ 6gcumEXV8FYtMyOTyJFqb8WoBUmp0OPtNfRu9gAN+XYDRit0CkMTMr0zIWEh5euW
10
+ ZKx6ZpMUMNPfPNaoO+cE5aADJjEekzAqVpXzudo0+duv+bRWU0mOfivQs0N0YpbN
11
+ 7YwStxLJUKjdbblUcRXI2rvcjIYdZN7XY8q5qltuifewAmHzfRv5Wfjgn12PyU+g
12
+ hyDjbRF3LgtBHHAzr4mNeHmnJwigMkI68fTiJ45/aFH7km0Mm8m/CFD2W78CAwEA
13
+ AaOCAQUwggEBMFUGCWCGSAGG+EIBDQRIDEZTZWxmLXNpZ25lZCBjZXJ0aWZpY2F0
14
+ ZSBnZW5lcmF0ZWQgYnkgTm9kZS1PUENVQSBDZXJ0aWZpY2F0ZSB1dGlsaXR5IFYy
15
+ MAwGA1UdEwEB/wQCMAAwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
16
+ MA4GA1UdDwEB/wQEAwIC9DAdBgNVHQ4EFgQU+Q9sO43yN6z+xLSImsP76Gbxx3Yw
17
+ HwYDVR0jBBgwFoAU+Q9sO43yN6z+xLSImsP76Gbxx3YwKAYDVR0RBCEwH4IDdHVm
18
+ hhh1cm46dHVmOk5vZGVPUENVQS1DbGllbnQwDQYJKoZIhvcNAQELBQADggEBADBi
19
+ Y/2NeeJ2LPT0CbtDfN1474vbUy9Q+GURBnUQ2Mc7y6fhp1CxB3yQPJ9aQrDpWjrx
20
+ YdRrZeX2qbDhGH+zqxHC9JTKlqLwFj8L1R2ltyDMtAoX7qeaDVH0BposXSxgUYqp
21
+ Q3IISU5N5N88gGwDVSUUyvmdF6rI5nU1eZ1PqQC+pwLQ9WPzoGSNDku9Q/EmmXA+
22
+ 7t0uxFMs+DNEMrjLgrea1tIwCBacdzXF/LX5sfVkufxqb00W6QHBV+vzt3jJ9uRv
23
+ 42DSE14JQMdk9Wjq7Cns3x0ZRsx9Vdt6rHzimqlmbwvkevaaB3lEk8uvhxqiU7xr
24
+ 5wDZjybtYHwX0KlYTeg=
25
+ -----END CERTIFICATE-----
@@ -170,6 +170,9 @@
170
170
  <option value="events">Events Server</option>
171
171
  <option value="status">Status Server</option>
172
172
  <option value="activeAlarms">Active Alarms</option>
173
+ <option value="getSessions">Get Sessions</option>
174
+ <option value="deleteSessions">Delete Sessions</option>
175
+ <option value="validateLogin">Validate Login</option>
173
176
  <option value="method-input">Method Input</option>
174
177
  <option value="method-output">Method Output</option>
175
178
  </select>
@@ -341,7 +344,96 @@ msg.payload = [
341
344
  ]
342
345
  </code></pre>
343
346
 
347
+ <h3>Get Sessions</h3>
348
+ <p>Returns a JSON array of all currently active OPC UA sessions on the server.</p>
349
+ <p><b>Input</b>: any message triggers a session snapshot.</p>
350
+ <p><b>Output</b>: <code>msg.payload</code> is an array of session objects:</p>
351
+ <pre><code>[
352
+ {
353
+ "sessionId": "ns=1;g=...",
354
+ "sessionName": "UaExpert@hostname",
355
+ "status": "active",
356
+ "creationDate": "2024-01-01T00:00:00.000Z",
357
+ "sessionTimeout": 30000,
358
+ "clientLastContactTime": 1234567890,
359
+ "channelId": 1,
360
+ "clientDescription": {
361
+ "applicationUri": "urn:hostname:client",
362
+ "productUri": "urn:hostname:client",
363
+ "applicationName": "UaExpert",
364
+ "applicationType": "1"
365
+ },
366
+ "userIdentityToken": {
367
+ "policyId": "anonymous",
368
+ "userName": null,
369
+ "tokenType": "AnonymousIdentityToken"
370
+ },
371
+ "channel": {
372
+ "channelId": 1,
373
+ "remoteAddress": "127.0.0.1",
374
+ "remotePort": 54321,
375
+ "bytesRead": 500,
376
+ "bytesWritten": 300,
377
+ "transactionsCount": 10,
378
+ "securityMode": "None",
379
+ "securityPolicy": "None"
380
+ },
381
+ "currentSubscriptionCount": 1,
382
+ "cumulatedSubscriptionCount": 2,
383
+ "currentMonitoredItemCount": 5,
384
+ "aborted": false
385
+ }
386
+ ]</code></pre>
387
+ <p>The node also fetches sessions automatically on deploy, just like <b>Status Server</b> mode.</p>
344
388
 
389
+ <h3>Delete Sessions</h3>
390
+ <p>Forces the server to close one or more active OPC UA sessions by their <code>sessionId</code>.</p>
391
+ <p><b>Input</b>: <code>msg.payload</code> must be an array of objects, each containing a <code>sessionId</code>
392
+ (the GUID string returned by <b>Get Sessions</b>):</p>
393
+ <pre><code>[
394
+ { "sessionId": "ns=1;g=F4F511E2-664B-2191-89A7-46EE461DB86C" },
395
+ { "sessionId": "ns=1;g=A1B2C3D4-1234-5678-ABCD-EF0123456789" }
396
+ ]</code></pre>
397
+ <p><b>Output</b>: <code>msg.payload</code> is an array of result objects, one per requested session.
398
+ The node status badge summarises deleted / not found / error counts:</p>
399
+ <pre><code>[
400
+ {
401
+ "sessionId": "ns=1;g=F4F511E2-664B-2191-89A7-46EE461DB86C",
402
+ "status": "deleted"
403
+ },
404
+ {
405
+ "sessionId": "ns=1;g=AAAAAAAA-0000-0000-0000-000000000000",
406
+ "status": "not_found"
407
+ },
408
+ {
409
+ "sessionId": "ns=1;g=BBBBBBBB-0000-0000-0000-000000000000",
410
+ "status": "error",
411
+ "error": "cannot find session …"
412
+ }
413
+ ]</code></pre>
414
+ <ul>
415
+ <li><b>deleted</b> — session was found and successfully closed with reason <code>Forcing</code>.</li>
416
+ <li><b>not_found</b> — no active session with that <code>sessionId</code> exists.</li>
417
+ <li><b>error</b> — the session was found but <code>engine.closeSession()</code> threw; the <code>error</code> field contains the message.</li>
418
+ </ul>
345
419
 
346
-
420
+ <h3>Validate Login</h3>
421
+ <p>Validates a user's credentials against the OPC UA server's configured user database.</p>
422
+ <p><b>Input</b>: <code>msg.payload</code> must be a JSON object containing <code>userName</code> (or <code>username</code>) and <code>password</code>:</p>
423
+ <pre><code>{
424
+ "userName": "admin",
425
+ "password": "123"
426
+ }</code></pre>
427
+ <p><b>Output</b>: <code>msg.payload</code> contains the status of validation and user groups (excluding password hashes):</p>
428
+ <pre><code>{
429
+ "status": "Good",
430
+ "username": "admin",
431
+ "group": "admin,operator",
432
+ "groups": ["admin", "operator"]
433
+ }</code></pre>
434
+ <p>If authentication fails or the user is not found, the response contains:</p>
435
+ <pre><code>{
436
+ "status": "erro",
437
+ "message": "Invalid username or password"
438
+ }</code></pre>
347
439
  </script>