博客搬家: https搭建(自签名证书)

上一篇博客探究了https(ssl)的原理,为了贯彻理论落实于实践的宗旨,本文将记录我搭建https的实操流程,使用Apache2+ubuntu+opensssl

1.使用自签证书配置https

一般来讲,正式的上线项目都需要购买域名,并且向权威机构申请证书。但本次工作属于测试环境,所以一切从简,我们使用openssl工具生自签名的CA证书以及服务器证书,来搭建https。具体步骤如下:

(1)安装apache2、openssl(ubuntu16.04)

安装过程此处不做赘述,很简单。Apache2安装完成并启动后,通过http://ipaddress 来测试,如下图所示,说明安装成功

(2)制作证书

生成自签CA证书

  • 生成CA私钥
  1. openssl genrsa -out ca.key 2048
  • 生成CA证书
  1. openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config /etc/ssl/openssl.cnf

openssl.cnf的路径注意填对。最后在当前目录下生成的ca.key即为CA私钥,ca.crt即为CA证书(包含CA公钥)

生成服务器证书

  • 生成服务器私钥
  1. openssl genrsa -out server.key 2048
  • 生成服务器签署申请文件
  1. openssl req -new -out server.csr -key server.key -config /etc/ssl/openssl.cnf

需要填写服务器信息,如实填写即可。需要注意Common Name 需要与openssl.cnf 中配置的域名相对应(alt_names),否则客户端无法验证。该命令最后生成的server.csr即为申请文件。openssl.cnf的具体配置见下文。

  • 在签署证书之前需要确认openssl.cnf中的配置,如下所示:
  1. #根据实际情况修改,将match改成optional,否则ca.crt必须与server.csr中的各个字段值一致才能签署
  2. [ policy_match ]
  3. countryName = optional
  4. stateOrProvinceName = optional
  5. organizationName = optional
  6. organizationalUnitName = optional
  7. commonName = supplied
  8. emailAddress = optional
  9. # 确保req下存在以下2行(默认第一行是有的,第2行被注释了)
  10. [ req ]
  11. distinguished_name = req_distinguished_name
  12. req_extensions = v3_req
  13. # 确保req_distinguished_name下没有 0.xxx 的标签,有的话把0.xxx的0. 去掉
  14. [ req_distinguished_name ]
  15. countryName = Country Name (2 letter code)
  16. countryName_default = XX
  17. countryName_min = 2
  18. countryName_max = 2
  19. stateOrProvinceName = State or Province Name (full name)
  20. localityName = Locality Name (eg, city)
  21. localityName_default = Default City
  22. organizationName = Organization Name (eg, company)
  23. organizationName_default = Default Company Ltd
  24. organizationalUnitName = Organizational Unit Name (eg, section)
  25. commonName = Common Name (eg, your name or your server\'s hostname)
  26. commonName_max = 64
  27. emailAddress = Email Address
  28. emailAddress_max = 64
  29. #添加一行subjectAltName=@alt_names
  30. [ v3_req ]
  31. # Extensions to add to a certificate request
  32. basicConstraints = CA:FALSE
  33. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  34. subjectAltName=@alt_names
  35. #新增alt_names,注意括号前后的空格,DNS.x 的数量可以自己加
  36. #如果没有IP这一项,浏览器使用IP访问时验证无法通过
  37. [ alt_names ]
  38. IP.1 = 192.168.50.115
  39. DNS.1 = dfe.leida.org
  40. DNS.2 = ex.abcexpale.net
  • 使用CA证书和私钥签署服务器证书
  1. openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -extensions v3_req -config /etc/ssl/openssl.cnf

直接运行该签署命令,会报错,提示缺少某些文件和目录。在当前目录下把相应的文件及文件夹创建上即可解决,如下

  1. mkdir -p demoCA/newcerts
  2. touch ./demoCA/index.txt ./demoCA/serial
  3. echo "01">> ./demoCA/serial

创建完毕后,运行签署命令即可完成服务器证书的制作。当前目录下生成的server.crt即为服务器证书,server.key为服务器私钥

(3)配置apache2

  • 启用ssl模块(此处可使用a2enmod命令)
  1. a2enmod ssl
  • 启用ssl站点
  1. a2ensite default-ssl
  • 加入监听端口443(因为https默认采用443端口,有别于http的80)
  1. listen 80 443
  2. # /etc/apache2/ports.conf中修改成如上所示即可
  • 配置证书以及私钥的路径
  1. SSLCertificateFile /etc/ssl/certs/server.crt
  2. SSLCertificateKeyFile /etc/ssl/private/server.key
  3. # 在/etc/apache2/sites-available/default-ssl.conf中修改如上参数,确认证书和私钥的路径正确无误

重启apache2,搞定!

2.使用浏览器测试https

上述的制作证书步骤,已经是我测试结束、爬完坑后的正确教程,下文则是填坑记录。

实际上,我一开始按照网上的方法搭建完https后,出现过一些问题。使用浏览器访问https://ipaddress 会跳出如下提示界面



实际上此时浏览器已获取到服务器证书server.crt,只是由于某些原因无法验证它。若选择高级选项中的“继续浏览”时,同样可以正常跳转至对应的页面,这时相当于强行让浏览器接受该证书,同时接受服务器公钥。在测试环境下,这样完全OK。但是,强迫症的我还是想让导航栏上出现安全的小锁,红叉叉看着很难受啊。

下面总结记录一下使用浏览器(chrome)测试的过程中遇到的问题以及解决方法

(1)客户端缺少CA证书

点击导航栏左侧的感叹号,查看证书,如下图所示



此时浏览器已获取到server.crt,由于其对应的CA证书不存在于“受信任的根证书机构”中,所以无法验证server.crt

我们需要将CA证书(上文使用OpenSSL生成的ca.crt)安装至客户端系统中的“受信任的根证书机构”中,保证浏览器可通过此CA证书来验证服务器证书server.crt。安装过程很简单,双击如下所示安装即可



安装结束后,重启浏览器,再次打开证书,如下所示

此时浏览器已经可以使用ca证书来验证server.crt,已完成了很重要的一步,但我的chrome浏览器依然没有出现小锁

(2)缺少使用者备用名称

完成上一步后,浏览器的导航栏依然显示不安全,我打开开发者工具,查看security得知,是服务器证书缺少“使用者备用名称”所导致,如下图所示。



如何解决这个问题,我参考了这个博客(http://blog.51cto.com/colinzhouyj/1566438 ),即修改openssl.cnf的部分配置,前文“制作证书”步骤中已经整合过此处的配置内容。修改完,重新签署证书,重启apache2,再次运行,Subject Alternative Name missing的问题解决。

(3)IP验证不通过

在上一步操作中,我添加完几条DNS之后,发现chrome依然报错,如下图所示



我用的是虚拟机环境,没有域名解析,而是直接通过IP来访问站点的,又由于证书中不存在IP信息,是无法跟URL中的IP进行比对的,因此浏览器无法通过证书验证。该问题有两个解决方法

(1)在证书中添加IP地址。在openssl.cnf中配置使用者可选名称时,添加一条IP地址,即可保证浏览器通过对IP的验证,重新签署配置运行后,结果如下

打开证书,使用者可用名称字段如下

(2)使用域名访问。在客户机的host文件中配置域名与IP的映射,直接使用域名来访问站点(证书中包含域名),即可通过验证,如下所示

使用这两种方法的其中一种,迟迟不肯露面的小锁终于出现了,打开security也是一片绿色,大功告成。但是,要注意一点,不同浏览器对于证书的验证方式可能存在差异。按照我的操作,firefox依然无法验证,暂时没细究,但chrome和edge浏览器都可以完美运行。

https搭建(自签名证书)的更多相关文章

  1. Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用

    到现在,我们已经完成了POS平台和前端的网络集成.不过,还是那句话:平台系统的网络安全是至关重要的.前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚. ...

  2. https本地自签名证书添加到信任证书访问

    1.背景 本文适用于基于https(http+ssl)的网站通信.本地调试等,上线是请寻找免费 ssl证书申请. 本地调试过程中,一些特殊的场景需要我使用http+ssl通信,比如在Chrome中使用 ...

  3. https遇到自签名证书/信任证书

    对于CA机构颁发的证书Okhttp默认支持 可以直接访问 但是对于自定义的证书就不可以了(如:https ://kyfw.12306.cn/otn/), 需要加入Trust 下面分两部分来写,一是信任 ...

  4. 为nginx配置https并自签名证书

    一.把证书准备好. 步骤与使用OpenSSL自签发服务器https证书所述大同小异.在这里再重复一次. 1.制作CA证书: ca.key CA私钥: openssl genrsa -des3 -out ...

  5. nginx 配置https并自签名证书

    2016-10-28 转载请注明出处:http://daodaoliang.com/ 作者: daodaoliang 版本: V1.0.1 邮箱: daodaoliang@yeah.net 参考链接: ...

  6. Java中创建访问HTTPS的自签名证书的方法

    一.问题: 常常在用java访问https的请求时,总是出现SSL禁止的异常.这里给大家教下怎么创建与添加证书. 二.工具 : 1.创建一个目录 2.去Github上搜索InstallCert,然后随 ...

  7. 在nginx环境下搭建基于ssl证书的websocket服务转发,wss

    1.证书准备 本地调试,可以安装自签名证书,安装方法参考https本地自签名证书添加到信任证书访问 2.修改配置文件 将上面的配置文件拷贝到conf目录,添加或者修改节点如下 # HTTPS serv ...

  8. 用OpenSSL生成自签名证书在IIS上搭建Https站点(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  9. OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

随机推荐

  1. 利用自编码(Autoencoder)来提取输入数据的特征

    自编码(Autoencoder)介绍 Autoencoder是一种无监督的学习算法,将输入信息进行压缩,提取出数据中最具代表性的信息.其目的是在保证重要特征不丢失的情况下,降低输入信息的维度,减小神经 ...

  2. 1045 快速排序 (25 分)C语言

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的 N 个互不相同的正整数的排列,请问 ...

  3. Selenium python爬虫

    Selenium + Python3 爬虫 准备工作 Chrome驱动下载地址(可正常访问并下载),根据自己chrome的版本下载 Chrome版本 下载地址 78 https://chromedri ...

  4. Spring MVC系列之模型绑定(SpringBoot)(七)

    前言 上一节我们在SpringBoot中启用了Spring MVC最终输出了HelloWorld,本节我们来讲讲Spring MVC中的模型绑定,这个名称来源于.NET或.NET Core,不知是否恰 ...

  5. 【Spark 内核】 Spark 内核解析-下

    Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spark内核原理,能够帮助我们更 ...

  6. Java操作Jxl实现数据交互。三部曲——《第三篇》

    Java操作Jxl实现上传文本文件实现转PDF格式在线预览. 本文实现背景Web项目:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:S ...

  7. 从数组中取出n个不同的数组成子集 y 使 x = Σy

    /**  * 尝试获取arr子集 y  使 x=Σy  * @param {Array} arr   * @param {number} x   * @param {Array} res   */ f ...

  8. SpringSecurity 初始化流程源码

    SpringSecurity 初始化流程源码 本篇主要讲解 SpringSecurity初始化流程的源码部分,包括核心的 springSecurityFilterChain 是如何创建的,以及在介绍哪 ...

  9. swagger生成错误问题 汇总解决

    Unable to render this definition The provided definition does not specify a valid version field. Ple ...

  10. 《C# 爬虫 破境之道》:第一境 爬虫原理 — 第四节:同步与异步请求方式

    前两节,我们对WebRequest和WebResponse这两个类做了介绍,但两者还相对独立.本节,我们来说说如何将两者结合起来,方式有哪些,有什么不同. 1.4.1 说结合,无非就是我们如何发送一个 ...