如何获取OPC UA客户端证书(.NET)

4
我正在开发一个用于OPC UA服务器的C#客户端。我不是OPC Foundation的付费会员,因此无法访问SDK。我正在使用免费提供的示例应用程序和.NET堆栈。
我遇到的问题之一是没有安全证书。我的客户端可以连接到服务器,但是以非安全模式进行连接,这导致无法访问服务器上的数据库。我认为我缺少客户端证书(可能还有服务器端证书)。我完全可以访问服务器的管理,但我一直无法找出如何检索/生成证书。请问我该怎么做?
2个回答

4
一般情况下,获取客户端证书是OPC UA客户端应用程序的责任。通常情况下,如果没有生成和配置证书,则SDK会创建默认的自签名证书。如果您查看.NET UA应用程序的xml配置文件,则应该可以找到定义证书参数的地方,并且可以自动生成它。 为了在安全模式下进行通信,客户端和服务器都应该信任彼此的证书。如果证书存储在文件系统中,则可以通过将客户端证书复制到服务器的受信任文件夹中来建立自签名证书的信任,并反之亦然。 通过GetEndpoints调用,可以以编程方式获取服务器证书。 服务器可以从OpenSecureChannel请求中获取客户端证书。

1
在OPC基金会的OPC UA客户端中,您可以使用以下代码自动创建自签名客户端证书并接受服务器证书:
          SecurityConfiguration = new SecurityConfiguration
            {
                ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "MyClient" },
                TrustedIssuerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" },
                TrustedPeerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" },
                RejectedCertificateStore = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\RejectedCertificates" },
                AutoAcceptUntrustedCertificates = true
            },

application.CheckApplicationInstanceCertificate(false, 2048).GetAwaiter().GetResult();

您还可以通过更改SubjectName为所需证书的CN来指定要使用的证书(自定义证书)。只需确保将私钥放在私有文件夹中。

如果将第二个参数设置为true,则连接到服务器时会使用安全性(证书)。

var selectedEndpoint = CoreClientUtils.SelectEndpoint("opc.tcp://" + ip + ":" + port, true);

嘿@Victor,你在指定证书配置后如何设置会话?自动生成证书很好用,就像你描述的那样。但是如果我不想使用匿名连接,在创建我的'UserIdentity'时需要指定一个证书。你是怎么解决这个问题的? - Pfanna
1
@Pfanna,您可以创建一个用户身份而无需指定证书。这是我创建会话的方法:UserIdentity user = new UserIdentity(username, password); EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(config); ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, selectedEndpoint, endpointConfiguration); Session session = await Session.Create(config, endpoint, false, config.ApplicationName, 60000, user, null); - Victor Pieper
非常感谢您的回复:)。 好的,我明白了,您正在使用用户名/密码身份验证。 一开始对所有的证书相关内容有些困惑。现在我想我明白了,谢谢。 - Pfanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接