根据此博文,如果启用“协商客户端证书”,Azure API 管理应默认为 TLS 1.2,因为 TLS 1.3 中不允许这样做。
我在部署实例后在自定义域上启用了此功能,但在测试时,它继续提供 TLS 1.3。 在“协议 + 密码”下,我只为客户端和后端协议启用了 TLS 1.2(1.3 甚至不在列表中)。
命令:
docker run --rm -ti drwetter/testssl.sh --protocols https://[my-apim-instance].azure-api.net
输出:
Testing protocols via sockets except NPN+ALPN
SSLv2 not offered (OK)
SSLv3 not offered (OK)
TLS 1 not offered
TLS 1.1 not offered
TLS 1.2 offered (OK)
TLS 1.3 offered (OK): final <--- I would like this to say "not offered"
NPN/SPDY not offered
ALPN/HTTP2 not offered
我不是安全专家,但这是我对 tls 1.2 和 1.3 的理解
客户端将启动 tls 请求,如果它想使用 TLS 1.3,它将发送一个 ClientHello,其中“legacy_version”设置为 0x0303(这意味着 TLS 1.2 而不是 TLS 1.3),并且“supported_versions”扩展为 0x0304(这意味着TLS 1.3) 表示为支持的最高版本。
在您的情况下,testssl.sh 必须包含 tls 1.3 作为受支持的版本。 APIM 查看客户端请求并检查其密码配置。宾果游戏! APIM 可以支持 tls 1.3 密码,因此返回给客户说
i can do tls 1.3, let's use the highest security
因此,请在 apim 的密码选项卡中禁用 tls 1.3 密码并再次运行测试,它应该只使用 tls 1.2。或者检查testssl.sh是否有一个仅请求tls 1.2的开关。
Cipher suites defined for TLS 1.2 cannot be used in TLS 1.3, and vice versa, unless otherwise stated in their definition.
关于您提到的博客文章的另一条注释,似乎表明 tls 1.3 只会破坏客户端证书的一个非常狭窄的情况。值得检查一下您是否确实需要禁用它。
To clarify: "Client certificate negotiation" is supported in TLS 1.3 with Azure API Management. Renegotiation, API clients making new handshakes while in the middle of a connection, is not supported in TLS 1.3 with Azure API Management.