You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OPC UA服务器登录配置咨询:用户名密码、证书登录及C#示例需求

1. 配置OPC UA服务器使用用户名密码登录

核心操作步骤

  • 启用服务器的用户名密码身份验证策略
  • 配置用户凭据存储(支持内存、数据库或自定义存储)
  • 为不同用户分配对应访问权限

C#实现示例(基于OPC Foundation .NET库)

先确保引用Opc.Ua.Core和Opc.Ua.Server NuGet包,再在服务器初始化阶段添加以下配置:

// 初始化服务器基础配置
var serverConfig = new ApplicationConfiguration();
serverConfig.SecurityConfiguration = new SecurityConfiguration
{
    // 启用用户名密码身份验证策略
    UserTokenPolicies = new List<UserTokenPolicy>
    {
        new UserTokenPolicy { TokenType = UserTokenType.UserName }
    }
};

// 配置内存型用户管理器(生产环境可替换为数据库存储)
serverConfig.ServerConfiguration.UserManager = new UserManager();
// 添加用户及对应角色
serverConfig.ServerConfiguration.UserManager.AddUser("admin", "Admin@123", new List<string> { "Administrator" });
serverConfig.ServerConfiguration.UserManager.AddUser("operator", "Op@456", new List<string> { "Operator" });

// 应用配置并启动服务器
await server.Start(serverConfig);

2. 配置OPC UA服务器使用证书登录及C#示例代码

服务器端配置步骤

  1. 生成/导入服务器证书(可使用OPC Foundation官方证书工具创建)
  2. 配置证书信任列表,指定信任的客户端证书存储路径
  3. 启用证书身份验证策略

服务器端C#实现代码

var serverConfig = new ApplicationConfiguration();
serverConfig.SecurityConfiguration = new SecurityConfiguration
{
    // 设置服务器自身证书
    ApplicationCertificate = new CertificateIdentifier
    {
        StoreType = "Directory",
        StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault",
        SubjectName = "CN=MyOPCUAServer, O=MyCompany, C=CN"
    },
    // 配置信任的根证书存储
    TrustedIssuerCertificates = new CertificateStoreIdentifier
    {
        StoreType = "Directory",
        StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities"
    },
    // 配置信任的客户端证书存储
    TrustedPeerCertificates = new CertificateStoreIdentifier
    {
        StoreType = "Directory",
        StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications"
    },
    // 启用证书身份验证策略
    UserTokenPolicies = new List<UserTokenPolicy>
    {
        new UserTokenPolicy { TokenType = UserTokenType.Certificate }
    }
};

// 配置证书验证回调逻辑
serverConfig.SecurityConfiguration.CertificateValidator = new CertificateValidator();
serverConfig.SecurityConfiguration.CertificateValidator.CertificateValidation += (sender, e) =>
{
    // 生产环境建议严格验证证书信任链,测试环境可简化
    if (e.Certificate != null && e.Certificate.Status == CertificateStatus.Trusted)
    {
        e.Accept = true;
    }
    else
    {
        // 测试环境可自动将证书加入信任列表
        e.Accept = true;
        e.CertificateValidator.AddTrustedCertificate(e.Certificate);
    }
};

await server.Start(serverConfig);

客户端证书登录C#示例代码

var clientConfig = new ApplicationConfiguration();
clientConfig.SecurityConfiguration = new SecurityConfiguration
{
    // 设置客户端证书
    ApplicationCertificate = new CertificateIdentifier
    {
        StoreType = "Directory",
        StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault",
        SubjectName = "CN=MyOPCUAClient, O=MyCompany, C=CN"
    },
    // 配置信任的服务器证书存储
    TrustedPeerCertificates = new CertificateStoreIdentifier
    {
        StoreType = "Directory",
        StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications"
    }
};

// 创建并连接会话,使用证书登录
var endpoint = new ConfiguredEndpoint(null, new EndpointDescription("opc.tcp://localhost:4840/MyServer"), EndpointConfiguration.Create(clientConfig));
var session = await Session.Create(clientConfig, endpoint, false, "ClientSession", 60000, null, null);

Console.WriteLine($"证书登录成功,会话ID: {session.SessionId}");

3. 已有匿名登录的OPC UA服务器新增证书授权登录的C#实现方案

核心修改点

  • 在原有配置中保留匿名登录策略,新增证书身份验证策略
  • 添加证书安全配置(服务器证书、信任列表)
  • 实现证书到服务器角色的映射逻辑

具体代码修改(基于现有匿名服务器)

假设原有匿名登录配置如下:

// 原有匿名登录配置
var serverConfig = new ApplicationConfiguration();
serverConfig.SecurityConfiguration = new SecurityConfiguration
{
    UserTokenPolicies = new List<UserTokenPolicy>
    {
        new UserTokenPolicy { TokenType = UserTokenType.Anonymous }
    }
};

修改后的完整配置:

// 保留匿名策略,新增证书验证策略
serverConfig.SecurityConfiguration.UserTokenPolicies.Add(new UserTokenPolicy { TokenType = UserTokenType.Certificate });

// 添加证书安全配置
serverConfig.SecurityConfiguration.ApplicationCertificate = new CertificateIdentifier
{
    StoreType = "Directory",
    StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault",
    SubjectName = "CN=MyExistingServer, O=MyCompany, C=CN"
};
serverConfig.SecurityConfiguration.TrustedIssuerCertificates = new CertificateStoreIdentifier
{
    StoreType = "Directory",
    StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities"
};
serverConfig.SecurityConfiguration.TrustedPeerCertificates = new CertificateStoreIdentifier
{
    StoreType = "Directory",
    StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications"
};

// 配置证书验证逻辑
serverConfig.SecurityConfiguration.CertificateValidator = new CertificateValidator();
serverConfig.SecurityConfiguration.CertificateValidator.CertificateValidation += (sender, e) =>
{
    // 生产环境需严格验证证书是否在信任列表
    var trustedStore = new X509CertificateStore(serverConfig.SecurityConfiguration.TrustedPeerCertificates.StoreType, 
        serverConfig.SecurityConfiguration.TrustedPeerCertificates.StorePath);
    trustedStore.Open(OpenMode.ReadOnly);
    e.Accept = trustedStore.FindByThumbprint(e.Certificate.Thumbprint) != null;
    trustedStore.Close();
    
    // 测试环境可临时自动信任
    // e.Accept = true;
    // e.CertificateValidator.AddTrustedCertificate(e.Certificate);
};

// 配置证书身份到服务器角色的映射
serverConfig.ServerConfiguration.UserManager = new UserManager();
// 将指定证书映射为管理员角色
serverConfig.ServerConfiguration.UserManager.AddUser(new CertificateIdentity(e.Certificate), new List<string> { "Administrator" });

// 重启服务器应用新配置
await server.Stop();
await server.Start(serverConfig);

验证方式

客户端可自主选择匿名登录或证书登录,服务器会根据客户端提供的令牌类型自动匹配对应验证逻辑。

内容的提问来源于stack exchange,提问作者Dayakar Chowdary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:11:05