第三方合作伙伴对平台安全性要求严格。我们已经发布了十多次来处理它。在这个过程中,我对安全有了更深的理解。具体的理解在于技术方案和密码学盲点两种方式。下面我们来看两个方面,可能还不够深入,至少对于我们开发者来说,应该基本够用了。NETCoreCipher(套件)配置如果项目没有严格的要求,我这里肯定做不到本文以.NET5为例,但是.NETCore的工具扫描协议套件的结果3或3.1略有不同,但不影响我们配置安全套件。我们使用OpenSSL生成自签名证书,我会出文章讲解OpenSSL自签名证书等",adapterOptions=>{adapterOptions.SslProtocols=SslProtocols.Tls12;});});});HTTPS结合TLS协议1.0或者1.1都不安全,所以TLS协议需要使用1.2+,这里我们使用1.2版本如上代码进行连接接下来,我们将部署在Linux上,然后安装nmap,通过nmap工具扫描(至于什么nmap是,大家可以自行学习)通过nmap扫描指定端口号,枚举其支持的TLS套件需要注意的地方,我们可能会发现大部分是扫描文章中的命令结果,根本没有结果。其实,nmap只对扫??描指定端口有效(如443等),例如使用如下命令无效nmap--scriptssl-enum-cipherslocalhost-p8000命令扫描nmap--script+ssl-enum-cipherslocalhost-p8000最后,我们扫描的结果如下:AES-CBCmodehassomeknownsecuritySSL或TLS中的漏洞,如BEAST攻击、Lucky13攻击等。虽然TLS1.1和TLS1.2不受BEAST攻击影响,但Lucky13(影响TLS1.1/1.2)攻击也已修复在Openssl等知名加密算法库中,这些漏洞都暴露了SSL中的CBC模式。/TLS协议实现时容易引入安全漏洞,HTTP/2也明确实现了CBCmodeciphersuite被列入黑名单是.NET5TLS1.2中的默认行为,但是第三方法规禁止使用AES-CBC即使扫描的套件强度为A,并且在上面的配置中给出了支持的安全套件通过路径中读取文件和使用密码的重载方法启用HTTPS,publicstaticListenOptionsUseHttps(thisListenOptionslistenOptions,stringfileName,stringpassword,ActionconfigureOptions);最后,您可以配置连接。在这个类中,有如下属性publicActionOnAuthenticate{get;set;}在输入的第二个类参数中,有对套件的配置,如下(我也是结合github找了很久timetofindit)所以最后我们配置支持的安全套件如下(很多套件,闻所未闻,不用担心,下面会总结):webBuilder.ConfigureKestrel(serverOptions=>{serverOptions.Listen(IPAddress.Any,8000,listenOptions=>{listenOptions.UseHttps("ssl.pfx","123456",adapterOptions=>{adapterOptions.SslProtocols=SslProtocols.Tls12;adapterOptions.OnAuthenticate=(connectionContext,authenticationOptions)=>{varciphers=newList(){TlsCipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TlsCipherDHE._WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_PSK_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_PSK_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TlsCipherSuite.TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256,TlsCipherSuite.TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256,TlsCipherSuite.TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384,TlsCipherSuite.TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256,TlsCipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM,TlsCipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM,TlsCipherSuite.TLS_DHE_RSA_WITH_AES_128_CCM_8,TlsCipherSuite.TLS_DHE_RSA_WITH_AES_256_CCM_8,TlsCipherSuite.TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,TlsCipherSuite.TLS_PSK_WITH_AES_128_CCM,TlsCipherSuite.TLS_PSK_WITH_AES_256_CCM,TlsCipherSuite.TLS_DHE_PSK_WITH_AES_128_CCM,TlsCipherSuite.TLS_DHE_PSK_WITH_AES_256_CCM,TlsCipherSuite.TLS_PSK_WITH_AES_128_CCM_8,TlsCipherSuite.TLS_PSK_WITH_AES_256_CCM_8,TlsCipherSuite.TLS_PSK_DHE_WITH_AES_128_CCM_8,TlsCipherSuite.TLS_PSK_DHE_WITH_AES_256_CCM_8,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,TlsCipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256};authenticationOptions.EnabledSslProtocols=SslProtocols.Tls12;authenticationOptions.CipherSuitesPolicy=newCipherSuitesPolicy(ciphers);};});});});咳咳,到这里为止,我们满心欢喜,是不是就这样美好的结局?当你接触到一个新的观点时,你必须先阅读解释。不要让饭后难以操作。费时费力都没有用,终于找到问题的症结所在。这是我最近才深刻体会到的。初步了解应该是.NETCore3.0+开始支持配置OpenSSL套件,版本必须是1.1.1+,但不支持Windows,只支持Linux或OSX!同时,.NETCore3.1以下版本默认协议为1.1或1.2,.NET5默认协议改为1.3,其支持包配置也与OpenSSL配置相关https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0当你接触到某个知识点(比如TLS)的时候,我觉得看看有没有帮助高版本在这方面的改动是必要的。假设我们不知道.NET5+默认更改为1.3。版本升级后,如果第三方连接之前使用的是TLS1.2,会导致数据连接断开,影响业务。只是个人建议,其他的我管不了~~~综上所述,如果是在Windows开发环境下,需要在相应的基础上判断操作系统if(RuntimeInformation.IsOSPlatform(OSPlatform.OSX)||RuntimeInformation.IsOSPlatform(OSPlatform.Linux)){...}最后,我们的扫描结果如下。AES-CBC不安全套件已被移??除,完全满足安全要求。密码学的基本密码套件中使用的算法大致有四种:对称加密算法、非对称密钥交换算法、数字签名算法(DSA)、可选的基于散列的消息认证码(HMAC)说白了,一个密码套件就是一个一组启用HTTPS和TLS并结合使用密码的算法我们知道该算法是公开的,唯一的区别是该算法依赖于只有双方知道的密钥,以保护加密后的密文不被窃取窥探一下,那我们就拆分开来解释一下上述算法的非对称加密算法,说白了就是一方有公钥,另一方有私钥。它在TLS握手开始时通过浏览器和服务器之间的协商用作加密套件。至于HTTPS的其余部分,约定通过TLS进行初始握手时使用的三种主要算法是:DHE:Diffie-HellmanEphemeral(密钥交换算法)RSA:以其发明者的名字命名Rivest-Shamir-AdlemanECDHE:Elliptic-curveDiffie–Hellman(椭圆曲线交换:译)对称算法,说白了,就是双方已知的单一密钥。与非对称加密算法相比,其计算速度更快,但不适合用作Web证书,因为浏览器和服务器根本不认识也不信任对方,无法共享秘钥.但是,在初始握手协议之后,使用对称加密算法创建用于HTTPS通信的共享密钥是非常合适的。其他时期使用的四种最常见的对称加密算法是:AES:高级加密标准AES-GCM:AESGalois/CounterAES-CCM:AESCounterwithCBC-MAC(密码块链接消息认证码)ChaCha20:也称为Salsa20密码强度是一种安全措施,加密文本抵御攻击的安全性如何?算法的强度与密钥的长度有关,因此密钥越长越强度数用位数来表示,常用的值为128和256,对称算法通过其首字母缩写词和密钥长度来标识,例如AES128或AES256。算法的名字,如果脱离本文的内容,真的只能在脑海中留下一点印象,那么我们就结合配置的密码套件进行实际理解。我们就用上面配置的第一个密码套件来解释,其他的都是一样的,如下TlsCipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256上面的TlsCipherSuite是一个枚举,我们只看枚举的内容,去掉TLS剩下的就是DHE_RSA_WITH_AES_128_GCM_SHA256我们结合一下上面介绍的非对称和对称加密算法来拆分它,就是DHE,RSA,AES-128-GCM从最后拆分的结果来看,HTTPS其实是使用了一对算法,而不是单一的算法。其中一种非对称加密DHE和RSA用于初期的TLS握手,另一种对称加密算法AES-128-GCM用于数据传输时的加解密!因此,HTTPS使用对称和非对称加密算法形成了多种组合,但简单地选择一对非对称/对称算法不足以完全识别密码套件,因此还需要指定确保身份验证和完整性的规则。例如,证书由LetsEncrypt证书颁发机构颁发。更深层次的密码学的东西这里就不展开了。我还将探讨在此.NETCore中配置的密码套件是否与OpenSSL支持的密码套件一致。部分截图如下:那么问题来了,我们配置了各种,结果通过工具扫描扫描到了三个支持的套件。当浏览器和服务器第一次进行TLS握手时,我们应该选择哪一个呢?那么我们就可以通过访问和查看Web证书来寻找线索。免责声明:以下部分是我个人的猜测。至于理论上是不是真的,如我所说,不得而知。通过检查证书反扣,我们使用RSA加sha256算法通过OpenSSL创建自签名证书,再看下图就知道结果了使用最终套件,两者结合可以说明对应的OpenSSL配置使用的密码套件是:ECDHE-RSA-AES128-GCM-SHA256,这是nmap工具扫描的三个受支持套件中的第一个ECDHE-RSA-AES128-GCM-SHA256的结论基于上述证书和安全检查。因为是sha256RSA,所以最后一个密码组是SHA256。如果是这样的话,我可以证明吗?如果我们删除SHA256套件,是不是?不支持,网页无法访问?经过上面的修改,通过nmap扫描,结果如下:好像和证书上写的算法没有关系,最后通过自建证书命令返回给我opensslgenrsa-outca-key.key3072只能匹配到使用的RSA非对称加密算法时,OpenSSL可以指定加密方式,但是当我指定aes128或者其他位时,模式实际上是CBC而不是GCM。最后查看是否支持GCMopensslaes-256-gcm。其实OpenSSL是支持GCM的,但是不能用。通过命令行进行操作,具体原因官方有说明。分析了这么多,好像没什么用。目前可以大致确定的是:密码套件的支持还是需要浏览器和服务器端进行握手协商。例如,您可以设置是否在GoogleChrome中启用TLS1.3。至此,我们大致知道了HTTPS使用了一套算法,握手时使用的是非对称加密算法,数据传输时使用的是对称加密算法!然后在整个期间,猜测是结合生成的证书,然后遍历配置套件进行握手,然后进行数据传输的一般握手和数据传输过程,简单描述如下:客户端发送消息到服务器,我在TLS1.2和其他包中使用ECDHE-RSA-AES128-GCM-SHA256,你能处理吗?客户端回复消息,可以通过ECDHE-RSA-AES128-GCM-SHA256处理,然后向客户端发送公钥证书。对密钥证书进行加密,通知服务器以后使用指定的密钥进行数据传输,即共享密钥。在自定义支持的包时,需要格外注意不要同时指定TLS1.2和TLS1.3。