1

我对 UserIdentity(user, password) 构造函数有疑问。我的密码是 4 个字符长。当密码到达服务器时,它的长度为 36 个字符。前 4 个字符是我的密码 - 其余的是随机垃圾。

Opc.Ua.Client.dll 和 Opc.Ua.Core.dll 的版本为 1.0.238.1。

是什么原因造成的,我该怎么做才能正确发送密码?

更新

ApplicationConfiguration configuration = Helpers.CreateClientConfiguration();
X509Certificate2 clientCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find();
configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
EndpointDescription endpointDescription = Helpers.CreateEndpointDescription(Url);
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);
endpointConfiguration.OperationTimeout = 300000;
endpointConfiguration.UseBinaryEncoding = true;
ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
BindingFactory bindingFactory = BindingFactory.Create(configuration);

if (endpoint.UpdateBeforeConnect)
{
    endpoint.UpdateFromServer(bindingFactory); 
    endpointDescription = endpoint.Description;
    endpointConfiguration = endpoint.Configuration;
}

SessionChannel channel = SessionChannel.Create(
    configuration,
    endpointDescription,
    endpointConfiguration,
    bindingFactory,
    clientCertificate,
    null);

m_Session = new Session(channel, configuration, endpoint);
m_Session.ReturnDiagnostics = DiagnosticsMasks.All;

m_Session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
m_Session.Notification += new NotificationEventHandler(m_Session_Notification);

UserIdentity identity;
if (userName == null || userName.Length == 0)
{
    identity = new UserIdentity();
}
else
{
    identity = new UserIdentity(userName, password);
}

m_Session.Open("ATF UA client", identity);
log.Debug("Connect ok");
4

1 回答 1

1

其余的根本不是垃圾。它应该与您在 CreateSessionResponse 中发送到 OPC UA 客户端的 ServerNonce 相同。

根据 OPC UA 规范,UserIdentityToken 加密格式为:

  • 长度 - 字节[4] => 密码长度
  • TokenData - Byte[*] => 你的密码
  • ServerNonce - 字节[*]

密码为 36 字节长,因为 OPC UA 服务器主要使用 32 字节的 ServerNonce,而您的密码为 4 字节长...

您还应该验证与该 UserIdentityToken 一起发送的 ServerNonce 是否与您在 CreateSessionResponse 中提供的相同。

于 2013-03-12T16:55:59.537 回答