Sur cette page

Création de clients OPC UA avec prise en charge de la sécurité

L'une des fonctionnalités essentielles d'OPC UA est la prise en charge de la sécurité, ce qui signifie que nous disposons d'un protocole crypté et signé, ainsi que d'une prise en charge de l'authentification et de l'autorisation des utilisateurs.

Pour que cela fonctionne, chaque instance d'application (installation d'un programme) doit disposer de son propre certificat de sécurité ( Application Instance Certificate ) et de la clé privée correspondante.

Les applications peuvent soit générer elles-mêmes des certificats auto-signés (voir la prise en charge X509 d’Qt OPC UA ), soit en obtenir auprès d’une autorité de certification via OPC UA GDS, soit simplement être configurées avec des certificats créés manuellement par l’utilisateur.

Configuration de l’application UA

Pour permettre au client d’utiliser des connexions sécurisées, il est important de

  • configurer correctement l’identité de l’application
    m_identity = m_pkiConfig.applicationIdentity();
  • configurer les emplacements PKI afin que le SDK puisse trouver le certificat, la clé privée, la liste de confiance, etc.

    Voir, par exemple, le code de l'exemple «Qt OPC UA Viewer » :

    void MainWindow::setupPkiConfiguration()
    {
        const QDir pkidir =
                QDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/pki");
    
        if (!pkidir.exists()&& !copyDirRecursively(":/pki", pkidir.path()))
            qFatal("Could not set up directory %s!", qUtf8Printable(pkidir.path()));
    
        m_pkiConfig.setClientCertificateFile(pkidir.absoluteFilePath("own/certs/opcuaviewer.der"));
        m_pkiConfig.setPrivateKeyFile(pkidir.absoluteFilePath("own/private/opcuaviewer.pem"));
        m_pkiConfig.setTrustListDirectory(pkidir.absoluteFilePath("trusted/certs"));
        m_pkiConfig.setRevocationListDirectory(pkidir.absoluteFilePath("trusted/crl"));
        m_pkiConfig.setIssuerListDirectory(pkidir.absoluteFilePath("issuers/certs"));
        m_pkiConfig.setIssuerRevocationListDirectory(pkidir.absoluteFilePath("issuers/crl"));
    
        const QStringList toCreate = { m_pkiConfig.issuerListDirectory(),
                                       m_pkiConfig.issuerRevocationListDirectory() };
        for (const QString&dir: toCreate) {
            if (!QDir().mkpath(dir))
                qFatal("Could not create directory %s!", qUtf8Printable(dir));
        }
    }

    Dans cet exemple, nous extrayons les certificats propres et de confiance préconfigurés du système de ressources Qt vers un emplacement accessible en écriture dans le système de fichiers. Les répertoires restants destinés aux listes d’émetteurs (de révocation) sont créés manuellement.

Première connexion

Lors de la première connexion, le client doit considérer le certificat du serveur comme fiable.

Le client doit afficher un avertissement concernant le certificat (avec les détails de celui-ci) et proposer à l'utilisateur d'enregistrer le certificat dans sa liste de confiance. Pour un exemple, consultez l'exemple de la visionneuseQt OPC UA .

Une fois que le client a accepté le certificat du serveur, vous pouvez réessayer de vous connecter. À ce stade, le serveur peut rejeter le certificat du client. Cela est signalé par le code d’erreur générique BadSecurityChecksFailed. Les serveurs stockent généralement les certificats rejetés dans un dossier spécial rejected. L’administrateur peut les déplacer vers la liste de confiance afin d’autoriser les clients. Cela évite de devoir copier manuellement le certificat client sur le serveur.

Dès que le serveur aura accordé sa confiance au client, vous devriez pouvoir vous connecter en toute sécurité.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.