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

Open62541客户端Docker环境下连接失败:用户令牌策略不匹配

Docker容器中Open62541客户端用户名密码连接失败:UserTokenPolicy不匹配问题

问题现象

在Docker容器内运行Open62541客户端,尝试通过用户名密码连接服务端时,返回以下错误:

Rejecting UserTokenPolicy 0 (username) in endpoint 0: configuration doesn't match
Rejecting UserTokenPolicy 1 (username) in endpoint 0: configuration doesn't match
Rejecting UserTokenPolicy 2 (certificate) in endpoint 0: configuration doesn't match
Rejecting UserTokenPolicy 3 (certificate) in endpoint 0: configuration doesn't match
Rejecting UserTokenPolicy 4 (anonymous) in endpoint 0: configuration doesn't match

error/client       No suitable UserTokenPolicy found for the possible endpoints

相同程序在本地Ubuntu环境可正常建立连接,仅Docker环境下出现异常。

提供的Dockerfile

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

# install dependencies
RUN apt-get update && \
    apt-get install -y --no-install-recommends build-essential git gcc g++ gdb make wget cmake iputils-ping ca-certificates pkg-config libmbedtls-dev libtinyxml-dev rapidjson-dev libsoup2.4-dev gcc-multilib g++-multilib && \
    rm -rf /var/lib/apt/lists/*


WORKDIR /usr/src/app

COPY . .

WORKDIR /usr/src/app/libs/open62541-master
RUN mkdir -p build
WORKDIR /usr/src/app/libs/open62541-master/build

RUN cmake .. -DBUILD_SHARED_LIBS=OFF -DUA_ENABLE_ENCRYPTION=MBEDTLS
RUN make

WORKDIR /usr/src/app/libs/open62541-master/build/bin

RUN cp /usr/src/app/libs/open62541-master/build/bin/libopen62541.a /usr/src/app

ENV LIBRARY_PATH=/usr/src/app/libs/open62541-master/build/bin
WORKDIR /usr/src/app
RUN ./build.sh

ENV LD_LIBRARY_PATH=/usr/src/app/libs/open62541-master/build/bin
ENV DISPLAY=:0

CMD ["./adapter_OPCUA"]

问题原因分析

  1. Open62541编译选项缺失:默认情况下,Open62541的用户名密码认证功能是关闭的。本地环境编译Open62541时可能开启了该选项,但Docker镜像中仅启用了加密(UA_ENABLE_ENCRYPTION=MBEDTLS),未开启用户名密码认证支持,导致客户端无法匹配服务端的UserTokenPolicy。
  2. 配置文件未同步到容器:如果adapter_OPCUA依赖本地的认证配置文件(如用户名密码存储、端点配置),Docker容器内可能缺少这些文件,导致认证配置不匹配。

解决方案

1. 修改Open62541编译选项,启用用户名密码认证

在Dockerfile的cmake命令中添加-DUA_ENABLE_AUTHENTICATION_USERNAME_PASSWORD=ON,确保Open62541编译时支持用户名密码认证:

cmake .. -DBUILD_SHARED_LIBS=OFF -DUA_ENABLE_ENCRYPTION=MBEDTLS -DUA_ENABLE_AUTHENTICATION_USERNAME_PASSWORD=ON

2. 同步应用所需的配置文件到容器

如果客户端程序依赖特定的配置文件(如存储用户名密码的文件、端点配置文件),在Dockerfile中添加COPY命令,将这些文件复制到容器内对应路径:

# 示例:复制配置目录到容器
COPY ./config /usr/src/app/config

3. 验证编译配置(可选)

可以在Dockerfile中添加步骤,确认Open62541的编译选项是否正确启用:

WORKDIR /usr/src/app/libs/open62541-master/build
RUN cmake -L .. | grep UA_ENABLE_AUTHENTICATION_USERNAME_PASSWORD

构建镜像时,该步骤会输出UA_ENABLE_AUTHENTICATION_USERNAME_PASSWORD:BOOL=ON,确认选项已开启。

修改后的Dockerfile示例

FROM ubuntu:22.04

ENV DEBIAN_FRONTEND=noninteractive

# install dependencies
RUN apt-get update && \
    apt-get install -y --no-install-recommends build-essential git gcc g++ gdb make wget cmake iputils-ping ca-certificates pkg-config libmbedtls-dev libtinyxml-dev rapidjson-dev libsoup2.4-dev gcc-multilib g++-multilib && \
    rm -rf /var/lib/apt/lists/*


WORKDIR /usr/src/app

COPY . .
# 复制配置文件(如果有)
# COPY ./config /usr/src/app/config

WORKDIR /usr/src/app/libs/open62541-master
RUN mkdir -p build
WORKDIR /usr/src/app/libs/open62541-master/build

# 启用用户名密码认证编译选项
RUN cmake .. -DBUILD_SHARED_LIBS=OFF -DUA_ENABLE_ENCRYPTION=MBEDTLS -DUA_ENABLE_AUTHENTICATION_USERNAME_PASSWORD=ON
RUN make

WORKDIR /usr/src/app/libs/open62541-master/build/bin

RUN cp /usr/src/app/libs/open62541-master/build/bin/libopen62541.a /usr/src/app

ENV LIBRARY_PATH=/usr/src/app/libs/open62541-master/build/bin
WORKDIR /usr/src/app
RUN ./build.sh

ENV LD_LIBRARY_PATH=/usr/src/app/libs/open62541-master/build/bin
ENV DISPLAY=:0

CMD ["./adapter_OPCUA"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:44:49