• 【OpcUA开发笔记 3】Open62541证书登录方式


    前言:

           OpcUA的登录方式有3种,分别是匿名,用户名+密码,证书。其中前两个比较简单,我们就从最复杂的说起,前两个顺带说下也就会了,属于抛砖引玉讲述解决思路,非保姆式教程。

           材料:open62541-1.4.0,cmake 3.29.2,openssl 3.3.0.9,visual studio2022,python3.8.6

    一、代码生成

           匿名和用户名+密码方式不需要在代码生成时只需要勾选UA_ENABLE_AMALGAMATION。但是为了支持证书,则在CMake生成代码时,就要选择以下选项

    • UA_ENABLE_ENCRYPTION = OPENSSL

           有了这两个选项,再加之安装了OpenSSL,并正确设置了OpenSSL的环境变量。则代码中证书部分的功能才被支持,否则就是灰的。

    1. /* #undef UA_ENABLE_MQTT */
    2. /* #undef UA_ENABLE_NODESET_INJECTOR */
    3. /* #undef UA_INFORMATION_MODEL_AUTOLOAD */
    4. /* #undef UA_ENABLE_ENCRYPTION_MBEDTLS */
    5. /* #undef UA_ENABLE_CERT_REJECTED_DIR */
    6. /* #undef UA_ENABLE_TPM2_SECURITY */
    7. #define UA_ENABLE_ENCRYPTION_OPENSSL
    8. /* #undef UA_ENABLE_ENCRYPTION_LIBRESSL */
    9. #if defined(UA_ENABLE_ENCRYPTION_MBEDTLS) || defined(UA_ENABLE_ENCRYPTION_OPENSSL) || defined(UA_ENABLE_ENCRYPTION_LIBRESSL)
    10. #define UA_ENABLE_ENCRYPTION
    11. #endif
    1. #ifdef UA_ENABLE_ENCRYPTION
    2. UA_EXPORT UA_StatusCode
    3. UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf,
    4. UA_UInt16 portNumber,
    5. const UA_ByteString *certificate,
    6. const UA_ByteString *privateKey,
    7. const UA_ByteString *trustList,
    8. size_t trustListSize,
    9. const UA_ByteString *issuerList,
    10. size_t issuerListSize,
    11. const UA_ByteString *revocationList,
    12. size_t revocationListSize);

            如果老是生成失败,可以考虑换个cmake,反正我一开始老是失败,后来重装了个最新版,代码就能顺利生成了,太坑了。

    二、编译

           

            成功生成vs代码以后,用vs打开项目,此时examples里会相较没有勾选UA_ENABLE_ENCRYPTION时,多了 access_control_client_encrypt ,“client_encryptionserver_encryption用于演示证书使用

            1. 编译这两个例子的时候,会编译失败,那是因为缺少以来库,在工程的链接器输入里加入以下库文件,注意OpenSSL要引用MDd文件夹下的两个lib:

    ws2_32.lib      #socket相关
    iphlpapi.lib      #忘了
    C:\Program Files\OpenSSL-Win64\lib\VC\x64\MDd\libssl.lib           #openssl相关
    C:\Program Files\OpenSSL-Win64\lib\VC\x64\MDd\libcrypto.lib      #openssl相关

           2. 将OpenSSL的include文件夹路径包含到工程的VC++目录里的包含目录里去,记得要指定到Include这一层,因为代码里直接用的是#include 这种路径,不指定到include,可能就报找不到openssl头文件

    C:\Program Files\OpenSSL-Win64\include

    三、登录方式

    1. 匿名登录

        匿名登录就参考官方例子就好,没什么好说的。

    2. 用户名+密码登录

        以下代码中,赋予user1所有权限,而user2没有权限删除节点和引用。

    1. #include "open62541.h"
    2. //record the UA_UsernamePasswordLogin object for delete on service closing.
    3. typedef struct {
    4. UA_Boolean allowAnonymous;
    5. size_t usernamePasswordLoginSize;
    6. UA_UsernamePasswordLogin* usernamePasswordLogin;
    7. UA_UsernamePasswordLoginCallback loginCallback;
    8. void* loginContext;
    9. UA_CertificateVerification verifyX509;
    10. } AccessControlContext;
    11. typedef struct {
    12. UA_String userName;
    13. UA_Boolean fAllowAddNode;
    14. UA_Boolean fAllowAddReference;
    15. UA_Boolean fAllowDeleteNode;
    16. UA_Boolean fAllowDeleteReference;
    17. } UserRight_t;
    18. #define ANONYMOUS_POLICY "open62541-anonymous-policy"
    19. #define CERTIFICATE_POLICY "open62541-certificate-policy"
    20. #define USERNAME_POLICY "open62541-username-policy"
    21. const UA_String anonymous_policy = UA_STRING_STATIC(ANONYMOUS_POLICY);
    22. const UA_String certificate_policy = UA_STRING_STATIC(CERTIFICATE_POLICY);
    23. const UA_String username_policy = UA_STRING_STATIC(USERNAME_POLICY);
    24. #define USER_COUNT 2
    25. UA_UsernamePasswor
  • 相关阅读:
    Pandas练手项目
    关于Redis集群的数据分区和故障转移,这应该是全网最清晰的一篇
    PHP Web 开发基础
    Xposed hook SensorManager
    【图像分类】基于HOG特征结合SVM实现图像分类识别附matlab代码
    【agora】get 一个 agora_refptr 对象的用法示例
    【MySQL】 MySQL 更新数据机制
    电脑小白快来!这有电脑常见故障解决方法
    Elasticsearch文档操作
    数据驱动的网络入侵检测:最新动向与研究趋势
  • 原文地址:https://blog.csdn.net/jam12315/article/details/138130345