【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的环境变量。则代码中证书部分的功能才被支持,否则就是灰的。

/* #undef UA_ENABLE_MQTT */
/* #undef UA_ENABLE_NODESET_INJECTOR */
/* #undef UA_INFORMATION_MODEL_AUTOLOAD */
/* #undef UA_ENABLE_ENCRYPTION_MBEDTLS */
/* #undef UA_ENABLE_CERT_REJECTED_DIR */
/* #undef UA_ENABLE_TPM2_SECURITY */
#define UA_ENABLE_ENCRYPTION_OPENSSL
/* #undef UA_ENABLE_ENCRYPTION_LIBRESSL */
#if defined(UA_ENABLE_ENCRYPTION_MBEDTLS) || defined(UA_ENABLE_ENCRYPTION_OPENSSL) || defined(UA_ENABLE_ENCRYPTION_LIBRESSL)
#define UA_ENABLE_ENCRYPTION
#endif
#ifdef UA_ENABLE_ENCRYPTIONUA_EXPORT UA_StatusCode
UA_ServerConfig_setDefaultWithSecurityPolicies(UA_ServerConfig *conf,UA_UInt16 portNumber,const UA_ByteString *certificate,const UA_ByteString *privateKey,const UA_ByteString *trustList,size_t trustListSize,const UA_ByteString *issuerList,size_t issuerListSize,const UA_ByteString *revocationList,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 <openssl/x509.h>这种路径,不指定到include,可能就报找不到openssl头文件

C:\Program Files\OpenSSL-Win64\include

三、登录方式

1. 匿名登录

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

2. 用户名+密码登录

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

#include "open62541.h"//record the UA_UsernamePasswordLogin object for delete on service closing.
typedef struct {UA_Boolean allowAnonymous;size_t usernamePasswordLoginSize;UA_UsernamePasswordLogin* usernamePasswordLogin;UA_UsernamePasswordLoginCallback loginCallback;void* loginContext;UA_CertificateVerification verifyX509;
} AccessControlContext;typedef struct {UA_String userName;UA_Boolean fAllowAddNode;UA_Boolean fAllowAddReference;UA_Boolean fAllowDeleteNode;UA_Boolean fAllowDeleteReference;
} UserRight_t;#define ANONYMOUS_POLICY "open62541-anonymous-policy"
#define CERTIFICATE_POLICY "open62541-certificate-policy"
#define USERNAME_POLICY "open62541-username-policy"
const UA_String anonymous_policy = UA_STRING_STATIC(ANONYMOUS_POLICY);
const UA_String certificate_policy = UA_STRING_STATIC(CERTIFICATE_POLICY);
const UA_String username_policy = UA_STRING_STATIC(USERNAME_POLICY);#define USER_COUNT 2UA_UsernamePasswor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTB靶场 Perfection

端口 打开了ssh和http服务 访问 Perfection靶机的网站 是一个根据权重计算总成绩的网站 Wappalyzer查看网页用的什么编写搭建的 抓包看一下是怎么工作的 发送,&#xff0c;返回的结果 如果我在 类别 后面多加一句命令 就会出现提示 恶意输入阻止 大概率有命令注入 通过插件…

【第34天】SQL进阶-SQL高级技巧-Window Funtion(SQL 小虚竹)

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 零、前言一、练习题目二、SQL思路初始化数据什么是Window Funtion窗口函数的分类语法结构第一种写法:第二种写法:实战体验序号函数:row_number()序号函数:rank()序号函数:dense_rank()

动手学深度学习——pandas

1. 简介 作用&#xff1a;对数据进行预处理&#xff0c;是数据科学常使用的库。 支持多种数据格式读取&#xff1a; CSV/Excel/SQL/JSON/HTML数据清洗&#xff1a;处理缺失值、重复值、异常值、数据转换合并数据过滤&#xff1a;灵活的索引、切片、筛选功能&#xff0c;方便选…

2024最新版JavaScript逆向爬虫教程-------基础篇之JavaScript密码学以及CryptoJS各种常用算法的实现

目录 一、密码学介绍1.1 为什么要学密码学?1.2 密码学里面学哪一些 二、字符编码三、位运算四、Hex 编码与 Base64 编码4.1 Hex 编码4.2 Base64 编码 五、消息摘要算法5.1 简介5.2 JS中的MD5、SHA、HMAC、SM3 六、对称加密算法6.1 介绍6.2 加密模式和填充方式6.3 CryptoJS 中D…

元宇宙虚拟空间的角色状态更新(七)

前言 该文章主要讲元宇宙虚拟空间的角色状态更新&#xff0c;基本核心技术点 角色状态更新 对角色设置一个位置判断&#xff08;从中心点向下投射一射线确定角色的位置&#xff09; character.feetRaycast(); feetRaycast的start获取碰撞体的位置&#xff0c;end射线结束的…

Linux驱动开发:掌握SPI通信机制

目录标题 1、SPI简介2、SPI通信机制3、Linux内核中的SPI支持4、SPI核心API5、SPI控制器驱动6、SPI设备驱动 7、编写SPI设备驱动8、调试SPI驱动 在Linux驱动开发中&#xff0c;串行外设接口(SPI)是一种常见的高速全双工通信协议&#xff0c;用于连接处理器和各种外设。本文将深入…

QFD赋能人工智能:打造智能化需求分析与优化新纪元

在科技飞速发展的今天&#xff0c;人工智能(AI)已经渗透到我们生活的方方面面。然而&#xff0c;如何让AI更加贴合用户需求&#xff0c;提供更加精准和个性化的服务&#xff1f;这成为了一个亟待解决的问题。质量功能展开&#xff08;Quality Function Deployment&#xff0c;简…

区分stable diffusion中的通道数与张量维度

区分stable diffusion中的通道数与张量形状 1.通道数&#xff1a;1.1 channel 31.2 channel 4 2.张量形状2.1 3D 张量2.2 4D 张量2.2.1 通常2.2.2 stable diffusion 3.应用3.1 问题3.2 举例3.3 张量可以理解为多维可变数组 前言&#xff1a;通道数与张量形状都在数值3和4之间…

Linux的FTP服务

目录 1.什么是FTP服务&#xff1f; 2.FTP的工作原理和流程 1 主动模式 2 被动模式 3.搭建和配置FTP服务 1 下载服务包、备份配置文件 2 修改配置文件​编辑 3 匿名访问测试 4 设置黑白命令 1.什么是FTP服务&#xff1f; FTP&#xff08;file Transfer Protocol&#…

Vue3 实现 Three.js粒子特效

效果 <template><div id"waves" /> </template><script setup> import { ref, onMounted, onUnmounted } from "vue"; import * as THREE from "three";const amountX ref(50); const amountY ref(50); const color …

QT学习之窗口基本设置

this->setWindowTitle("二代证测试工具"); // 设置窗口名this->setWindowIcon(QIcon("logo.jpg")); // 设置角标this->setFixedSize(900, 730); // 设置窗口大小设置exe图标 .rc文件代码中设置如下

数据结构入门——排序(代码实现)(下)

int GetMidi(int* a, int left, int right) {int mid (left right) / 2;// left mid rightif (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] > a[right]) // mid是最大值{return left;}else{return right;}}else // a[left] > a[mid…

一寸照片裁剪怎么弄?修改照片尺寸,3种方法调整

一寸照片裁剪怎么弄&#xff1f;将照片裁剪为一寸尺寸&#xff0c;可以方便我们在各种场合中使用。无论是办理证件、申请签证&#xff0c;还是制作简历、参与活动&#xff0c;一寸照片都是不可或缺的资料。通过裁剪&#xff0c;我们能够确保照片的尺寸、比例符合标准&#xff0…

视频怎么批量压缩?5个好用的电脑软件和在线网站

视频怎么批量压缩&#xff1f;有时候我们需要批量压缩视频来节省存储空间&#xff0c;便于管理文件和空间&#xff0c;快速的传输发送给他人。有些快捷的视频压缩工具却只支持单个视频导入&#xff0c;非常影响压缩效率&#xff0c;那么今天就向大家从软件和在线网站2个角度介绍…

GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程

目录 ⛳️推荐 1. 安装配置GoLand 2. 服务器开启SSH服务 3. GoLand本地服务器远程连接测试 4. 安装cpolar内网穿透远程访问服务器端 4.1 服务器端安装cpolar 4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&am…

OpenG中的读写簇函数

1.首先需要在Vi Package Manager中安装Open G 2.找到openG中的读写ini函数&#xff0c;第一组是将簇标签作为段名&#xff0c;第二组是指定段名&#xff0c;本质上都是一样 3.读写簇到ini文件 4.禁用写入&#xff0c;更改簇的元素&#xff0c;增加或者删除&#xff0c;原来…

使用WebSocket在前端发送消息

在现代Web开发中&#xff0c;WebSocket提供了一种在用户的浏览器和服务器之间进行全双工通信的方法。这意味着服务器可以直接向客户端发送消息&#xff0c;而不需要客户端先请求数据。这种通信方式对于需要实时数据传输的应用&#xff08;如在线游戏、实时通知系统等&#xff0…

【Vue3】ref对象类型的响应式数据

文章目录 ref对象类型简介 ref对象类型简介 用法: let xx reactive({xxx:“xxx”})返回值: 一个Proxy的对象&#xff0c;就是响应式对象特别注意: 既能定义对象类型,也能定义基本类型的响应式数据。但是ref底层还是需要reactive的proxy做响应式数据 代码展示: <div>…

c++取经之路(其八)——基础模板

我认为的模板其实就是个懒人工具&#xff0c;你来弄个模板&#xff0c;编译器自动给你生成对应的函数。 函数模板&#xff1a; 定义&#xff1a;函数模板是一个蓝图&#xff0c;它本身并不是函数&#xff0c;是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是…

Edge浏览器下载文件提示 “无法安全下载” 的解决方法

提示如下&#xff1a; 虽然我们可以通过 "保留" 进行下载&#xff0c;但是每次需要选择&#xff0c;比较麻烦 解决方法&#xff1a; 1、打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 2、创建2个 "项" Edge\InsecureContentAllowedForUrls…