azure - 在 Azure 设备预配服务中为多个设备使用相同的 X509 证书
问题描述
我必须在 Azure 设备预配服务中注册多个设备,并且我正在使用组注册来实现相同的目的。我也创建了一个自签名 X509 证书和注册组。我使用示例代码在组中注册了一个模拟设备。我想创建另一个具有相同证书的模拟设备并在组中注册。那可能吗?示例应用程序的输入是设备配置服务的 Id 范围和证书。如何添加其他设备。
if (string.IsNullOrWhiteSpace(s_idScope))
{
Console.WriteLine("ProvisioningDeviceClientX509 <IDScope>");
return 1;
}
X509Certificate2 certificate = LoadProvisioningCertificate();
using (var security = new SecurityProviderX509Certificate(certificate))
{
ProvisioningDeviceClient provClient =
ProvisioningDeviceClient.Create(GlobalDeviceEndpoint, s_idScope, security, transport);
var sample = new ProvisioningDeviceClientSample(provClient, security);
sample.RunSampleAsync().GetAwaiter().GetResult();
}
return 0;
}
private static X509Certificate2 LoadProvisioningCertificate()
{
string certificatePassword = ReadCertificatePassword();
var certificateCollection = new X509Certificate2Collection();
certificateCollection.Import(s_certificateFileName, certificatePassword, X509KeyStorageFlags.UserKeySet);
X509Certificate2 certificate = null;
foreach (X509Certificate2 element in certificateCollection)
{
Console.WriteLine($"Found certificate: {element?.Thumbprint} {element?.Subject}; PrivateKey: {element?.HasPrivateKey}");
if (certificate == null && element.HasPrivateKey)
{
certificate = element;
}
else
{
element.Dispose();
}
}
if (certificate == null)
{
throw new FileNotFoundException($"{s_certificateFileName} did not contain any certificate with a private key.");
}
else
{
Console.WriteLine($"Using certificate {certificate.Thumbprint} {certificate.Subject}");
}
return certificate;
}
private static string ReadCertificatePassword()
{
var password = new StringBuilder();
Console.WriteLine($"Enter the PFX password for {s_certificateFileName}:");
while (true)
{
ConsoleKeyInfo key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Backspace)
{
if (password.Length > 0)
{
password.Remove(password.Length - 1, 1);
Console.Write("\b \b");
}
}
else if (key.Key == ConsoleKey.Enter)
{
Console.WriteLine();
break;
}
else
{
Console.Write('*');
password.Append(key.KeyChar);
}
}
return password.ToString();
}
}
}
解决方案
在 Azure 中实现的客户端身份验证(用于验证一方的 X.509)需要每个端节点具有唯一的叶证书和私钥,有点像公钥/私钥对。
该密钥对用于验证该方是否就是它所说的那个人。
每个终端节点必须拥有唯一的密钥对才能这样做。此密钥对是从受信任的证书链生成的,生成的密钥对称为叶子。
证书链可以是 CA 签名或自签名(自签名仅用于开发/测试目的,不适用于生产)。
在这个链中,您有一个根证书,您可以从中生成叶子。您可以在链中生成任意数量的叶子。每个唯一的叶子都可以用作每个设备的密钥对。
对于您的情况,您可以使用 OpenSSL 生成自签名根证书,然后为您的所有设备生成尽可能多的自签名叶子。
推荐阅读
- python - 如何在 FOR 循环的第一次迭代中访问索引 [i-1] [Python]
- typescript - 使用 TypeScript 项目引用导入语法
- ios - 委派不更新数组
- css - css inline-table 和元素的表格单元格对齐
- tensorflow - 为什么layers中需要input_length。在keras tensorflow中嵌入?
- dataframe - 列出满足条件的数据框中的前 n 行
- loopback - Loopback 4 购物示例抛出错误
- unreal-engine4 - 如果玩家在 UE4.22 中将框移动到按钮,如何使门户可见?
- c# - Devexpress 日程表
- django - 如何在 Django 应用程序中构建应用程序的层次结构