首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从opc ua服务器接受/查找证书?

如何从opc ua服务器接受/查找证书?
EN

Stack Overflow用户
提问于 2017-07-14 12:54:42
回答 3查看 6.2K关注 0票数 4

我是opc ua的新手,而不是java的专业人士。在java中设置客户端时,我在处理证书时遇到了麻烦。我想通过Basic 256,SignAndEncrypt连接到服务器。据我所知,在安全的这一阶段,客户端创建或加载的证书被发送到服务器,在那里它必须被接受。然后,服务器将证书发送回客户端,然后客户端需要接受证书。如果我错了请纠正我。

在客户端创建/加载证书并将其发送到服务器已经很好了(请参阅下面的代码),然后我可以在服务器端手动接受它。但在那之后,我陷入了困境:如何在代码中看到这个证书验证,如何找到服务器证书,更不用说接受它了?在实现过程中,我使用opc的SampleConsoleClient进行了一些定位。但与此形成对比的是,我不使用任何用户输入。

到目前为止,这是我的一些代码。

初始化:

代码语言:javascript
运行
复制
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():

代码语言:javascript
运行
复制
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; 

初始化之后,我尝试像这样连接(使用注释,我认为连接可以正常工作):

代码语言:javascript
运行
复制
final String securityPolicy = client.getEndpoint() == null
            ? client.getSecurityMode().getSecurityPolicy().getPolicyUri()
                    : client.getEndpoint().getSecurityPolicyUri();

            client.setSessionName(String.format("%s@%s/Session%d", APPLICATION_NAME,
                    ApplicationIdentity.getActualHostNameWithoutDomain(), ++sessionCount));
            try {
                //Idea: catch the server certificate and accept it. Only if that was possible: connect
                client.connect();
            } catch (final ServiceException e) {
                e.printStackTrace();
            }
            client.setKeepSubscriptions(false);
            // After that resolving namespace index (works fine)
            }

而引发的错误是:

代码语言:javascript
运行
复制
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()

提前感谢您的帮助!!

EN

Stack Overflow用户

发布于 2017-07-28 13:19:17

谢谢大家的回答。同时,我尝试从Prosys示例中的connect()initalize()方法中复制/粘贴并修改这些方法,这是可行的。我想这和更新一些信息有关,但我不太确定.事实上,我的应用程序现在正在工作,但感谢您的努力!

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45103558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档