简介:这份PDF文档聚焦kepware的OPC UA配置管理器,面向工业自动化领域的工程师、系统集成人员以及需要搭建OPC UA通信链路的运维人员,帮助解决服务器与客户端之间安全连接、证书信任与故障排查等实际问题。资源包共1个PDF文件,大小约728KB,内容为官方帮助文档,结构清晰、便于按需检索。文档系统讲解了服务器端点、受信任的客户端与服务器、发现服务器、实例证书等核心概念,并给出OPC UA教程、连接示例与最佳实践。故障排除部分覆盖无法通过正确端点URL连接、身份验证失败、目标计算机不出现在浏览网络中等典型场景,事件日志消息章节则列出证书重新颁发、客户端证书被拒绝或受信任、端点启用禁用等具体提示,便于对照诊断。目前已有835人学习,适合希望快速掌握kepware OPC UA安全配置与排错思路的读者参考。
1. OPC UA 配置管理器到底在管什么:从一次现场联调卡壳说起
很多人第一次接触 KEPServerEX 的 OPC UA 配置管理器,是在一个很具体的场景里:上位机连不上、客户端报 BadSecurityChecksFailed、或者标签读出来全是问号。你打开 KEPServerEX 的管理界面,发现 OPC UA 这一块有一整套独立的配置入口——端点、安全策略、证书、用户身份、信任列表,全在这里。它管的不是某个设备的驱动参数,而是 KEPServerEX 作为 OPC UA Server 对外暴露的那一层“门禁系统”。
换句话说,OPC UA 配置管理器解决的是“谁可以连进来、用什么加密方式连、连进来能看到哪些标签、证书怎么互信”这四个问题。它适合两类人:一类是做 SCADA、MES、组态软件对接的自动化工程师,需要把 KEPServerEX 的数据通过 OPC UA 推给上层系统;另一类是做设备数据采集平台的后端开发者,需要理解 OPC UA 的安全模型才能排查连接故障。这一层配置没做对,后面所有标签映射、数据订阅都是白搭。
2. 端点与安全策略:把 OPC UA 服务端配置拆成可执行的五步
2.1 先理解端点、安全策略、消息安全模式三者的关系
OPC UA 的连接建立过程,本质上是客户端先问服务端“你支持哪些端点”,服务端返回一个端点列表,每个端点绑定了一组“安全策略 + 消息安全模式 + 用户令牌类型”的组合。KEPServerEX 的 OPC UA 配置管理器就是让你定义这些组合的地方。
安全策略决定加密算法套件,常见的有 None、Basic128Rsa15、Basic256、Basic256Sha256,以及较新的 Aes128Sha256RsaOaep 和 Aes256Sha256RsaPss。消息安全模式决定签名和加密是否同时启用,分为 None、Sign、SignAndEncrypt 三档。用户令牌类型决定身份验证方式,常见的是 Anonymous、UserName、Certificate。
一个常见的误区是:把安全策略设成 Basic256Sha256,消息安全模式却选了 None。这种组合在协议层面是矛盾的——策略本身要求加密,模式却说不加密,客户端协商时直接失败。我一般会遵循一个原则:安全策略和消息安全模式的强度要匹配,生产环境至少 SignAndEncrypt,调试阶段可以临时用 None 但必须记录在案。
2.2 在配置管理器里创建端点的操作步骤
打开 KEPServerEX 的 OPC UA 配置管理器,左侧树形结构里找到“服务器端点”节点。右键新建端点,会弹出配置窗口。下面是我常用的一个生产级端点配置,用表格说明每个字段的取值和理由。
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 端点 URL | opc.tcp://<服务器IP>:49320 | 端口默认 49320,可改但需同步防火墙 |
| 安全策略 | Basic256Sha256 | 兼容性好,主流客户端都支持 |
| 消息安全模式 | SignAndEncrypt | 签名加加密,防止篡改和窃听 |
| 用户令牌 | UserName + Certificate | 双因子,用户名密码加证书 |
| 允许匿名 | 否 | 生产环境必须关闭 |
配置完成后点击应用,配置管理器会提示你需要重启 OPC UA 服务或整个 KEPServerEX 运行时。这里有个细节:修改端点配置后,已有的客户端连接不会自动断开,但新连接会使用新配置。所以如果你在调试一个已经连上的客户端,改完配置发现没生效,先断开重连。
2.3 用 Python 客户端验证端点配置是否生效
配置完不能只看界面,得实际连一下。下面这段代码用 Python 的 opcua 库(freeopcua)去探测服务端端点列表,并尝试用一个安全连接读取服务器状态。
from opcua import Client from opcua.ua import SecurityPolicy # 服务端地址,端口与配置管理器中一致 url = "opc.tcp://192.168.1.100:49320" # 创建客户端,指定安全策略和证书 client = Client(url) client.set_security( SecurityPolicy.Basic256Sha256, certificate="client_cert.pem", # 客户端公钥证书 private_key="client_key.pem", # 客户端私钥 server_certificate="server_cert.der" # 服务端公钥证书,用于验证服务端 ) # 设置用户名令牌 client.set_user("opcuser") client.set_password("YourPassword123") try: client.connect() # 读取服务器状态节点 server_node = client.get_node("ns=0;i=2259") print("Server State:", server_node.get_value()) finally: client.disconnect()这段代码的关键点在于set_security的参数。certificate和private_key是客户端自己的证书对,server_certificate是服务端的公钥证书,用于客户端验证服务端身份。如果服务端证书不在客户端的信任列表里,连接会报 BadCertificateUntrusted。反过来,客户端证书不在服务端的信任列表里,服务端会拒绝连接,客户端收到 BadSecurityChecksFailed。
参数说明:SecurityPolicy.Basic256Sha256必须和配置管理器里端点设置的安全策略完全一致,大小写和拼写都不能错。set_user和set_password对应配置管理器里用户令牌的 UserName 类型。如果端点允许匿名,这两行可以省略,但生产环境不建议。
2.4 端点配置的常见组合与适用场景
不是所有场景都需要最高安全等级。下面这张表是我在不同项目里用过的组合,按场景区分。
| 场景 | 安全策略 | 消息安全模式 | 用户令牌 | 理由 |
|---|---|---|---|---|
| 本地调试 | None | None | Anonymous | 快速验证标签映射,不涉及安全 |
| 内网测试 | Basic256Sha256 | Sign | UserName | 签名防篡改,不加密省 CPU |
| 生产环境 | Basic256Sha256 | SignAndEncrypt | UserName + Certificate | 完整安全 |
| 跨网段 | Aes256Sha256RsaPss | SignAndEncrypt | Certificate | 更高强度,兼容性需确认 |
选型逻辑是:先确认客户端支持哪些安全策略,再往上加。如果客户端是老版本的组态软件,可能只支持 Basic128Rsa15,那就只能降级。降级的同时要在网络层做补偿,比如限制源 IP、走独立 VLAN。
2.5 端点 URL 里的 IP 和主机名陷阱
配置管理器里填端点 URL 时,很多人直接填opc.tcp://localhost:49320或者opc.tcp://127.0.0.1:49320。这在服务端本机测试没问题,但远程客户端连的时候会失败。原因是 OPC UA 客户端拿到端点列表后,会用列表里的 URL 去连接,如果 URL 里是 localhost,客户端会试图连自己的 localhost。
正确做法是填服务端的实际 IP 或者可解析的主机名。如果服务器有多网卡,要填客户端能路由到的那个 IP。我遇到过一台服务器有四个网卡,配置管理器里默认选了第一个,结果客户端在另一个网段,路由不通。后来在配置管理器里把端点 URL 改成客户端网段对应的 IP 才解决。
3. 证书管理:信任列表、吊销列表和自动接受的那些坑
3.1 KEPServerEX 的证书存储结构
KEPServerEX 的 OPC UA 证书默认存在安装目录下的KEPServerEX\V6\UA\或者KEPServerEX\V6\Certificates\路径里(具体版本路径略有差异)。里面有几个关键子目录:own存放服务端自己的证书和私钥,trusted存放受信任的客户端证书,rejected存放被拒绝的客户端证书,revoked存放被吊销的证书。
理解这个结构很重要,因为排查证书问题时,你需要知道去哪个目录看。比如客户端连不上,先去rejected目录看有没有客户端证书被扔进去。如果有,说明服务端收到了客户端证书但不信任它。把该证书从rejected移到trusted,重启服务,通常就能连上。
3.2 用 OpenSSL 生成自签名证书并导入信任列表
生产环境应该用 CA 签发的证书,但测试环境用自签名证书更快。下面是用 OpenSSL 生成一套服务端和客户端证书的命令。
# 生成服务端私钥和自签名证书 openssl req -x509 -newkey rsa:2048 -keyout server_key.pem -out server_cert.pem \ -days 365 -nodes -subj "/CN=OPCUA-Server" \ -addext "subjectAltName=IP:192.168.1.100,URI:urn:OPCUA-Server" # 生成客户端私钥和自签名证书 openssl req -x509 -newkey rsa:2048 -keyout client_key.pem -out client_cert.pem \ -days 365 -nodes -subj "/CN=OPCUA-Client" \ -addext "subjectAltName=URI:urn:OPCUA-Client" # 将 PEM 格式证书转为 DER 格式(KEPServerEX 信任列表需要 DER) openssl x509 -in server_cert.pem -outform DER -out server_cert.der openssl x509 -in client_cert.pem -outform DER -out client_cert.der关键参数说明:-addext "subjectAltName=..."是必须的,OPC UA 规范要求证书里包含 SAN 扩展,否则严格模式的客户端会拒绝。服务端的 SAN 里要包含客户端连接时用的 IP 或主机名,客户端的 SAN 里要包含 URI。-nodes表示私钥不加密,测试环境方便,生产环境应该去掉并设置密码。
生成后,把server_cert.der放到服务端own目录(替换原有证书),把client_cert.der放到服务端trusted目录。同时把server_cert.der放到客户端信任列表,把client_cert.pem和client_key.pem配给客户端使用。
3.3 证书信任列表的自动接受功能要不要开
KEPServerEX 的 OPC UA 配置管理器里有一个“自动接受客户端证书”的选项。开了之后,任何客户端第一次连接时,其证书会自动进入trusted目录,不需要手动导入。这在调试阶段很方便,但生产环境是安全隐患——任何人都能连进来。
我的做法是:调试阶段开启,方便快速迭代;上线前关闭,并清空trusted目录里非预期的证书。关闭后,新客户端证书会进入rejected,需要管理员手动移到trusted。这个手动步骤虽然麻烦,但保证了只有经过审批的客户端才能接入。
还有一个细节:证书是有有效期的。自签名证书默认 365 天,到期后连接会报 BadCertificateExpired。我一般会在日历上设一个提前 30 天的提醒,到期前重新生成并替换。如果用的是 CA 签发的证书,续期流程类似,但需要重新签发而不是自签。
3.4 证书吊销列表的使用场景
吊销列表(CRL)用于作废已经签发的证书。比如某个客户端证书私钥泄露了,你需要立即让这个证书失效,但又不想重新签发所有证书。这时候把该证书加入吊销列表,服务端在握手时会检查 CRL,发现证书被吊销就拒绝连接。
KEPServerEX 的配置管理器里可以指定 CRL 文件路径。CRL 文件本身需要用 OpenSSL 生成,命令如下。
# 创建一个空的吊销列表 openssl ca -gencrl -keyfile ca_key.pem -cert ca_cert.pem -out crl.pem -config openssl.cnf # 吊销某个证书 openssl ca -revoke client_cert.pem -keyfile ca_key.pem -cert ca_cert.pem -config openssl.cnf # 重新生成包含吊销记录的 CRL openssl ca -gencrl -keyfile ca_key.pem -cert ca_cert.pem -out crl.pem -config openssl.cnfCRL 的更新不是实时的,服务端会缓存 CRL 文件。KEPServerEX 在启动时加载 CRL,运行期间不会自动重新加载。所以吊销证书后需要重启 OPC UA 服务才能生效。这个延迟在安全事件响应时是个问题,所以高安全场景应该用 OCSP 而不是 CRL,但 KEPServerEX 对 OCSP 的支持有限,具体要看版本。
4. 用户身份与权限:匿名、用户名、证书三种模式的取舍
4.1 匿名模式什么时候可以用
匿名模式意味着任何能网络到达服务端的人都可以读写标签。这在封闭的实验室网络里可以接受,但在任何有外部接入可能的网络里都是危险的。我见过一个案例:某工厂的 KEPServerEX 配了匿名访问,结果一个实习生用手机上的 OPC UA 客户端扫到了服务器 IP,误改了一个关键标签的值,导致产线停机。
如果非要用匿名,至少做两件事:一是用防火墙限制源 IP,只允许特定客户端网段访问 49320 端口;二是在 KEPServerEX 的标签层面做写保护,关键标签设为只读。这两条是补偿措施,不能替代身份验证。
4.2 用户名密码模式的配置与密码策略
用户名密码模式在配置管理器里配置,可以创建多个用户,每个用户分配不同的权限。KEPServerEX 的用户管理是独立的,和 Windows 用户无关。创建用户时,密码复杂度由配置管理器里的策略控制,可以设置最小长度、是否要求大小写混合、是否要求特殊字符。
我一般会为每个客户端系统创建一个独立用户,而不是共用。这样在审计日志里能区分是哪个系统在读写。密码用随机生成的强密码,存在客户端的配置文件里,而不是硬编码在代码里。如果客户端支持,优先用证书模式,因为证书比密码更难泄露。
4.3 证书模式的配置要点
证书模式下,客户端不需要提供用户名密码,服务端通过客户端证书的 CN 或 SAN 来识别身份。配置管理器里可以把某个证书的 CN 映射到一个 KEPServerEX 用户,从而继承该用户的权限。
配置步骤:先把客户端证书导入trusted目录,然后在配置管理器的用户管理里创建一个用户,在“证书映射”里填入客户端证书的 CN 或指纹。客户端连接时,服务端验证证书有效且受信任后,根据映射关系确定用户身份。
这种模式的好处是免密码,适合自动化系统之间的对接。坏处是证书管理复杂,证书过期或吊销时,所有用该证书的客户端都会断连。所以证书模式适合客户端数量少、可控性高的场景。
4.4 权限分配的粒度控制
KEPServerEX 的 OPC UA 权限可以控制到标签级别。在配置管理器里,每个用户或用户组可以分配对特定标签的读、写、浏览权限。这个功能在多人多系统共用一台 KEPServerEX 时很有用。
比如一个场景:SCADA 系统需要读写所有标签,MES 系统只需要读生产数据,不能写。那就创建两个用户,SCADA 用户给读写权限,MES 用户只给读权限。配置时注意,OPC UA 的权限是叠加的,如果一个用户属于多个组,权限取并集。所以不要把一个用户同时放进只读组和读写组,那样会变成读写。
5. 避坑与排查:五个让配置管理器“看起来正常但连不上”的典型问题
5.1 现象:客户端报 BadSecurityChecksFailed,但证书都在信任列表里
原因:客户端的证书链不完整。如果服务端证书是 CA 签发的,客户端需要同时信任 CA 证书和中间证书。只把服务端证书放进信任列表,但缺少 CA 证书,验证链会断。
解决:把 CA 证书和所有中间证书都导入客户端的信任列表。用 OpenSSL 命令openssl verify -CAfile ca_cert.pem server_cert.pem可以验证证书链是否完整。如果报错,说明缺证书。
5.2 现象:连接建立后立刻断开,日志显示 BadTimeout
原因:服务端的端点 URL 里填的是主机名,但客户端 DNS 解析不了,或者解析到了错误的 IP。OPC UA 客户端拿到端点列表后,会用列表里的 URL 重新连接,如果 URL 不可达就超时。
解决:在配置管理器里把端点 URL 改成 IP 地址,或者确保客户端能正确解析该主机名。用ping和telnet <IP> 49320在客户端机器上验证网络可达性。
5.3 现象:用户名密码正确,但报 BadUserAccessDenied
原因:用户没有分配任何标签的权限,或者用户被禁用。KEPServerEX 的用户管理里,新建用户后默认没有任何权限,需要手动分配。
解决:在配置管理器的用户管理里,检查该用户是否启用,以及是否分配了至少一个标签的读或写权限。如果用的是用户组,检查用户是否在组里。
5.4 现象:证书导入后连接仍然失败,rejected 目录里没有新证书
原因:客户端根本没有发送证书。如果客户端配置的安全策略是 None,它不会发送证书,服务端也就不会把证书放进 rejected。这种情况下,服务端可能直接拒绝连接,因为端点要求 SignAndEncrypt。
解决:检查客户端的安全策略配置,确保和服务端端点匹配。如果服务端端点要求 SignAndEncrypt,客户端必须配置证书并选择相同的安全策略。
5.5 现象:配置修改后重启服务,客户端连上了但读不到标签
原因:OPC UA 的标签空间和 KEPServerEX 的通道/设备/标签是两套映射。配置管理器里改了安全设置,但标签映射没有更新。或者客户端用的命名空间索引和服务端的对不上。
解决:在配置管理器的“标签空间”里检查标签是否正确暴露。客户端连接后先浏览地址空间,确认能看到预期的标签节点。如果看不到,检查 KEPServerEX 的通道是否启动、设备是否在线、标签是否被禁用。
6. 进阶:用配置管理器的导出功能做多环境同步与版本管理
配置管理器里有一个容易被忽略的功能:导出和导入配置。你可以把整个 OPC UA 配置导出成一个 XML 文件,然后在另一台 KEPServerEX 上导入。这个功能在有多套环境(开发、测试、生产)时特别有用。
具体操作:在配置管理器里右键根节点,选择“导出配置”,保存为 XML。导入时选择“导入配置”,指向该 XML。导入会覆盖当前配置,所以导入前先备份。
但导出文件里包含证书路径和私钥引用,直接导入到另一台机器时,证书路径可能不存在。我的做法是:导出配置后,手动编辑 XML,把证书路径改成相对路径或环境变量,然后在目标机器上把证书放到对应位置。这样一套配置可以在多台机器上复用。
更进一步,可以把导出的 XML 纳入版本控制(比如 Git)。每次修改配置后提交一次,记录改了什么、为什么改。出问题时可以回滚到上一个版本。我吃过一次亏:生产环境的 OPC UA 配置被误改,导致所有客户端断连,因为没有版本记录,花了两个小时才恢复。从那以后,所有 KEPServerEX 的 OPC UA 配置都纳入 Git 管理,每次变更都有 commit message。
还有一个技巧:用配置管理器的“比较”功能。导入一个配置后,可以和当前配置做差异对比,高亮显示哪些字段变了。这个功能在排查“为什么这台机器能连那台不能”时很有用,把两台机器的配置导出后对比,差异点一目了然。
最后说一个我自己的习惯:每次修改 OPC UA 配置前,先导出当前配置存一份,文件名带上日期和修改人。改完后,用 Python 客户端脚本跑一遍连接测试,确认读写正常再收工。这个脚本我放在项目仓库里,每次配置变更后都跑,算是最后一道防线。希望帮到你。
本文还有配套的精品资源,点击获取