gpt4 book ai didi

c# - 使用 BouncyCaSTLe 生成的证书验证为服务器时出现 "The credentials supplied to the package were not recognized"错误

转载 作者:IT王子 更新时间:2023-10-29 04:32:12 27 4
gpt4 key购买 nike

我正在尝试使用 BouncyCaSTLe.Crypto dll 创建证书,然后使用该证书将 SslStream 验证为在本地系统帐户下运行的 Windows 服务进程中的服务器。

但是,当我调用 SslStream.AuthenticateAsServer(certificate) 时,它会抛出 Win32 异常并显示错误消息“无法识别提供给包的凭据”。

这里有几个关于此错误消息的问题,但似乎都没有描述或解决我的特定问题。

希望有人能够提供一些帮助,我包含了我用来创建和安装证书的代码:

// First create a certificate using the BouncyCastle classes
BigInteger serialNumber = BigInteger.ProbablePrime(120, new Random());
AsymmetricCipherKeyPair keyPair = GenerateKeyPair();

X509V1CertificateGenerator generator = new X509V1CertificateGenerator();
generator.SetSerialNumber(serialNumber);
generator.SetIssuerDN(new X509Name("CN=My Issuer"));
generator.SetNotBefore(DateTime.Today);
generator.SetNotAfter(DateTime.Today.AddYears(100));
generator.SetSubjectDN(new X509Name("CN=My Issuer"));
generator.SetPublicKey(keyPair.Public);
generator.SetSignatureAlgorithm("SHA1WITHRSA");

Org.BouncyCastle.X509.X509Certificate cert = generator.Generate(
keyPair.Private, SecureRandom.GetInstance("SHA1PRNG"));

// Ok, now we have a BouncyCastle certificate, we need to convert it to the
// System.Security.Cryptography class, by writing it out to disk and reloading
X509Certificate2 dotNetCert;

string tempStorePassword = "Password01"; // In real life I'd use a random password
FileInfo tempStoreFile = new FileInfo(Path.GetTempFileName());

try
{
Pkcs12Store newStore = new Pkcs12Store();

X509CertificateEntry entry = new X509CertificateEntry(cert);

newStore.SetCertificateEntry(Environment.MachineName, entry);

newStore.SetKeyEntry(
Environment.MachineName,
new AsymmetricKeyEntry(keyPair.Private),
new [] { entry });

using (FileStream s = tempStoreFile.Create())
{
newStore.Save(s,
tempStorePassword.ToCharArray(),
new SecureRandom(new CryptoApiRandomGenerator()));
}

// Reload the certificate from disk
dotNetCert = new X509Certificate2(tempStoreFile.FullName, tempStorePassword);
}
finally
{
tempStoreFile.Delete();
}

// Now install it into the required certificate stores
X509Store targetStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
targetStore.Open(OpenFlags.ReadWrite);
targetStore.Add(dotNetCert);
targetStore.Close();

好的,现在我已经创建并安装了证书。然后我将我的 Windows 服务配置为使用此证书,方法是向它提供生成的证书指纹。然后我像这样使用证书:

// First load the certificate
X509Certificate2 certificate = null;

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

foreach (X509Certificate2 certInStore in store.Certificates)
{
if (certInStore.Thumbprint == "...value not shown...")
{
certificate = certInStore;
break;
}
}

SslStream sslStream = new SslStream(new NetworkStream(socket, false), false);

// Now this line throws a Win32Exception
// "The credentials supplied to the package were not recognized"
sslStream.AuthenticateAsServer(certificate);

有谁知道这里可能有什么问题吗?

如果我安装使用“makecert”创建的证书,我不会遇到问题,但这不适用于生产证书。

我也曾尝试创建一个单独的 x509v1 CA 证书,然后创建用于服务器身份验证的 x509v3 证书,但我遇到了同样的错误,因此为简单起见,我在示例代码中删除了它。

最佳答案

那个特定的错误信息敲响了警钟。我猜想要么您没有将私钥与证书一起存储,要么 Windows 服务无权访问私钥。要检查这一点,请打开证书 MMC 管理单元:

  1. 运行 mmc(例如从“开始”菜单)
  2. 文件菜单 > 添加/删除管理单元
  3. 在左 Pane 中选择“证书”,然后单击“添加”
  4. 选择“计算机帐户”(对于 LocalMachine),然后单击“下一步”,然后完成

导航到证书并在右 Pane 中双击。在出现的常规选项卡上,您应该会在底部看到一个小 key 图标,以及文本“您有一个与此证书相对应的私钥”。如果没有,那就是问题所在。私钥未保存。

如果存在私钥,请单击“确定”关闭此对话框,然后右键单击右侧 Pane 中的证书并在弹出菜单中选择:所有任务 > 管理私钥 key 。在该对话框中,确保运行该服务的 Windows 帐户具有私钥的读取权限。如果不是,那就是问题所在。

编辑:糟糕,您写道该服务作为本地系统运行,因此如果是这两个问题之一,那么它一定是缺少私钥。无论如何,我都会在我的答案中保留 key 访问检查,对于任何其他点击此并且未作为本地系统运行的人。

关于c# - 使用 BouncyCaSTLe 生成的证书验证为服务器时出现 "The credentials supplied to the package were not recognized"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com