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会话

 

posted on 2025-03-18 15:18  张彦山  阅读(2015)  评论(0)    收藏  举报