如果您使用的是 IIS,您似乎可以在 IIS 日志中添加一些扩展日志记录。
https://cloudblogs.microsoft.com/microsoftsecure/2017/09/07/new-iis-functionality-to-help-identify-weak-tls-usage/
抄袭……呃……引用后代:
要启用这个新功能,这四个服务器变量需要
配置为 IIS 中自定义字段的来源
应用程序主机配置。自定义日志记录可以在任何一个上配置
服务器级别或站点级别。这是一个站点级配置示例:
<site name="Default Web Site" id="1" serverAutoStart="true">
<application path="/">
<virtualDirectory path="/" physicalPath="C:\inetpub\wwwroot" />
</application>
<bindings>
<binding protocol="https" bindingInformation="*:443:" />
</bindings>
<logFile>
<customFields>
<clear />
<add logFieldName="crypt-protocol" sourceName="CRYPT_PROTOCOL" sourceType="ServerVariable" />
<add logFieldName="crypt-cipher" sourceName="CRYPT_CIPHER_ALG_ID" sourceType="ServerVariable" />
<add logFieldName="crypt-hash" sourceName="CRYPT_HASH_ALG_ID" sourceType="ServerVariable" />
<add logFieldName="crypt-keyexchange" sourceName="CRYPT_KEYEXCHANGE_ALG_ID" sourceType="ServerVariable" />
</customFields>
</logFile>
</site>
每个 SSL 信息字段都是一个十六进制数字,映射到
安全协议版本或密码套件算法。对于 HTTP
纯文本请求,所有四个字段都将记录为“-”。
又是我:
在 IIS 文本日志中,CRYPT_PROTOCOL 似乎可以是 TLS1.2 的 400、TLS 1.0 的 40、SSLv3 的 10。
从示例中,如果您想尝试在自定义日志中包含比 IIS 日志本身更容易自定义的自定义日志,那么每个请求上可能都有 ServerVariable 值。
好问题!我可能有机会自己使用这个答案。
所以...看起来您可以从 WebAPI 获取 ServerVariables,但只能以一种意想不到的方式。请参阅下面的 sn-p。似乎如果您枚举集合或调用 Keys 属性,您得到的只是变量的一些子集。但是,如果您在任何这些操作之前明确请求 CRYPT_* 变量,那么您 can indeed 从您的控制器中获取它们。我在针对在 IIS 下作为 Azure 经典云服务运行的 .net 4.6.2 的 WebAPI 5.2.6 上进行了尝试。我建议尝试一下,看看它是否适合你。如果您有服务器变量的更新参考,请编辑此答案并将https://docs.microsoft.com/en-us/iis/web-dev-reference/server-variables 替换为您的链接。
以下为我列出的环境的写作日期工作。将来可能会改变。对于生产,我肯定会将其移至辅助方法中。
if (Request.Properties.TryGetValue("MS_HttpContext", out object context))
{
if (context is HttpContextWrapper wrapper)
{
var v = wrapper.Request?.ServerVariables;
if (v != null)
{
var headers = response.Headers;
const string CRYPT_PROTOCOL = nameof(CRYPT_PROTOCOL);
try
{
headers.Add($"SV_{CRYPT_PROTOCOL}", $"[{v[CRYPT_PROTOCOL].Replace("\r", "0x0D").Replace("\n", "0x0A")}]");
}
catch (Exception ex)
{
headers.Add($"SV_{CRYPT_PROTOCOL}", ex.Message);
}
foreach (string key in v.AllKeys)
{
headers.Add($"SV_{key}", v[key].Replace("\r", "0x0D").Replace("\n", "0x0A"));
}
headers.Add($"SV_DONE", "All Server Variables Replaced");
}
}