前言

最近,有时间研究了一下HTTPS安全通信的原理,感兴趣的同学可以看下上一篇博文深入理解Https如何保证通信安全 ,随即联想到近段时间开发的.NetCore项目,.NetCore API应用程序是默认支持HTTP(5000端口)和HTTPS(5001端口)的,但由于项目都是在内网中使用,所以走的都是HTTP,忽略了HTTPS的实战应用,所以本着“厚积薄发”的原则,和大家分享下实操经验。

OpenSSL自签名证书

HTTPS安全通信需要“数字证书”,.NetCore中支持X.509格式标准的安全证书,所以我们先要搞一个X509自签名证书(正规的网站需要向CA机构申请证书),这里推荐大家用OpenSSL工具生成证书。

Windows版本下载地址: http://slproweb.com/products/Win32OpenSSL.html ,如果只是自测使用,下载简化版Light的exe格式的直接安装就行。

CMD窗口启动OpenSSL:

第一步:生成私钥文件.key

genrsa -out test.key 2048

2048:表示私钥文件字节大小

第二步:生成cer格式证书(适用windows系统)

req -new -x509 -key test.key -out test.cer -days 3650

-509:表示生成x509证书而不是生成证书请求文件csr

-key:指定私钥文件,与生成的cer(实际就是包含公钥)形成密钥对

-days 3650:设置证书有效期,以天为单位

后续会要求输入证书的相关信息:

其中Common Name一定要注意:要设置你的网站的域名(如果是本地环境,可以自定义一个域名,修改系统Host文件,将127.0.0.1指向自定义域名,如:www.samples.com)

第三步:生成.pfx证书(包含私钥和公钥),.NetCore项目中使用

pkcs12 -export -out test.pfx -inkey test.key -in test.cer

然后按照提示设置证书密码:

完成以上步骤后,我们就可以在根目录得到三份文件

然后,你只要在本地安装.cer证书就可以安全访问自签名的HTTPS网站了。

.NetCore API项目开启HTTPS

为Kestrel服务器开启Https端口监听,并使用X509格式证书验证。

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(builder =>
{
builder.UseKestrel(options =>
{
//设置监听端口
var configure = options.ApplicationServices.GetRequiredService<IConfiguration>();
var port = configure.GetValue<int>("Http:Port");
options.ListenAnyIP(port);
//监听https端口
var httpsPort = configure.GetValue<int>("Https:Port");
options.ListenAnyIP(httpsPort, config =>
{
var certPath = configure.GetValue<string>("Cert:path");
var certPwd = configure.GetValue<string>("Cert:pwd");
var x509ca = new X509Certificate2(certPath, certPwd);
//config.UseHttps(certPath, certPwd);
config.UseHttps(x509ca);
});
});
builder.UseStartup<Startup>();
});

证书路径和证书密码我这里是通过配置文件配置的,证书密码就是上面我们生成.pfx文件时输入的Export PassWord。

打开IE浏览器访问https,正常访问且锁标志安全显示

至此,自签名证书已实现HTTPS安全通信。

但是奇怪的问题来了,Chrome浏览器却依旧不支持,Chrome打开后提示没有指定主题名称:

关于这个问题我也是在网上找了几个版本的解决方案,大多数都是说修改openssl配置文件openssl.cnf,且多是在Linux环境下的操作,对于我们这个windows简化版本的OpenSSL来说确定无效。

于是根据网上的一些其他思路,自己摸索出了下面的方式:

第一步:同样生成私钥文件.key

genrsa -out test1.key 2048

第二步:生成csr证书签名请求文件

该文件实际是用来向CA机构申请证书的,由于我们是自签名,所以接下来我们用这个文件生成.cer证书

req -new -key test1.key -out test1.csr
csr文件要求输入以下证书信息:

同样,这里需要注意Common Name域名配置

第三步:生成.Cer证书

x509 -req -days 365 -in test1.csr -signkey test1.key -out test1.cer -extfile http.ext

这里注意: -extfile http.ext ,根目录下新增http.ext文件,并填写以下内容:

keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
DNS.1=www.samples.com

DNS.1=www.samples.com 这里实际上就是指定主题备用名称,和证书文件中的Common Name域名保持一致。

完了之后,我们可以看下证书信息:

x509  -in test1.cer -text -noout

我们发现http.ext文件中的信息已成功加入证书信息中。

第四步:同样,生成.pfx证书(包含私钥和公钥)

pkcs12 -export -out test1.pfx -inkey test1.key -in test1.cer

然后打开Chrome浏览器,访问正常且安全

本文向大家介绍了windows环境下使用OpenSSL生成自签名证书的操作步骤,模拟了HTTPS的数字证书,以及解决Chrome浏览器证书不可信问题的解决方案,并结合.NetCore项目实现了HTTPS安全通信。

.NetCore+OpenSSL实现Https的更多相关文章

  1. 基于OpenSSL的HTTPS通信C++实现

      HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.Nebula是一个为开发者提供一个快速开发 ...

  2. openssl生成https证书

    openssl生成https证书 分类: 其它2009-09-03 16:20 452人阅读 评论(0) 收藏 举报 includemoduleaccessapachessl服务器 openssl生成 ...

  3. 基于openssl搭建https服务器

    1. 搭建web环境 我这里使用源码编译安装方式安装httpd.详情可以参加我的一篇博客http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_1 ...

  4. Nginx详解二十一:Nginx深度学习篇之配置苹果要求的openssl后台HTTPS服务

    配置苹果要求的证书: 1.服务器所有的连接使用TLS1.2以上的版本(openssl 1.0.2) 2.HTTPS证书必须使用SHA256以上哈希算法签名 3.HTTPS证书必须使用RSA2048位或 ...

  5. OPENSSL 生成https 客户端证书

    下面说下拿服务器证书.(前提是服务器是https,客户端认证用的时候),服务端不给的时候,我们自己去拿(不给怼他!,哈哈,开个玩笑,都会给的) openssl s_client -connect 域名 ...

  6. 基于openssl的https服务配置

    环境: CA服务器:192.168.1.121 WEB服务器: 192.168.1.107 一.在CA服务器上生成自签证书 1.生成根私钥 (umask 077;openssl genrsa -out ...

  7. OpenSSL和https原理

    https原理: 浏览器请求服务端的公钥证书,server将注冊的证书发送给client. client向办法机构验证证书的合法性,证书 包含公钥,server网址及一些信息. 验证完成,client ...

  8. linux下使用openssl生成https的crt和key证书

    x509证书一般会用到三类文,key,csr,crt Key 是私用密钥openssl格,通常是rsa算法. Csr 是证书请求文件,用于申请证书.在制作csr文件的时,必须使用自己的私钥来签署申,还 ...

  9. LInux基于nginx与OpenSSL实现https访问

    注意!!首先在nginx安装时添加--with-http_ssl_module模块,否则将会报错,只能从头开始了 自建证书: 通过openssl命令(软件包:openssl :openssl-deve ...

随机推荐

  1. layui laydate 设置日期格式 最大值等

    laydate.render({ elem: "#jhsj", format: 'yyyy-MM', type: 'month', //显示月份 year 显示到年 max : & ...

  2. scRNAseq benchmark 学习笔记

    背景 把早年没填完的坑(单细胞测序的细胞类型鉴别)给重新拾起来 其Github描述的基本情况: 作者并不对单个分类器进行说明,统一包装在benchmark工程里,还建立了docker容器 但说明了在s ...

  3. Docker:docker国内镜像加速

    创建或修改 /etc/docker/daemon.json 文件,修改为如下形式 { "registry-mirrors": [ "https://registry.do ...

  4. Java中的自增自减

    情况①: for (int i = 0; i < 100; i++) { j = 1 + j++; } System.out.println(j); 结果是 0 !! 这是由于在进行后自增/自减 ...

  5. bugku本地包含

    重点:eval()函数有执行漏洞 函数本身作用,把字符串当成php代码计算. 所以自然想到,可以把我们的写好的php代码写入进去. 题目又暗示在本地,想到flag.php了,所以想办法把文件里面的内容 ...

  6. XCTF reverse maze

    一.查壳 二.拖入ida64,静态调试,找到主函数F5反编译 二.1 思路分析(逆向是真的费时间,每个函数都要分析过去): 1.发现每个if最终都会进入LABEL-15 点进去,看看这个函数是干啥的. ...

  7. maevn的nexus私库搭建

    使用nexus搭建maven仓库(本地私服) 前言:我们在使用maven的时候,对于项目所依赖的jar包,maven默认会在中央仓库下载jar包,到本地的磁盘目录(如果没有配置则是用户目录下/.m2/ ...

  8. interpration

    On interpreting the effects of repetition interpreting 释意1. If you interpret something in a particul ...

  9. 浅谈C++11中的多线程(三)

    摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...

  10. Windows内核开发-2-开始内核开发-2-内核开发入门

    Windows内核开发-2-开始内核开发-2- 第一个驱动程序: 直接采用vs2019中的Empty WDM Driver 模块创建: 初始的项目文件夹中有一个Driver Files里面会有一个.i ...