【发布时间】:2025-12-31 14:45:12
【问题描述】:
我一直在尝试运行一个简单的 HTTPS 安全 Kestrel 服务,该服务使用已安装的自签名根证书(来自第 3 方)验证客户端。我正在努力寻找客户端证书的具体问题以及服务反弹连接的原因。有人可以明确回答 .NET Core 3.1 中的 Kestrel 在运行 OpenSSL 1.0.2k-fips 2017 年 1 月 26 日的 Linux 机器上不再接受签名算法为 md5RSA 的根证书吗?
我无法找到任何方法从 Kestrel 中找到更具体的内容。
我在 program.cs 中添加了以下内容以提供帮助:
private static bool ClientCertificateValidation(X509Certificate2 clientCertificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
StringBuilder sb = new StringBuilder();
int certNumber = 0;
foreach (X509ChainElement element in chain.ChainElements)
{
certNumber++;
var errors = element.ChainElementStatus;
List<string> errorList = new List<string>();
foreach(var cError in errors)
{
errorList.Add(cError.StatusInformation);
}
sb.AppendLine("Certificate #" + certNumber + ": (" + string.Join(",", errorList.ToArray()) + ")");
sb.AppendLine(" Subject: " + element.Certificate.Subject);
sb.AppendLine(" Issuer: " + element.Certificate.Issuer);
sb.AppendLine(" Serial #: " + element.Certificate.SerialNumber);
sb.AppendLine(" Thumbprint: " + element.Certificate.Thumbprint);
sb.AppendLine(" Valid Dates: " + element.Certificate.NotBefore.ToString() + " to " + element.Certificate.NotAfter.ToString());
sb.AppendLine(" Signature Algorithm: " + element.Certificate.SignatureAlgorithm.FriendlyName);
sb.AppendLine(" Version: " + element.Certificate.Version);
sb.AppendLine(" Encoded Certificate: " + Convert.ToBase64String(element.Certificate.Export(X509ContentType.Cert)));
}
Console.WriteLine(sb.ToString());
if (sslPolicyErrors.HasFlag(SslPolicyErrors.None))
{
Console.WriteLine($"***************** NO POLICY ERRORS! **********************");
return true;
}
return false;
}
通过以下方式调用它:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(options =>
{
options.ConfigureHttpsDefaults(
httpsOptions =>
{
httpsOptions.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
httpsOptions.SslProtocols = SslProtocols.Tls12;
httpsOptions.ClientCertificateValidation =ClientCertificateValidation;
});
});
});
但真正的“证书签名失败”让我没有什么好继续的。运行 openssl verify - 结果是 OK....那么 Kestrel 在做什么?
提前致谢
更新:
自签名(第 3 方)证书安装在服务器上以验证第 3 方的客户端。提到的命令确实返回错误,但由于证书是由第 3 方提供的,我不确定它有什么问题?
【问题讨论】:
-
尽管您无法判断,证书 可能 是根,即自签名。如果是这样,
openssl verify默认不检查其签名;使用openssl verify -check_ss_sig -
更新了我原来的帖子
标签: ssl .net-core certificate .net-core-3.1