gpt4 book ai didi

c# - 您如何检查来自服务器的协商 TLS 握手?

转载 作者:太空宇宙 更新时间:2023-11-03 12:48:39 24 4
gpt4 key购买 nike

如果我有十几个端点,并且我的 WebAPI 服务配置为 TLS 1.1TLS 1.2,我如何检查每个传入的端点请求以查看哪个版本是协商好了吗?

因此,如果我的端点的使用者当前仅支持 TLS 1.0TLS 1.1,他们将(显然?)协商 TLS 1.1 握手。但是,如果不同的消费者支持 TLS 1.2TLS 1.3,他们将(显然?)协商 TLS 1.2 握手。

我想跟踪我的所有消费者以查看正在协商哪些握手。我如何根据请求执行此操作?

最佳答案

如果您使用的是 IIS,您似乎可以向 IIS 日志中添加一些扩展日志记录。

https://cloudblogs.microsoft.com/microsoftsecure/2017/09/07/new-iis-functionality-to-help-identify-weak-tls-usage/

剽窃……呃……为后人引用:

To enable this new functionality, these four server variables need to be configured as the sources of the custom fields in IIS applicationHost.config. The custom logging can be configured on either server level or site level. Here is a sample site-level configuration:

<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>

Each SSL info field is a hexadecimal number that maps to either a secure protocol version or cipher suite algorithm. For an HTTP plain-text request, all four fields will be logged as ‘-‘.

又是我:

看起来 CRYPT_PROTOCOL 对于 TLS1.2 可以是 400,对于 TLS 1.0 可以是 40,对于 TLS 1.0 可以是 10 IIS 文本日志中的 SSLv3。

从示例中可以看出,如果您想尝试在自定义日志中包含比 IIS 日志本身更容易自定义的日志,那么每个请求上可能都有 ServerVariable 值。

好问题!我可能有机会自己使用这个答案。


所以...看起来您可以从 WebAPI 获取 ServerVariables,但只是以一种意想不到的方式。请参阅下面的代码段。似乎如果您枚举集合或调用 Keys 属性,您得到的只是一些变量子集。但是,如果您在任何这些操作之前明确请求 CRYPT_* 变量,那么您的确可以从您的 Controller 中获取它们。我在 WebAPI 5.2.6 上尝试了这个,目标是在 IIS 下运行的 .net 4.6.2 作为 Azure 经典云服务。我建议尝试这个,看看它是否适合你。如果您有更新的服务器变量引用,请编辑此答案并替换 https://learn.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");
}
}

关于c# - 您如何检查来自服务器的协商 TLS 握手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461635/

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