如何使用OPC基础(.NET)在程序文件中指定ApplicationCertificate

hl0ma9xz  于 2023-03-04  发布在  .NET
关注(0)|答案(1)|浏览(272)

在程序数据中无法识别我正在使用的证书(client2.p12)。证书的路径为:
C:\ProgramData\OPC Foundation\CertificateStores\MachineDefault\client2.p12
我手动创建了此路径。
如果我使用此代码并将证书放入具有以下代码的文件夹中,则可以使用证书:

var appCertificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @".\certs\client2.p12"), "123");

config.SecurityConfig.ApplicationCertificate = new(appCertificate);

我想要的是:

ApplicationCertificate = new CertificateIdentifier
{
    StoreType = "Directory",
    StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault",
    SubjectName = "client2.p12"
    //or this? SubjectName = "O=Siemens, C=DE, CN=Siemens TIA Project(4JGMmGiXXkylgtqHpIhfvg)"
},

我得到的错误:找不到应用程序证书
我把证书放在前面提到的地方了。
谢谢!

t40tm48m

t40tm48m1#

我相信我期待了一些错误的东西。要使用现有的证书,您可以使用(下面是另一个版本):

var appCertificate = new X509Certificate2(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @".\certs\client2.p12"), "123");
application.ApplicationConfiguration.SecurityConfiguration.ApplicationCertificate = new(appCertificate);

因此,如果要使用ProgramData中的路径,可以只使用我在答案中使用的路径
现在,如果您没有证书,但希望在运行时创建一个证书,则可以使用以下命令:
你的config.SecurityConfiguration.ApplicationCertificate可以是这样的:

ApplicationCertificate = new CertificateIdentifier
{
    StoreType = "Directory",
    StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault",
    SubjectName = "O=Siemens, C=DE, CN=Siemens TIA Project(4JGMmGiXXkylgtqHpIhfvg)"
},

如果在XML文件中使用,则相同
要获取要制作的证书的本地IP和DNS,请执行以下操作:

private static List<string> GetLocalIpAddressAndDns()
    {
        List<string> localIps = new List<string>();
        var host = Dns.GetHostEntry(Dns.GetHostName());
        foreach (var ip in host.AddressList)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                localIps.Add(ip.ToString());
            }
        }
        if (localIps.Count == 0)
        {
            throw new Exception("Local IP Address Not Found!");
        }
        localIps.Add(Dns.GetHostName());
        return localIps;
    }

现在,您可以创建证书并将其插入到配置中:

// Get local interface ip addresses and DNS name
List<string> localIps = GetLocalIpAddressAndDns();
UInt16 keySize = 2048; //must be multiples of 1024
DateTime startTime = DateTime.Now;
string certPassword = "123";
UInt16 lifeTime = 2048;
UInt16 hashSize = 2048;

// Make certificate
config.SecurityConfiguration.ApplicationCertificate = new(CertificateFactory.CreateCertificate(
     config.SecurityConfiguration.ApplicationCertificate.StoreType,
     config.SecurityConfiguration.ApplicationCertificate.StorePath,
     certPassword,
     config.ApplicationUri,
     config.ApplicationName,
     config.SecurityConfiguration.ApplicationCertificate.SubjectName,
     localIps,
     keySize,
     startTime,
     lifeTime,
     hashSize
));

现在,每当您运行此代码时,它都会生成一个证书
编辑:要获取您使用前面的代码创建的保存证书:

config.SecurityConfiguration.ApplicationCertificate.LoadPrivateKey("123").Wait();

config.SecurityConfiguration.ApplicationCertificate = new(config.SecurityConfiguration.ApplicationCertificate.Find(true).Result);

相关问题