西门子S7-1500 PLC启用OPC UA通信后,客户端(如PC上运行的UaExpert、Ignition、Node-RED或自研OPC UA客户端)首次连接时提示“BadCertificateRejected”、“BadCertificateUseNotAllowed”或直接断连,常见于TIA Portal V16/V17/V18环境下配置了OPC UA服务器但未完成双向证书信任链建立。根本原因不是证书无效,而是PLC端的信任列表(Trust List)中未包含客户端证书的颁发者(CA)或客户端证书本身,导致S7-1500在TLS握手阶段主动拒绝连接。
以下为零依赖、纯Web浏览器+TIA Portal可完成的完整解决流程。所有操作均基于标准固件(FW 2.8及以上)、无需第三方工具、不修改系统时间、不关闭安全策略。
一、确认问题现象与前置条件
-
验证当前状态:
- 在TIA Portal中打开项目 → 导航至
设备配置→ 双击CPU → 切换到OPC UA选项卡 → 确认启用OPC UA服务器已勾选,且安全策略设置为Basic256Sha256或None(调试阶段可暂设为None,但生产环境必须用Basic256Sha256)。 - 使用UaExpert(v1.5.3+)连接
opc.tcp://<PLC_IP>:4840,观察事件日志中是否出现以下任一错误:Status code: BadCertificateRejected (0x80130000)Status code: BadCertificateUseNotAllowed (0x80130003)- 连接几秒后自动断开,无节点树显示。
- 在TIA Portal中打开项目 → 导航至
-
确认PLC证书状态:
- 在TIA Portal中,点击
OPC UA选项卡右下角的管理证书按钮 → 查看弹出窗口中服务器证书是否显示为有效,且有效期至日期晚于当前PLC系统时间。若显示过期或无效,需先点击生成新证书并下载到PLC。
- 在TIA Portal中,点击
二、导出PLC服务器证书(供客户端信任)
S7-1500的OPC UA服务器证书由PLC自身生成并存储于硬件安全模块(HSM),不可直接复制文件,但可通过TIA Portal导出为标准PEM格式。
-
打开证书管理界面:
- 在TIA Portal中,进入
设备配置→ CPU →OPC UA→ 点击管理证书。
- 在TIA Portal中,进入
-
导出服务器证书:
- 在弹出窗口中,选中
服务器证书行 → 点击导出按钮 → 保存为文件名S7-1500_ServerCert.pem→ 文件类型选择PEM (.pem)。 - 该文件内容以
-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾,共1行Base64编码字符串(不含空行和空格)。
- 在弹出窗口中,选中
-
验证导出完整性:
- 用记事本打开
S7-1500_ServerCert.pem,确认:- 第1行严格等于
-----BEGIN CERTIFICATE-----(无空格、无BOM、无中文字符); - 最后1行严格等于
-----END CERTIFICATE-----; - 中间Base64字符串连续无换行(共1行,长度约1100–1300字符)。若含换行,请删除所有换行符合并为单行。
- 第1行严格等于
- 用记事本打开
三、获取客户端证书(关键步骤)
OPC UA采用双向证书认证(Mutual Authentication),PLC不仅需被客户端信任,客户端也必须被PLC信任。客户端证书来源分两类:
情况A:使用UaExpert(最常见)
UaExpert首次启动时自动生成一对密钥与证书,存于本地用户目录:
- Windows路径:
C:\Users\<用户名>\AppData\Roaming\UnifiedAutomation\UaExpert\Certificates\own\certs\ - 文件名固定为
UA Client Certificate.der(二进制DER格式)。
-
定位并复制证书文件:
- 打开上述路径 → 找到
UA Client Certificate.der→ 复制该文件到桌面。
- 打开上述路径 → 找到
-
转换为PEM格式(必需):
- 下载开源工具
openssl.exe(v3.0+,https://slproweb.com/products/Win32OpenSSL.html)→ 将openssl.exe放入桌面。 - 按住
Shift键右键桌面 → 选择在此处打开PowerShell窗口→ 执行:.\openssl.exe x509 -inform DER -in "UA Client Certificate.der" -out "UaExpert_ClientCert.pem" -outform PEM - 成功后生成
UaExpert_ClientCert.pem,内容以-----BEGIN CERTIFICATE-----开头。
- 下载开源工具
情况B:使用其他客户端(如Node-RED)
若客户端自行生成证书(如通过node-opcua库),需提供其certificate.pem文件。确保该文件为X.509 PEM格式,且未加密(无-----BEGIN ENCRYPTED PRIVATE KEY-----)。
⚠️ 注意:PLC只信任证书本身(公钥),不接收私钥。切勿导入
.key或.pfx文件。
四、将客户端证书添加至PLC信任列表
S7-1500的信任列表(Trust List)是存储于PLC RAM中的证书集合,仅接受PEM格式、且必须通过TIA Portal的“证书管理器”逐个导入。
-
启动TIA Portal证书管理器:
- 在TIA Portal中,进入
设备配置→ CPU →OPC UA→ 点击管理证书→ 切换到信任列表选项卡。
- 在TIA Portal中,进入
-
导入客户端证书:
- 点击
导入按钮 → 浏览并选中上一步生成的UaExpert_ClientCert.pem(或你的客户端PEM证书)→ 点击打开。 - 系统会校验证书有效性(签名、有效期、用途),若提示“证书无效”,请检查:
- 证书是否为客户端真实证书(非服务端证书);
- 证书是否过期(查看
Validity字段); - 证书
Key Usage是否包含Digital Signature(UaExpert证书默认满足)。
- 点击
-
强制刷新信任列表:
- 导入成功后,
信任列表中应显示该证书条目,状态为有效。 - 必须执行此步:点击窗口右下角
应用按钮 → 等待TIA Portal提示“已将更改下载到设备”。 - 此操作将信任列表写入PLC的OPC UA服务内存,重启PLC或OPC UA服务非必需,但建议执行。
- 导入成功后,
五、验证与故障排除
验证步骤(UaExpert为例)
- 关闭UaExpert所有实例。
- 删除UaExpert缓存证书(避免旧证书干扰):
- 删除目录
C:\Users\<用户名>\AppData\Roaming\UnifiedAutomation\UaExpert\Certificates\trusted\下所有文件。
- 删除目录
- 重新打开UaExpert →
地址栏输入opc.tcp://<PLC_IP>:4840→ 点击连接。 - 首次连接时,UaExpert会弹出证书信任提示 → 勾选
始终信任此证书→ 点击是。 - 连接成功后,左侧地址空间树应正常展开,可读取
Objects、Root等节点。
常见失败原因与修复
| 现象 | 根本原因 | 解决动作 |
|---|---|---|
连接后立即报 BadCertificateInvalid |
客户端证书的Subject Alternative Name (SAN)为空或不匹配PLC IP/域名 |
UaExpert证书默认无SAN,属正常;若自建证书,需在生成时添加 -addext "subjectAltName = IP:<PLC_IP>" |
| TIA Portal中导入证书失败,提示“证书链不完整” | 导入的是终端证书,但PLC要求根CA证书 | 错误操作:PLC信任列表只需导入客户端终端证书(即UaExpert_ClientCert.pem),不要导入CA证书 |
导入后仍拒绝连接,日志显示 BadCertificateChainIncomplete |
PLC固件版本低于FW 2.8 | 升级CPU固件至FW 2.8或更高(V16 SP1+项目默认支持) |
| 连接成功但无法读写变量 | OPC UA访问权限未配置 | 进入TIA Portal OPC UA → 用户管理 → 确保用户Anonymous或对应账户的读取/写入权限已启用 |
六、生产环境加固建议
-
禁用匿名访问:
- 在
OPC UA→用户管理中,取消勾选允许匿名访问→ 创建专用用户(如opcuser)并分配最小权限。
- 在
-
启用证书吊销检查(CRL):
- 若企业PKI已部署CRL分发点,在
管理证书→证书颁发机构中导入CA证书,并配置CRL URL(需PLC可访问该HTTP地址)。
- 若企业PKI已部署CRL分发点,在
-
定期轮换证书:
- PLC服务器证书有效期默认10年,但建议每2年更新:在
管理证书中点击生成新证书→ 下载 → 同时在客户端更新信任的PLC证书。
- PLC服务器证书有效期默认10年,但建议每2年更新:在
-
备份信任列表:
- TIA Portal不自动备份信任列表。每次成功导入后,手动记录已添加证书的
指纹(SHA-256):.\openssl.exe x509 -noout -fingerprint -sha256 -in "UaExpert_ClientCert.pem"输出示例:
SHA256 Fingerprint=AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:A1:B2:C3:D4:E5:F6:7G:8H:9I:0J:1K:2L:3M:4N:5O:6P
- TIA Portal不自动备份信任列表。每次成功导入后,手动记录已添加证书的
七、附:证书指纹快速比对表(用于审计)
当现场需确认PLC实际加载的证书是否与预期一致时,可通过Web服务器接口直接读取PLC证书指纹(无需TIA Portal):
- 在浏览器访问
http://<PLC_IP>/control/GetCertificateInfo(需PLC启用Web服务器且IP可达)。 - 页面返回JSON,提取
serverCertificateFingerprint字段值。 - 与本地
S7-1500_ServerCert.pem计算的SHA256指纹比对:
| 证书来源 | 计算命令 | 示例指纹(截取前16位) |
|---|---|---|
| PLC当前服务器证书 | curl -s http://<PLC_IP>/control/GetCertificateInfo \| jq -r '.serverCertificateFingerprint' |
AA:BB:CC:DD:EE:FF:11:22 |
本地导出的 S7-1500_ServerCert.pem |
openssl x509 -noout -fingerprint -sha256 -in S7-1500_ServerCert.pem \| sed 's/.*=//' |
AA:BB:CC:DD:EE:FF:11:22 |
两列值完全一致,证明PLC运行证书与本地备份一致。

暂无评论,快来抢沙发吧!