为ASP.NetCore程序启用SSL
紧接着上一篇搭建连接MySql的三层架构的ASP.NetCore2.0的WebApi的案例,这篇来实现为ASP.NetCore启用SSL支持
由于ASP.NetCore默认服务器Kestrel不像iis Express那样会自动生成本地证书,所以就需要手动构建pfx证书.
生成pfx证书
开发环境证书就用iis默认的本地证书即可,Cortana搜索:IIS,出现以下结果点击

进入管理器:点击服务器证书选项

选中以下本地默认证书后右键导出,指定路径和密码点击确认.
修改Program中BuildWebHost以增加SSL支持
第一种方案:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Net; namespace ASP.Net_Core_API
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>//设置Kestrel服务器
{
options.Listen(IPAddress.Loopback, , listenOptions =>
{
//填入之前iis中生成的pfx文件路径和指定的密码
listenOptions.UseHttps("D:\\DotNetCore\\ASP.Net Core API\\wwwroot\\dontCore.pfx", "");
});
})
.Build();
}
}
此种方案无需更改其他代码即可生效,点击运行

可看到已监听指定的端口5001,浏览器输入https://127.0.0.1:5001/api/values,可看到已启用ssl

第二种方案:同时支持http和https请求(基于appsettings.json配置)
由于上一种方案只支持https请求,但实际生产也需要http请求
实现核心代码:
Program:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System.Net; namespace ASP.Net_Core_API
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(SetHost)//启用Kestrel
.Build(); /// <summary>
/// 配置Kestrel
/// </summary>
/// <param name="options"></param>
private static void SetHost(Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions options)
{
var configuration = (IConfiguration)options.ApplicationServices.GetService(typeof(IConfiguration));
var host = configuration.GetSection("RafHost").Get<Host>();//依据Host类反序列化appsettings.json中指定节点
foreach (var endpointKvp in host.Endpoints)
{
var endpointName = endpointKvp.Key;
var endpoint = endpointKvp.Value;//获取appsettings.json的相关配置信息
if (!endpoint.IsEnabled)
{
continue;
} var address = IPAddress.Parse(endpoint.Address);
options.Listen(address, endpoint.Port, opt =>
{
if (endpoint.Certificate != null)//证书不为空使用UserHttps
{
switch (endpoint.Certificate.Source)
{
case "File":
opt.UseHttps(endpoint.Certificate.Path, endpoint.Certificate.Password);
break;
default:
throw new NotImplementedException($"文件 {endpoint.Certificate.Source}还没有实现");
} //opt.UseConnectionLogging();
}
}); options.UseSystemd();
}
}
} /// <summary>
/// 待反序列化节点
/// </summary>
public class Host
{
/// <summary>
/// appsettings.json字典
/// </summary>
public Dictionary<string, Endpoint> Endpoints { get; set; }
} /// <summary>
/// 终结点
/// </summary>
public class Endpoint
{
/// <summary>
/// 是否启用
/// </summary>
public bool IsEnabled { get; set; } /// <summary>
/// ip地址
/// </summary>
public string Address { get; set; } /// <summary>
/// 端口号
/// </summary>
public int Port { get; set; } /// <summary>
/// 证书
/// </summary>
public Certificate Certificate { get; set; }
} /// <summary>
/// 证书类
/// </summary>
public class Certificate
{
/// <summary>
/// 源
/// </summary>
public string Source { get; set; } /// <summary>
/// 证书路径()
/// </summary>
public string Path { get; set; } /// <summary>
/// 证书密钥
/// </summary>
public string Password { get; set; }
}
}
appsettings.json
{
"ConnectionStrings": {
"MySqlConnection": "Server=localhost;database=NetCore_WebAPI-Mysql;uid=root;pwd=111111;"
},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Default": "Warning"
}
}
},
//以下为Kestrel配置信息,同时支持https和HTTP
"RafHost": {
"Endpoints": {
"Http": {
"IsEnabled": true,
"Address": "127.0.0.1",
"Port": ""
},
"Https": {
"IsEnabled": true,
"Address": "127.0.0.1",
"Port": "",
"Certificate": {
"Source": "File",
"Path": "wwwroot\\dontCore.pfx",
"Password": ""
}
}
}
}
}
点击运行会发现控制台出现监听两个端口的提示,一个支持https一个支持http
浏览器输入http://127.0.0.1:5000/api/values

http请求运行正常
再输入https://127.0.0.1:5443/api/values

https运行正常
专案下载链接:Demo
为ASP.NetCore程序启用SSL的更多相关文章
- .NET CORE学习笔记系列(4)——ASP.NET CORE 程序启用SSL
一.什么是SSL? 1.概念: SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 3. Nginx配置反向代理 3.1 cnetos 安装nginx 首先,我们需要在服务器上安装N ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一)
环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输: xftp 1.在本地创建asp.net core应用发布 1.1 使用Vs2017 新建 ...
- 使用PowerShell自动部署ASP.NetCore程序到IIS
Windows PowerShell 是一种命令行外壳程序和脚本环境,使命令行用户和脚本编写者可以利用 .NET Framework的强大功能.有关于更多PowerShell的信息,可参阅百度词条 接 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践
原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输 ...
- Dotnetcore或owin程序启用SSL的方法
https端口需要绑定SSL证书 操作方法与步骤如下: 在IIS中创建证书 查看证书的指纹 使用命令行绑定端口与证书 上述第三步也可以更换为创建一个新的空网站,绑定https端口为相同端口并绑定证书, ...
- Asp.NetCore轻松学-部署到 IIS 进行托管
前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...
- 目录---Asp.NETCore轻松学系列【目录】
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
- 【目录】Asp.NETCore轻松学系列
随笔分类 - Asp.NETCore轻松学系列 Asp.NETCore轻松学系列阅读指引目录 摘要: 耗时两个多月,坚持写这个入门系列文章,就是想给后来者更好更快的上手体验,这个系列可以说是从入门到进 ...
随机推荐
- 第二章 R语言数据结构
R语言存储数据的结构包括:标量.向量.矩阵.数组.数据框和列表:可以处理的数据类型包括:数值型.字符型.逻辑型.复数型和原生型. 数据结构 向量 向量是用来存储数值型.字符型或逻辑型数据的一维数组.单 ...
- 在Linux 环境下搭建 JDK 和 Tomcat
在Linux 环境下搭建 JDK 和 Tomcat 参考地址:http://www.cnblogs.com/liulinghua90/p/4661424.html [JDK安装] 1.首先下载 ...
- 数据结构之B进制(确定进制)
#include <cstdio> int max_num(int n) { int max=0; while(n) { int k=n%10; if(k>max) max=k; n ...
- .net core 2.0 登陆权限验证
首先在Startup的ConfigureServices方法添加一段权限代码 services.AddAuthentication(x=> { x.DefaultAuthenticateSche ...
- hdu2222 Keywords Search(AC自动机初步)
题目大意: 给出多个模式串和一个主串,求多少个模式串在主串中出现过. 传送门 这是一道AC自动机的模板题. 在学习AC自动机之前,首先要学习WA自动机.TLE自动机和MLE自动机(雾 AC自动机是一种 ...
- 用PyCharm执行测试成功但无法生成HTMLTestRunner报告
问题:代码写的没问题,执行也成功了,但就是无法生成HTMLTestRunner的报告 其实这是编辑器搞得鬼,编辑器为了方便用户执行测试,都有一项功能,可以用编辑器来调用unittest或者nose来执 ...
- SpringMVC知识点小结
SpringMVC: 1.SpringMVC和Spring的关系: 软件开发的三层架构: web层[表示层.表现层]---->Service层---->Dao[DataBase Acces ...
- C++内存布局详解
一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...
- 交换机端口呈现err-disable的原因
导致交换机端口呈现err-disable状态的原因有很多,为方便大家查询,特归纳如下: 1. duplex mismatch (A is correct) 2. port-channel misc ...
- 【Socket编程】Java通信是这样炼成的
简介 网络无处不在,移动互联时代也早已到来,单机版程序慢慢的已没有生命力,所有的程序都要能够访问网络,比如 QQ 网络聊天程序.迅雷下载程序等,这些程序都要同网络打交道,本次将与各位小伙伴们分享的就是 ...