eclipse milo opcua客户端连接到prosys服务器的问题

时间:2020-09-28 21:38:40

标签: java opc-ua milo

我正在尝试使用milo(0.4.2)连接到Prosys opcua仿真服务器

  1. 我使用openssl为用户生成了证书/密钥
  2. 我使用milo sdk中的示例为应用程序生成了证书,并将其导出为证书文件和未加密的pkcs 8 pem文件。
  3. 我将两个证书都复制到了prosys文件夹中

/home/user/.prosysopc/prosys-opc-ua-simulation-server/USERS_PKI/CA/certs

/home/user/.prosysopc/prosys-opc-ua-simulation-server/PKI/CA/certs

  1. 我检查了在prosys ui中两个证书是否都出现并且看起来很可信

  2. 最后,当我使用身份验证模式作为证书进行连接并且将安全性作为签名进行传输(使用在步骤1中生成的所有密钥和证书)时,我遇到了类似milo之类的相当有趣的异常

Exception in thread "main" java.util.concurrent.ExecutionException: UaException: status=Bad_SecurityChecksFailed, message=unknown securityAlgorithmUri: null
    at java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
    at java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
    at de.api.snippets.derReader.main(derReader.java:68)
Caused by: UaException: status=Bad_SecurityChecksFailed, message=unknown securityAlgorithmUri: null
    at org.eclipse.milo.opcua.stack.core.security.SecurityAlgorithm.fromUri(SecurityAlgorithm.java:143)
    at org.eclipse.milo.opcua.sdk.client.session.SessionFsmFactory.lambda$createSession$49(SessionFsmFactory.java:852)
    at org.eclipse.milo.opcua.sdk.client.session.SessionFsmFactory$$Lambda$2643/0000000000000000.apply(Unknown Source)
    at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)

我实际上看到这些字段来自prosys为空

picture from idea debug session

基本上,在这里我被困住了,从图片中可以看出,我请求了具有安全性模式的终结点并收到响应,我不知道该怎么办。 我尝试了milo提供的所有可用的SecurityPolicy,但是在所有情况下,我都遇到了相同的情况。

因此,第一个问题是必须在此securityAlgorithmUri中指定什么,并且是否始终指向prosys正确地填写它?

2 个答案:

答案 0 :(得分:0)

据我所知,这是Prosys堆栈或服务器中的错误。

使用标准UA TCP传输时似乎没有发生,因此请尝试使用HTTPS代替。

答案 1 :(得分:0)

提醒一下:prosys的问题确实是由于通过https协议使用opc连接服务器。

因此,在通过tcp切换到opc之后,我设法发现了使用证书对用户和消息级安全性签名和加密进行身份验证的终结点。

btw:如果有人会使用opensssl搜索脚本以生成用户证书,那么以下是示例conf文件:

openssl req -x509 -config openssl_cert.conf -extensions 'my server exts' -nodes \
            -days 365 -newkey rsa:2048 -keyout user.key -out user.crt

和文件内容:

[ req ]
prompt             = no
distinguished_name = my dn

[ my dn ]
# The bare minimum is probably a commonName
            commonName = user
           countryName = DE
          localityName = DE
      organizationName = comp
organizationalUnitName = comp Dept.
   stateOrProvinceName = DE
          emailAddress = user@example.com
                  name = user
               surname = user
             givenName = user
              initials = uu
           dnQualifier = some

[ my server exts ]
extendedKeyUsage = clientAuth, codeSigning
keyUsage = digitalSignature, keyAgreement, keyEncipherment, nonRepudiation, dataEncipherment, keyCertSign