[Bug]: OPC UA UserNameIdentityToken sends length+password+nonce instead of the plain password when token security policy is None

Đang mở
#2,791 2 bình luận 0 reaction 2 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 1 ngày

@splatch đang làm issue này rồi.

Từ ngày 2/10/2026.

  • #2828 của @dongxuelian2 — đang mở

Đánh giá

Issue này chưa được đánh giá.

Mô tả

OPC-UA
What happened?

With PLC4J 1.0.0, the OPC UA driver cannot log in with username/password when the selected user token policy resolves to security policy None (and allow-insecure-credentials=true is set). The server answers ActivateSession with BadUserAccessDenied (0x801f0000). The same server and credentials work with 0.13.1.

The cause is in SecureChannel.getIdentityToken(...) (plc4j/drivers/opcua/src/main/java/org/apache/plc4x/java/opcua/context/SecureChannel.java, tag v1.0.0, unchanged on develop). For userTokenTypeUserName the method builds the RSA plaintext block length(4, little endian) + password + serverNonce (encodeablePassword). In the SecurityPolicy.NONE branch that block is sent as the token password instead of the password itself:

if (tokenSecurityPolicy == SecurityPolicy.NONE) {
    // No encryption: the password is sent as-is and no algorithm is declared.
    tokenPassword = encodeablePassword;   // should be passwordBytes
    encryptionAlgorithm = "";
}

OPC UA Part 4, 7.41.3 (UserNameIdentityToken): when encryptionAlgorithm is empty the password field carries the UTF-8 password itself; the length/nonce wrapping only applies to the encrypted form. A spec-conforming server therefore compares <4 length bytes> + password + nonce with the stored password and rejects the login. The code comment says "the password is sent as-is", so this looks like the wrong local variable.

Steps to reproduce
  1. OPC UA server that exposes a None endpoint with a UserName user token policy without its own securityPolicyUri and requires authentication (we used python asyncua 1.1.5 with a user manager that compares username/password in plain text).
  2. Connect with opcua:tcp://host:port?discovery=false&security-policy=NONE&allow-insecure-credentials=true&username=u&password=p and read any node.
  3. Connection fails with PlcProtocolException: Server returned error BadUserAccessDenied (0x801f0000). On the server side the received password is 4 + len(password) + 32 bytes long.
Expected

The token password is the plain UTF-8 password when no encryption algorithm is declared, as in 0.13.1, and the login succeeds.

Suggested fix

In the SecurityPolicy.NONE branch use tokenPassword = passwordBytes; (and only build encodeablePassword for the encrypted branch).

Version

1.0.0 (Java, plc4j-driver-opcua), JDK 21.

Ngôn ngữ chính
Java
Star
1.8k
Fork
514
Merge trung bình
1 ngày 4 giờ
Pull request đã merge (30 ngày)
27

Chuẩn bị môi trường

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của apache/plc4x

Tất cả issue của apache/plc4x

Issue tương tự

Thêm issue về Java

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.