OPCUA3种连接方式匿名、用户名密码、证书
一、匿名访问
1、创建通讯,建立连接
与DA不同的组件OPCDAAuto.dll
UA使用UA-.NETStandard(开源,Github)OPC基金会维护
添加Nuget包
<PackageReference Include="OPCFoundation.NetStandard.Opc.Ua" Version="1.5.374.118" />

这个库也支持开发Server,我们选择Client

证书的安全性更高,相对于用户名密码,证书是1对1签订的
作为一个客户端,需要连接到某个服务端
创建一个Session所需参数
ApplicationConfiguration configuration, 客户端应用配置信息
ConfiguredEndpoint endpoint, // IP:Port
bool updateBeforeConnect, 在连接之前更新,服务节点描述
string sessionName,
uint sessionTimeout,
IUserIdentity identity, // 用户名和密码 匿名
IList<string> preferredLocales
//匿名访问最低配置 private static Task<Session> AnonymousConnect() { ApplicationConfiguration configuration = new ApplicationConfiguration(); configuration.ClientConfiguration = new ClientConfiguration(); // 这里需要进行TCP的三次握手 EndpointDescription description = CoreClientUtils.SelectEndpoint( discoveryUrl: "opc.tcp://127.0.0.1:49320", useSecurity: false ); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, description); return Session.Create( configuration, endpoint, false, "Zys OPC", 6000, new UserIdentity(), new string[] { } ); }
如果修改不支持匿名访问:否

程序就会报错

只是在一个封闭的局域网,也是可以的
二、用户名密码方式
private static Task<Session> UserNameConnect() { #region 客户端应用连接配置信息 ApplicationConfiguration configuration = new ApplicationConfiguration(); #region 配置configuration对象的 ClientConfiguration属性 // 当创建连接对象时,必须给configuration的ClientConfiguration属性进行初始化 configuration.ClientConfiguration = new ClientConfiguration(); #endregion #region 配置configuration对象的 CertificateValidator属性 CertificateValidator validator = new CertificateValidator(); // 针对登录过程中的认证处理 validator.CertificateValidation += (se, ev) => { // 把不信任认证拦截 if (ev.Error.StatusCode.Code == StatusCodes.BadCertificateUntrusted) ev.Accept = true;// 放行,认为是正常操作 // 如果其他的认证结果,继续单独处理 }; SecurityConfiguration security = new SecurityConfiguration() { RejectSHA1SignedCertificates = false }; // 将SecurityConfiguration 对象实例设置给 validator validator.Update(security); configuration.CertificateValidator = validator; #endregion #endregion #region 连接地址 // 这里需要进行TCP的三次握手 EndpointDescription description = CoreClientUtils.SelectEndpoint( discoveryUrl: "opc.tcp://127.0.0.1:49320", useSecurity: false ); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, description); #endregion // 创建一个操作对象 return Session.Create( configuration, endpoint, false, "Zys OPC", 6000, new UserIdentity("OPCUA", "123456"), new string[] { } ); }
创新修改用户信息要右键--重新初始化,才会生效
用户名不区分大小写
否则报错【Opc.Ua.ServiceResultException:“BadUserAccessDenied”】
三、认证连接
安全系数最高,两种方式:手动、自动
手动:本地根据要求生成一个证书,生成之后提交服务端进行注册 上一期
自动:节省了手动生成证书的环节
1、配置--右键config Manager --安全策略
勾选Basic签名,去掉无
重新初始化

勾选之后,就算有用户名密码也登录不上,提示没有配置认证详细信息
Opc.Ua.ServiceResultException:“ApplicationCertificate must be specified.”
2、代码
复制用户名密码,修改
添加认证连接配置
关键方法 ApplicationInstance
// 1、生成证书并提交到服务器进行验证
bool state = await applicationInstance.CheckApplicationInstanceCertificate(false, 1024);//长度自己定义
执行这句话之前,要通过前面对象配置
2、configuration.ApplicationName会显示在客户端名称列
// 认证URI
configuration.ApplicationUri = $"urn:{Dns.GetHostName()}:{appName}"; 会显示在URI列
安全配置
ApplicationCertificate = new CertificateIdentifier
{
StoreType = CertificateStoreType.X509Store,//证书格式默认
StorePath = "CurrentUser\\" + appName,//CurrentUser服务端路径
SubjectName = appName//一般和ApplicationName保持一致
}
3、客户端配置信息验证,服务端做一个记录,
//await 会阻塞等待,直到验证完成,才会执行后面操作
await configuration.Validate(ApplicationType.Client);
4、长度配置保持一致
MinimumCertificateKeySize = 1024,//同下面的长度保持一致
// 证书连接 private static async Task<Session> CertificateConnect() { #region 客户端应用连接配置信息 ApplicationConfiguration configuration = new ApplicationConfiguration(); #region 配置configuration对象的 ClientConfiguration属性 // 当创建连接对象时,必须给configuration的ClientConfiguration属性进行初始化 configuration.ClientConfiguration = new ClientConfiguration(); #endregion #region 配置configuration对象的 CertificateValidator属性 CertificateValidator validator = new CertificateValidator(); // 针对登录过程中的认证处理 validator.CertificateValidation += (se, ev) => { // 把不信任认证拦截 if (ev.Error.StatusCode.Code == StatusCodes.BadCertificateUntrusted) ev.Accept = true;// 放行,认为是正常操作 // 如果其他的认证结果,继续单独处理 }; configuration.CertificateValidator = validator; #endregion #endregion #region 认证连接配置 string appName = "opc_test"; // 客户端名称 configuration.ApplicationName = appName; // 认证URI configuration.ApplicationUri = $"urn:{Dns.GetHostName()}:{appName}"; // 安全配置 configuration.SecurityConfiguration = new SecurityConfiguration() { RejectSHA1SignedCertificates = false,//用户名密码中也使用过 MinimumCertificateKeySize = 1024,//同下面的长度保持一致 ApplicationCertificate = new CertificateIdentifier { StoreType = CertificateStoreType.X509Store,//证书格式默认,也可以省略 StorePath = "CurrentUser\\" + appName,//CurrentUser服务端路径 SubjectName = appName//一般和ApplicationName保持一致 } }; // 客户端配置信息验证,服务端做一个记录 //await 会阻塞等待,直到验证完成,才会执行后面操作 await configuration.Validate(ApplicationType.Client); ApplicationInstance applicationInstance = new ApplicationInstance(); applicationInstance.ApplicationConfiguration = configuration; // 生成证书并提交到服务器进行验证, bool state = await applicationInstance.CheckApplicationInstanceCertificate(false, 1024); #endregion #region 连接地址 // 这里需要进行TCP的三次握手 EndpointDescription description = CoreClientUtils.SelectEndpoint( discoveryUrl: "opc.tcp://127.0.0.1:49320", useSecurity: false ); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, description); #endregion // 创建一个操作对象 return await Session.Create( configuration, endpoint, false, "Certificate OPC", 6000, new UserIdentity("User1", "123456"), new string[] { } ); }
第一次执行会报错:Opc.Ua.ServiceResultException:“Error establishing a connection: Error received from remote host: An error occurred verifying security.”
需要在服务端手动添加信任

客户端主动的方式:
客户端提交过来会显示在这个列表里面
手动右键信任,或者拒绝操作,建立连接

再次运行就会,成功创建Session会话
浙公网安备 33010602011771号