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"]
问题原因分析
- Open62541编译选项缺失:默认情况下,Open62541的用户名密码认证功能是关闭的。本地环境编译Open62541时可能开启了该选项,但Docker镜像中仅启用了加密(
UA_ENABLE_ENCRYPTION=MBEDTLS),未开启用户名密码认证支持,导致客户端无法匹配服务端的UserTokenPolicy。 - 配置文件未同步到容器:如果
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
相关产品推荐
相关产品推荐

