регистрация сервера OPC-UA Node в LDS

привет, я пытаюсь зарегистрировать свой сервер OPC-UA на локальном (на данный момент) локальном сервере обнаружения. Поэтому, когда я запускаю свой сервер с registerServerMethod, установленным на lds, я получаю эту ошибку:

RegisterServer to the LDS  has failed during secure connection  => please check that you server certificate is trusted by the LDS. err: The connection has been rejected by server,
Please check that client certificate is trusted by server.
Err = (connect EINVAL 0.0.14.186:4840 - Local (0.0.0.0:0)) 

поэтому, когда я проверяю отклоненную папку LDS по адресу (opt/opcfoundation/ualds/pki/rejected/certs), там не было размещено никаких сертификатов.

Я пробовал несколько разных сертификатов, я привязал размещение копии сертификата в доверенной папке, но пока ничего не сработало. я делаю что-то не так с рудой LDS, что-то не так с кодом моего сервера:

/*global require,setInterval,console */
const opcua = require("node-opcua");
const { SecurityPolicy, OPCUACertificateManager } = require("node-opcua");

// Let's create an instance of OPCUAServer
const server = new opcua.OPCUAServer({
    port: 4354, // the port of the listening socket of the server
    resourcePath: "/UA/testserver1", // this path will be added to the endpoint resource name
    buildInfo: {
        productName: "testserver",
        buildNumber: "0001",
        buildDate: new Date(2020, 7, 9)
    },
    //certificate and key
    certificateFile: "testcert2.pem",
    privateKeyFile: "testkey2.pem",
    //certificate manager
    serverCertificateManager: new OPCUACertificateManager({
        automaticallyAcceptUnknownCertificate: true,
        rootFolder: "./certs",
    }),
    //security policies
    securityPolicies: [SecurityPolicy.Basic256, SecurityPolicy.None],
    securityModes: [opcua.MessageSecurityMode.SignAndEncrypt, opcua.MessageSecurityMode.None],
    // setup LDS conncetion
    registerServerMethod: 3, // regsiterservermethod 3 = LDS
    discoveryServerEndpointUrl: "opc.tcp://localhost:4840",
});

function post_initialize() {
    console.log("initialized");
    function construct_my_address_space(server) {

        const addressSpace = server.engine.addressSpace;
        const namespace = addressSpace.getOwnNamespace();

        // declare a new object
        const device = namespace.addObject({
            organizedBy: addressSpace.rootFolder.objects,
            browseName: "MyDevice"
        });

        // add some variables
        // add a variable named MyVariable1 to the newly created folder "MyDevice"
        let variable1 = 1;

        // emulate variable1 changing every 500 ms
        setInterval(function () { variable1 += 1; }, 500);

        namespace.addVariable({
            componentOf: device,
            browseName: "MyVariable1",
            dataType: "Double",
            value: {
                get: function () {
                    return new opcua.Variant({ dataType: opcua.DataType.Double, value: variable1 });
                }
            }
        });

        // add a variable named MyVariable2 to the newly created folder "MyDevice"
        let variable2 = 10.0;

        namespace.addVariable({
            componentOf: device,
            nodeId: "ns=1;b=1020FFAA", // some opaque NodeId in namespace 4
            browseName: "MyVariable2",
            dataType: "Double",
            value: {
                get: function () {
                    return new opcua.Variant({ dataType: opcua.DataType.Double, value: variable2 });
                },
                set: function (variant) {
                    variable2 = parseFloat(variant.value);
                    return opcua.StatusCodes.Good;
                }
            }
        });

        const os = require("os");
        /**
         * returns the percentage of free memory on the running machine
         * @return {double}
         */

        function available_memory() {
            // var value = process.memoryUsage().heapUsed / 1000000;
            const percentageMemUsed = os.freemem() / os.totalmem() * 100.0;
            return percentageMemUsed;
        }

        namespace.addVariable({
            componentOf: device,
            nodeId: "s=free_memory", // a string nodeID
            browseName: "FreeMemory",
            dataType: "Double",
            value: {
                get: function () { return new opcua.Variant({ dataType: opcua.DataType.Double, value: available_memory() }); }
            }
        });
    }

    construct_my_address_space(server);

    server.start(function () {
        console.log("Server is now listening ... ( press CTRL+C to stop)");
        console.log("port ", server.endpoints[0].port);
        const endpointUrl = server.endpoints[0].endpointDescriptions()[0].endpointUrl;
        console.log(" the primary server endpoint url is ", endpointUrl);
    });
}


server.initialize(post_initialize);

person woutiboutie    schedule 10.07.2020    source источник


Ответы (2)


проблема, с которой я столкнулся, была связана с тем, что имя хоста моего ПК было числом, это вызвало тайм-аут, и поэтому сертификаты не отправлялись.

решение было простым, измените имя хоста моего компьютера на то, что начинается с буквы.

person woutiboutie    schedule 27.07.2020

Чтобы зарегистрироваться на локальном сервере обнаружения (LDS), сервер должен установить безопасное соединение. Безопасное соединение подразумевает, что сервер и LDS обмениваются своими сертификатами и проверяют их.

В то время как некоторые локальные серверы обнаружения могут быть настроены на автоматический прием новых обнаруженных сертификатов, некоторые будут выполнять строгую проверку и обеспечивать, чтобы сертификат вашего сервера был доверенным.

Вам необходимо обратиться к документации по LDS, чтобы узнать, как добавить сертификат сервера в доверенный список вашей LDS.

Сертификат может быть самоподписанным или предоставлен удостоверяющим центром. В этом случае сертификат ЦС также необходимо будет добавить в список сертификатов доверенных эмитентов.

[добавлен]

если вы хотите, вы можете запустить LDS (на основе node-opcua) в качестве док-контейнера:

 docker run -it -p 4840:4840 -v /tmp/lds-config:/root/.config -e HOSTNAME=`hostname` sterfive/lds:latest  -
person Etienne    schedule 14.07.2020