• .NetCore+OpenSSL实现Https


    前言

    最近,有时间研究了一下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安全通信。

  • 相关阅读:
    计划任务
    swap
    fdisk
    raid 搭建
    Http协议中Cookie详细介绍
    linux系统日志以及分析
    搞清楚php-FPM到底是什么?
    Amoeba+Mysql实现数据库读写分离
    Last_SQL_Error: Error 'Can't drop database 'ABC'; database doesn't exist' on query. Default database: 'ABC'. Query: 'drop database ABC'
    MySQL主从失败, 错误Got fatal error 1236解决方法
  • 原文地址:https://www.cnblogs.com/chenxf1117/p/15119692.html
Copyright © 2020-2023  润新知