Asp.Net Core启用免费SSL证书
浅浅记录一下为Blog申请免费SSL证书的步骤,以备后续需要时查阅。
现如今免费SSL证书的选择蛮多,这里不赘述,我选择的老牌Let's Encrypt,接下来按步骤记录一下在我家里的Windows电脑上申请SSL证书和在Asp.Net Core应用中进行部署的过程细节。ACME客户端选择Let's Encrypt官方推荐的CertBot。
通过CertBot申请免费SSL证书
- 下载安装CertBot客户端(win-amd64安装包),若未在其github最新release中找到windows版本,可从历史版本中找到v2.9.0版本
- 安装完毕后,以管理员身份运行CMD
- 以申请单域名SSL证书为例,通过以下CMD命令执行,泛域名的过程也基本一样(会根据申请的证书内认证的dns条目数配置对应的两条或多条TXT DNS记录)
certbot certonly --manual --preferred-challenges=dns -d knay.net
泛域名如下:
certbot certonly --manual --preferred-challenges=dns -d knay.net -d "*.knay.net"
- 按提示一步一步完成即可,核心关键是域名所有权认证,建议通过DNS认证,根据提示添加一条TXT的DNS记录,稍等DNS生效即可继续(务必等待DNS记录生效后,再回车下一步操作)
TXT DNS记录Dig检查,如:
https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.knay.net.
- 完成后会生成4个证书文件:cert.pem、、chain.pem、privkey.pem 、和fullchain.pem
- 免费证书有效期90天,到期前再重复上述命令生成新的证书文件续期即可
Nginx 配置示例(转发本地docker)
server {
listen 80;
server_name knay.net www.knay.net;
return 301 https://knay.net$request_uri;
}
server {
listen 443 ssl;
server_name knay.net www.knay.net;
# SSL 证书配置
ssl_certificate /certfilespath/fullchain.pem;
ssl_certificate_key /certfilespath/privkey.pem;
# root /www_path;
# index index.html index.htm;
location / {
# index index.html index.htm;
proxy_pass https://localhost:docker_port;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Asp.Net Core中启用SSL证书
以Asp.Net Core+KestrelServer为例。Program.cs中Code如下,因CertBot生成的证书文件为pem,直接配置使用pem文件会运行时出错。因此这里需要进行x509证书格式的转换。
//SSL证书,存储路径请改为你自己的正确路径地址
builder.Services.Configure<KestrelServerOptions>(options =>
{
options.Listen(IPAddress.Any, 80);
options.Listen(IPAddress.Any, 443, listenOptions =>
{
var certFilePath = Path.Combine(AppContext.BaseDirectory, "SOMEDIR", "fullchain.pem");
var keyFilePath = Path.Combine(AppContext.BaseDirectory, "SOMEDIR", "privkey.pem");
var certPem = File.ReadAllText(certFilePath);
var keyPem = File.ReadAllText(keyFilePath);
var x509 = X509Certificate2.CreateFromPem(certPem, keyPem);
listenOptions.UseHttps(x509);
});
});
将http请求强制重定向为https
var app = builder.Build();
app.UseHttpsRedirection();
若有使用http压缩,则打开EnableForHttps启用开关
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
options.MimeTypes = ResponseCompressionDefaults.MimeTypes;
});
builder.Services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Fastest;
});
builder.Services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.SmallestSize;
});
声明: 本站遵循署名-非商业性使用-相同方式共享4.0共享协议. 转载请注明转自 Knay.Net ™