我是新来的opc ua而不是java的专业版。在java中设置客户端时,我遇到了处理证书的问题。我想通过Basic 256,SignAndEncrypt连接到服务器。据我所知,在这个安全阶段,由客户创建或加载的证书被发送到服务器,在那里它必须被接受。然后服务器将证书发送回客户端,然后客户端需要接受该证书。请纠正我,如果我错了。如何从opc ua服务器接受/查找证书?
在客户端创建/加载证书并将其发送到服务器已经正常工作(请参阅下面的代码),然后我可以手动在服务器端接受它。但之后,我卡住了:如何在代码中看到此证书验证,以及如何找到服务器证书,更不用说接受它了? 在实现过程中,我使用opc ua的SampleConsoleClient进行了一些定位。但与此相反,我不使用任何用户输入。
以下是我的一些代码到目前为止。
初始化:
try {
client = new UaClient(serverUri);
} catch (final URISyntaxException e) {
throw new InitializationException("The server uri has an invalid syntax.", e);
}
try {
client.setApplicationIdentity(createApplicationIdentity());
} catch (final SecureIdentityException e) {
throw new InitializationException(
"Application Identity could not be created due to a Security Identity Exception.", e);
} catch (final IOException e) {
throw new InitializationException("Application Identity could not be created due to an IO Exception.",
e);
}
createApplicationIdentity():
final ApplicationDescription appDescription = new ApplicationDescription();
appDescription.setApplicationName(new LocalizedText(APPLICATION_NAME, Locale.ENGLISH));
appDescription.setApplicationUri(APPLICATION_URI);
appDescription.setProductUri(PRODUCT_URI);
appDescription.setApplicationType(ApplicationType.Client);
// Setting security features
client.setSecurityMode(SecurityMode.BASIC256_SIGN_ENCRYPT);
client.setCertificateValidator(validator);
validator.setValidationListener(myValidationListener); //myValidationListener is similar to most lines in MyCertificateValidationListener in the opc ua samples
final File privatePath = new File(validator.getBaseDir(), "private");
final KeyPair issuerCertificate = null;
final int[] keySizes = null;
final ApplicationIdentity identity = ApplicationIdentity.loadOrCreateCertificate(appDescription,
"Sample Organisation", "opcua", privatePath, issuerCertificate, keySizes, true);
identity.setApplicationDescription(appDescription);
return identity;
初始化之后,我尝试这样的连接(与注释,我所想象的连接可以正常工作):
并引发错误:
WARN (?:?): /<IPofServer> Error org.opcfoundation.ua.common.ServiceResultException: Bad_SecurityChecksFailed
(0x80130000) "An error occurred verifying security." at
org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(Unknown Source)
com.prosysopc.ua.client.ConnectException: Failed to create secure channel to server: : opc.tcp://<IPofServer>
[http://opcfoundation.org/UA/SecurityPolicy#Basic256,SignAndEncrypt]
ServiceResult=Bad_SecurityChecksFailed (0x80130000) "An error occurred verifying security."
at com.prosysopc.ua.client.UaClient.n(Unknown Source)
at com.prosysopc.ua.client.UaClient.connect(Unknown Source)
at *lineOfCode*
Caused by: org.opcfoundation.ua.common.ServiceResultException:
Bad_SecurityChecksFailed (0x80130000) "An error occurred verifying security."
at org.opcfoundation.ua.transport.tcp.io.TcpConnection$ReadThread.run(Unknown Source)
随着lineOfCode是client.connect()
。
在此先感谢您的帮助!
谢谢你的回答!我明白我必须处理服务器发送的证书。我的问题是更多的_programmatically_,因为我真的空白在这里:我已经设置了一个验证器(见上面的代码),当我通过'validator.getRejected/Revoked/TrustedCertificates'检查'client.connect()'之前和之后的证书。 length()'我在连接之前和之后都得到了'0'作为所有三种证书的答案。拒绝的目录中是否至少有一个? – Nanda
@Nanda我对.Net基础案有更多的经验,但我期望在Java中有类似的方法。在Opc UA中,客户端必须信任服务器(我的答案中的第2步)。这通常通过将服务器证书放入特定位置来完成。这个位置必须让你的应用程序知道,这是你需要采取行动的地方(以编程方式)。您必须弄清楚如何告诉验证程序在哪里搜索(可信)证书。如果验证程序不提供这种属性,则需要以某种方式检查信任,但我不相信这一点。一个 – Thomas
理由让我相信这是验证程序具有TrustedCertifcates属性。我希望应用程序能够在某些地方将某些商店的内容加载到该变量中。如果您调试此'TrustedCertificates'变量的初始化方式,您应该了解如何执行此操作的提示。 – Thomas