我试图建立一个HTTPS连接到网络服务器通过SSL流使用谷歌浏览器(最新版本),我生成我的证书使用CreateSelfSignedCertificate(string commonName)
,当我调用https://localhost/
它总是引发一个System.Security.Authentication.AuthenticationException : A call to SSPI failed, see inner exception -> Win32Exception: An unknown error occurred while processing the certificate
我使用的是临时密钥,不想存储证书。
下面是我代码:
...
ServerCertificate = CreateSelfSignedCertificate("localhost");
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
SslStream s = new SslStream(_stream, false, ValidateServerCertificate);
s.AuthenticateAsServer(ServerCertificate, false, SslProtocols.Tls12, false);
_stream = s;
...
...
public bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public static X509Certificate2 CreateSelfSignedCertificate(string commonName)
{
X500DistinguishedName subjectName = new X500DistinguishedName($"CN={commonName}");
using (RSA rsa = RSA.Create(2048))
{
CertificateRequest certificateRequest = new CertificateRequest(subjectName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
certificateRequest.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DataEncipherment | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DigitalSignature, false));
X509Certificate2 certificate = certificateRequest.CreateSelfSigned(DateTimeOffset.UtcNow, DateTimeOffset.UtcNow.AddYears(1));
byte[] pfxData = certificate.Export(X509ContentType.Pkcs12);
return new X509Certificate2(pfxData, "", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.EphemeralKeySet);
}
}
更新:
- 我不得不使用SAN,因为谷歌Chrome需要SAN,从来没有使用CNN回退。
1条答案
按热度按时间soat7uwm1#
回答
在Windows上无法使用临时密钥进行身份验证,因为提供TLS/SSL的底层操作系统组件无法使用临时密钥。
参见github issue here
还有:
与
return certificate
基本相同。人们进行pkcs 12导出和重新导入的原因是NOT指定EphemeralKeySet*(你也不应该AssertPersistKeySet,除非你真的想这么做)*。而且你可能也不需要Exportable。
会更有效
***我遇到的问题最好用一个问题来描述,这个问题由于年龄太大而被锁定在github问题链接here上。
***感谢微软的巴顿Jeremy Barton在这方面对我的帮助,并在这个问题上指出了一些光明。
解决方案
要解决此问题,请执行以下操作:
您可以使用Azure Key Vault切换到基于Linux的Azure App Service来管理您的证书。Azure Key Vault可以安全地存储证书和私钥,并自动处理续订。
或
必须使用
X509KeyStorageFlags.MachineKeySet
将证书持久化到特定CSP这是我的代码到目前为止,这基本上存储了自签名证书,一旦它已经创建,使您的服务器能够
AuthenticateAsServer()
没有抛出Win32异常。根据需要创建自签名证书的函数 (可根据需要自由调整):
代码用于在认证之前将证书存储到特定的CSP,只有当它还不存在 (在这里,我们将其存储到LocalMachine可信证书,因为Google共享这些证书并可以访问它)
希望对你有帮助
感谢@Charlieface的帮助