.net2.0用TLS1.2+TCP Stream访问https网站

背景

在用HttpWebRequest访问一个https的网站时,程序在执行到下面这一句代码时会出异常:

HttpWebResponse response = capRequest.GetResponse() as HttpWebResponse

异常信息是: 基础连接已被关闭,发送时出错

这个异常信息与经常碰到的"基础连接被关闭,未能建立TLS/SSL安全通道"不同,况且我的程序里面也加了一直信任证书的回调函数。google上面的答案都是加下一下代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

但是加上之后,异常照旧。继续google查资料,偶尔看到有人说到要把底层安全协议换成tls1.1或者tls1.2版本试试,但是在.net2.0里面没有原生支持tls1.2:

SecurityProtocolType  //这个枚举类型只有ssl和tls,没有tls1.1和tls1.2。

.net4.5里面才支持tls1.1和1.2版本。于是把项目的目标平台切换成.net4.5之后,SecurityProtocolType枚举类型里面果然有tls12的值,并且httpwebrequest也成功的访问到了网站内容。

但是.net4.5不支持xp系统,最低支持vista系统。软件又必须支持xp系统。。。


解决方案

又是一番检索,大方向就是用Tls1.2 Client + TCP来发送请求和接受响应结果。最终找到了BouncyCastle.Crypto这个开源库,他支持.net2.0,并且自己实现了诸多加密算法,其中就包括Tls1.2协议。可是这个开源库没有文档,不知道怎么调用,于是继续检索,终于找到了一个有用的链接:

http://stackoverflow.com/questions/16727862/bouncy-castle-tls-api-usage

2013年的帖子,用的也不是最新版的库,看库的更新日志,是最新版本才支持的tls1.2。结合库的源代码,参考如下帖子

http://stackoverflow.com/questions/18065170/how-do-i-do-tls-with-bouncycastle

最终,调用成功。从开始碰到问题到解决历时一天一夜。

示例代码如下:

// Need class with TlsClient in inheritance chain
        class MyTlsClient : DefaultTlsClient
        {
            public override TlsAuthentication GetAuthentication()
            {
                return new MyTlsAuthentication();
            }
        }

        // Need class to handle certificate auth
        class MyTlsAuthentication : TlsAuthentication
        {
            public TlsCredentials GetClientCredentials(CertificateRequest certificateRequest)
            {
                // return client certificate
                return null;
            }

            public void NotifyServerCertificate(Certificate serverCertificate)
            {
                // validate server certificate
            }
        }
private void StopBtn_Click(object sender, EventArgs e)
        {
            string host = "www.baidu.com";
            int port = 443;
            string request = "GET / HTTP/1.1\r\nHost: " + host + "\r\n\r\n";
            TcpClient tcpClient = new TcpClient(host, port);
            //TlsProtocolHandler protocol = new TlsProtocolHandler(tcpClient.GetStream(), new Org.BouncyCastle.Security.SecureRandom());
            TlsClientProtocol protocol = new TlsClientProtocol(tcpClient.GetStream(), new Org.BouncyCastle.Security.SecureRandom());
            MyTlsClient client = new MyTlsClient();
            protocol.Connect(client);


            //发送http请求头
            protocol.Stream.Write(Encoding.UTF8.GetBytes(request), 0, request.Length);
            protocol.Stream.Flush();
            //读取返回内容
            MemoryStream ms = new MemoryStream();            
            byte[] buffer = new byte[1024];
            int actual = 0;
            //先保存到内存流MemoryStream中                        
            while ((actual = protocol.Stream.Read(buffer, 0, 1024)) > 0)
            {
                ms.Write(buffer, 0, actual);
            }
            ms.Position = 0;
            byte[] bImageBytes = ms.ToArray();
            string strResult = Encoding.UTF8.GetString(bImageBytes);
        }

BouncyCastle.Crypto的网站是http://www.bouncycastle.org/csharp/

<think>好的,用户现在的问题是关于在.NET MAUI的Android 9+上配置网络安全策略以启用TLS 1.2+。我需要回顾之前的对话,确保回答符合他们的需求。 用户之前询问了如何在.NET MAUI Android中请求HTTP的Web API,我的回答提到了在Android 9+需要配置网络安全策略。现在他们具体问如何配置,特别是启用TLS 1.2+。 首先,我需要确认用户的环境是.NET MAUI,所以解决方案需要适用于MAUI项目。Android 9(API 28)及以上默认启用了TLS 1.2,但可能需要显式配置网络安全策略,尤其是当应用目标API级别较高时,或者需要允许明文通信(HTTP)。 接下来,用户可能需要允许明文流量,因为如果他们的API使用HTTP而不是HTTPS,Android默认会阻止。因此,配置网络安全策略包括两个部分:启用TLS 1.2和允许明文流量。 我应该分步骤说明如何创建网络安全配置文件,包括在AndroidManifest.xml中设置networkSecurityConfig。需要指出如何指定TLS版本和使用cleartextTraffic permitted,同时建议生产环境禁用明文。 此外,可能还需要在MAUI项目中配置HttpClient以使用正确的TLS版本,比如使用NativeMessageHandler。可能还需要注意Android选项中的目标框架版本是否支持TLS 1.2。 用户可能遇到的问题包括配置后仍然无法连接,需要检查配置文件是否正确,或者是否需要更新NuGet包如ModernHttpClient来支持。 需要提醒用户,虽然配置允许HTTP,但生产环境中应使用HTTPS,确保安全。 最后,生成相关问题,帮助用户深入理解,比如如何强制使用HTTPS,调试TLS问题,或处理不同Android版本的兼容性。</think>#### .NET MAUI Android 9+ 网络安全策略配置指南 --- ### 一、配置网络安全策略(强制启用 TLS 1.2+) #### 1. **创建网络安全配置文件** 在 `Platforms/Android/Resources/xml` 目录下新建 `network_security_config.xml`: ```xml <?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true"> <trust-anchors> <certificates src="system" /> </trust-anchors> <!-- 强制使用 TLS 1.2+ --> <config> <tls> <supported-protocols>TLSv1.2</supported-protocols> <supported-protocols>TLSv1.3</supported-protocols> </tls> </config> </base-config> </network-security-config> ``` #### 2. **应用配置到 Android 清单** 修改 `Platforms/Android/AndroidManifest.xml`: ```xml <application android:networkSecurityConfig="@xml/network_security_config" ... > </application> ``` #### 3. **设置目标框架(可选)** 在 `.csproj` 中确保最低 Android 版本兼容性: ```xml <PropertyGroup> <TargetFramework>net8.0-android</TargetFramework> <SupportedOSPlatformVersion>21</SupportedOSPlatformVersion> </PropertyGroup> ``` --- ### 二、代码层适配 #### 1. **强制 HttpClient 使用 TLS 1.2** ```csharp var handler = new Xamarin.Android.Net.AndroidMessageHandler(); handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 | System.Security.Authentication.SslProtocols.Tls13; HttpClient _httpClient = new HttpClient(handler); ``` #### 2. **明文通信警告处理** 若需允许 HTTP(非 HTTPS)请求,需在 `network_security_config.xml` 中添加: ```xml <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">api.example.com</domain> </domain-config> ``` --- ### 三、验证配置有效性 #### 1. **检测 TLS 版本** 使用在线工具 [SSL Labs API Test](https://www.ssllabs.com/ssltest/) 验证 API 服务端的 TLS 支持情况 #### 2. **本地调试命令** 通过 ADB 查看网络请求日志: ```bash adb logcat | grep -i "tls" ``` --- ### 四、常见问题解决 | 问题现象 | 解决方案 | |---------|----------| | `ERR_CLEARTEXT_NOT_PERMITTED` | 检查 `cleartextTrafficPermitted` 配置 | | `Handshake failed` | 更新 `Xamarin.Android` 至最新版本 | | 低版本 TLS 警告 | 强制指定 `handler.SslProtocols` | --- ### 五、注意事项 1. **生产环境安全要求** 允许明文通信(HTTP)仅限调试使用,正式发布时应移除 `cleartextTrafficPermitted="true"`[^1] 2. **服务器兼容性** 确保 Web API 服务器已启用 TLS 1.2+ 支持(可通过 OpenSSL 命令验证): ```bash openssl s_client -connect api.example.com:443 -tls1_2 ``` ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值