HTTPS SSL证书
在使用Visual Studio .Net(Core)进行Web开发时,当前第一调试Web程序时会为Visual Studio中的Web项调试所使用的IIS Express提供1个全局性的证书(SSL)认证,在同1台主机中以后的Web开发中该认证会通过该证书(SSL)通过该主机所构建的Web程序提供SSL认证
使用IIS Express提供的默认全局性(SSL)证书进行认证。
在Web程序开发阶段,如果Web需要使用SSL证书提供认证支持,最为简单的方法是在创建Web程序时勾选“配置HTTPS(H)”复选框:
注意:如果在创建Web程序时没有勾选“配置HTTPS(H)”复选框,在开中又想使用IIS Express提供的默认全局性(SSL)证书对当进Web程序提供认证服务,则必须显式定义HTTPS与HTTP的映射关系:
实际上由于当前的主流浏览器默认的安全等级比较高,如果Web程序没有勾选“配置HTTPS(H)”复选框,在调试时会由于安全性,而造成浏览器对页面不能进行显示。
使用自定义(SSL)证书进行认证。
- 首先通过openssl(Win64OpenSSL-3_0_4.exe)软件生成1个第3方的SSL证书文件:“dotnetty.pfx”。
- 复制该文件到Web项的“wwwroot”文件夹中。
3、appsettings.json”文件中进行以下定义:
"IsHttps": true,
"CertName": "dotnetty.pfx",
"CertPwd": "yangyiquan",
"ServerIP": "localhost",
"ServerPort": 7031,
注意:端口号必与上图中HPPTS中的端口号相同。
4、对.Net(Core)框架定义以下设定,通过第3方的SSL证书让浏览器为当前Web程序中的页面提供安全认证服务:
var builder = WebApplication.CreateBuilder(args);
//由于上方代码使用第3方SSL证书提供认证服务,由于安全性从而造成浏览器对页面不能进行显示,如果想要页面正常显示则必须要把下面的代码全部注释掉。
string _serverIP = builder.Configuration.GetSection("ServerIP").Get<string>();
int _serverPort = builder.Configuration.GetSection("ServerPort").Get<int>();
bool _isHttps = builder.Configuration.GetSection("IsHttps").Get<bool>();
string _pfxPath = Path.Combine(builder.Environment.WebRootPath, builder.Configuration.GetSection("CertName").Get<string>());
string _certPwd = builder.Configuration.GetSection("CertPwd").Get<string>();
builder.WebHost
.UseUrls($"https://{_serverIP}:{_serverPort}")
.ConfigureKestrel(option =>
{
option.ConfigureHttpsDefaults(option =>
{
option.ServerCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(_pfxPath, _certPwd);//证书路径、密码
});
});
5、最终效果:
部署与SSL证书
以上的所有操作都是基于开发和调试环境上进行的,如果基于部署环境最好购买1个付费的SSL证书,这些安全相关的数字产品,最好在部署的整个生命周期中不要使用免费的,有1句话:“免费的才是最贵的。”,付费的另1个原因是买安心和保险,即使出现安全问题也可以找到索赔方。
Data Protection(数据安全)
.Net(core框架)通过Data Protection(数据安全)相关方法实现加解密操作,一般情况上会通过内置依赖注入方法AddDataProtection(),注入到内置容器中,注意:在.Net6中即使不显式定义依赖注入方法IDataProtectionProvider provider参数在拷贝构造方法中依然会被实例化而不会出现逻辑异常。
最简单的数据安全依赖注入方法的显式定义为:builder.Services.AddDataProtection();该依赖注入方法会在每次启动程序时都会在服务器端的内存中自动生成1个临时的(私有)密钥。IDataProtector实例会根据该临时的(私有)密钥,调用Protect或Unprotect执行加解密操作,但这种方式会由于(私有)密钥的改变,从而导致之前加密的密文解密失败,导致用户退出登录等问题。可以将(私有)密钥持久化保存到磁盘(单体应用)、redis、mysql等。例如:
//把Data Protection(数据安全)(私有)密钥,持久化保存到服务器端指定的文件中,这里特指“\wwwroot\DataProtectionKeys\*.xml”文件(持久(私有)密钥默认日期为90天)。
//注意:如果(私有)密钥不持久化,每次启动都会生成临时(私有)密钥,之前加密的密文解密失败,导致用户退出登录等问题。
//可以将(私有)密钥持久化保存到磁盘(单体应用)、redis、mysql等。
string keysPath = Path.Combine(builder.Environment.WebRootPath, "DataProtectionKeys");
builder.Services.AddDataProtection()//每次启动都会生成临时(私有)密钥。
.PersistKeysToFileSystem(new DirectoryInfo(keysPath));//把临时(私有)密钥,持久化保存到服务器端指定的文件中,这里特指“\wwwroot\DataProtectionKeys\*.xml”文件。
上述方式,会在(默认)90天内使用指定持久化文件中的(私有)密钥对之前加密的密文进行解密,当然也可以对临时(私有)密钥的持久化保存时间进行自定义设定例如:
//把Data Protection(数据安全)(私有)密钥,持久化保存到服务器端指定的文件中,这里特指“\wwwroot\DataProtectionKeys\*.xml”文件(持久(私有)密钥默认日期为90天)。
//注意:如果(私有)密钥不持久化,每次启动都会生成临时(私有)密钥,之前加密的密文解密失败,导致用户退出登录等问题。
//可以将(私有)密钥持久化保存到磁盘(单体应用)、redis、mysql等。
string keysPath = Path.Combine(builder.Environment.WebRootPath, "DataProtectionKeys");
builder.Services.AddDataProtection()//每次启动都会生成临时(私有)密钥。
.PersistKeysToFileSystem(new DirectoryInfo(keysPath))//把临时(私有)密钥,持久化保存到服务器端指定的文件中,这里特指“\wwwroot\DataProtectionKeys\*.xml”文件。
.SetDefaultKeyLifetime(TimeSpan.FromDays(365)); //指定临时(私有)密钥,被持久化保存的时间(365天,默认值:90天)
IDataProtectionProvider provider参数实例,用于获取该加/解密的提供程序或启动项是哪个,这里特指已经注入了内置依赖注入方法AddDataProtection()程序中的Web项。
关于更多Data Protection的设置见:ASP.NET Core-数据保护(Data Protection) - .Neterr - 博客园。
对以上功能更为具体实现和注释见:22-06-25-052_SSLAndDataProtection( HTTPS SSL证书与Data Protection(数据安全))。