C#Netcore支持Https

1.安装OpenSSL

下载地址:https://slproweb.com/products/Win32OpenSSL.html

完成安装

2.配置环境变量

右键我的电脑,进入属性界面

新建环境变量OPENSSL_HOME

在Path中新增%OPENSSL_HOME%\bin

重启电脑,使环境变量生效

3.生成证书

打开终端界面,输入以下命令

openssl genrsa -out private_key.pem 2048
openssl req -new -key private_key.pem -out certificate_request.csr
openssl x509 -req -days 365 -in certificate_request.csr -signkey private_key.pem -out certificate.crt

可以在D盘根目录找到生成的证书文件

4.配置appsetting.json

{
  "Kestrel": {
  "Endpoints": {
    "Http": {
      "Url": "http://*:8081"
    },
    "Https": {
      "Url": "https://*:8080",
      "Certificate": {
        "Path": "D:/Certificate/certificate.crt",
        "KeyPath": "D:/Certificate/private_key.pem"
      }
    }
  }
},
}

这样配置可以同时支持http和https

5.IIS配置

6.试运行

参考文档:

https://blog.youkuaiyun.com/weixin_44339850/article/details/139768045

<think>我们正在讨论如何在C#中实现使用HTTPS请求时指定源IP地址。在C#中,我们可以使用HttpClient类来发送HTTP/HTTPS请求,但是HttpClient本身并不直接支持指定源IP地址。为了实现这个需求,我们需要自定义一个HttpMessageHandler,并在其中指定本地IP地址。具体步骤:1.创建一个自定义的HttpMessageHandler,重写SendAsync方法。2.在SendAsync方法中,我们可以访问底层SocketsHttpHandler(在.NETCore中)或者ServicePoint(在.NETFramework中)来设置本地绑定的IP地址。3.在.NETCore中,我们可以使用SocketsHttpHandler.ConnectCallback属性来指定连接逻辑,并在其中绑定本地IP地址。下面是一个示例代码,该代码使用.NETCore3.0及以上版本(因为SocketsHttpHandler从.NETCore2.1开始可用,但ConnectCallback是在.NETCore3.0引入的):</think> 在 C# 中实现 HTTPS 请求时指定源 IP 地址,可以通过 `HttpClient` 绑定本地网络接口来实现。以下是完整解决方案: ### 解决方案代码 ```csharp using System; using System.Net; using System.Net.Http; using System.Net.Sockets; using System.Threading.Tasks; class Program { static async Task Main() { // 目标域名和本地源IP地址 string targetUrl = "https://example.com"; string sourceIp = "192.168.1.100"; // 替换为你的源IP // 创建绑定到指定IP的Socket var localEndPoint = new IPEndPoint(IPAddress.Parse(sourceIp), 0); using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); socket.Bind(localEndPoint); // 配置HTTP处理程序 var handler = new SocketsHttpHandler(); handler.ConnectCallback = async (context, cancellationToken) => { // 使用已绑定的Socket连接目标服务器 await socket.ConnectAsync(context.DnsEndPoint, cancellationToken); return new NetworkStream(socket, ownsSocket: true); }; // 发送HTTPS请求 using var client = new HttpClient(handler); client.DefaultRequestHeaders.Add("User-Agent", "SourceIP-Specified-Client"); try { var response = await client.GetAsync(targetUrl); Console.WriteLine($"状态码: {response.StatusCode}\n内容长度: {response.Content.Headers.ContentLength}"); } catch (Exception ex) { Console.WriteLine($"请求失败: {ex.Message}"); } } } ``` ### 关键步骤说明 1. **Socket绑定**: ```csharp var localEndPoint = new IPEndPoint(IPAddress.Parse(sourceIp), 0); socket.Bind(localEndPoint); ``` 通过 `Socket.Bind()` 强制将网络连接绑定到指定源 IP 2. **自定义连接回调**: ```csharp handler.ConnectCallback = async (context, cancellationToken) => { await socket.ConnectAsync(...); return new NetworkStream(socket, ownsSocket: true); }; ``` 在 `SocketsHttpHandler` 中实现自定义连接逻辑,使用预先绑定的 Socket 3. **HTTPS证书验证**: 系统自动处理 TLS/SSL 握手,需要确保: - 服务器证书合法有效 - 本地计算机信任证书颁发机构 - 支持 SNI(现代 HTTPS 的必要特性) ### 使用注意事项 1. **IP 地址要求**: - 必须是本机有效 IP 地址 - 不能是其他设备的 IP(会引发 `SocketException`) - 推荐使用 `IPAddress.Any` 让系统自动选择 2. **服务器端验证**: ```csharp // 如果需要允许自签名证书 handler.SslOptions.RemoteCertificateValidationCallback = (sender, cert, chain, errors) => true; // 生产环境请勿使用 ``` 3. **端口管理**: - `IPEndPoint` 中的端口 0 表示由系统自动分配 - 避免使用固定端口(防止冲突) ### 防火墙配置 如果连接失败,请确保: 1. 防火墙允许指定 IP 的出站连接 2. 本地网络接口已启用该 IP 3. 服务器未封锁源 IP(可在服务器端验证 `HttpContext.Connection.RemoteIpAddress`)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值