HTTPS 证书生成原理和部署细节
相关阅读:
Spring 核心框架体系结构
今天摸索了下 HTTPS 的证书生成,以及它在 Nginx 上的部署。由于博客托管在 github 上,没办法部署证书,先记录下,后续有需要方便快捷操作。本文的阐述不一定完善,但是可以让一个初学者了解大致的原理,同时跟着操作可以为自己的博客/网站部署一个 HTTPS 证书。
网站部署 HTTPS 的重要性
看看下面,部分电信用户访问京东首页的时候,会看到右下角有一个浮动广告:
小白用户以为是京东有意放置的,细心的用户会发现,这个 iframe 一层嵌一层的恶心广告很明显是电信/中间人通过 DNS 劫持注入进去的,十分恶心,没有关闭按钮。
随着互联网的快速发展,我们几乎离不开网络了,聊天、预订酒店、购物等等,我们的隐私无时无刻不暴露在这庞大的网络之中,HTTPS 能够让信息在网络中的传递更加安全,增加了 haker 的攻击成本。
HTTPS 区别于 HTTP,它多了加密(encryption),认证(verification),鉴定(identification)。它的安全源自非对称加密以及第三方的 CA 认证。
简述 HTTPS 的运作
如上图所示,简述如下:
客户端生成一个随机数 random-client,传到服务器端(Say Hello)
服务器端生成一个随机数 random-server,和着公钥,一起回馈给客户端(I got it)
客户端收到的东西原封不动,加上 premaster secret(通过 random-client、random-server 经过一定算法生成的东西),再一次送给服务器端,这次传过去的东西会使用公钥加密
服务器端先使用私钥解密,拿到 premaster secret,此时客户端和服务器端都拥有了三个要素:random-client、random-server 和 premaster secret
此时安全通道已经建立,以后的交流都会校检上面的三个要素通过算法算出的 session key
CA 数字证书认证中心
如果网站只靠上图运作,可能会被中间人攻击,试想一下,在客户端和服务端中间有一个中间人,两者之间的传输对中间人来说是透明的,那么中间人完全可以获取两端之间的任何数据,然后将数据原封不动的转发给两端,由于中间人也拿到了三要素和公钥,它照样可以解密传输内容,并且还可以篡改内容。
为了确保我们的数据安全,我们还需要一个 CA 数字证书。HTTPS的传输采用的是非对称加密,一组非对称加密密钥包含公钥和私钥,通过公钥加密的内容只有私钥能够解密。上面我们看到,整个传输过程,服务器端是没有透露私钥的。而 CA 数字认证涉及到私钥,整个过程比较复杂,我也没有很深入的了解,后续有详细了解之后再补充下。
CA 认证分为三类:DV ( domain validation),OV ( organization validation),EV ( extended validation),证书申请难度从前往后递增,貌似 EV 这种不仅仅是有钱就可以申请的。
对于一般的小型网站尤其是博客,可以使用自签名证书来构建安全网络,所谓自签名证书,就是自己扮演 CA 机构,自己给自己的服务器颁发证书。
生成密钥、证书
第一步,为服务器端和客户端准备公钥、私钥
第二步,生成 CA 证书
在执行第二步时会出现:
注意,这里的 Organization Name (eg, company) [Internet Widgits Pty Ltd]: 后面生成客户端和服务器端证书的时候也需要填写,不要写成一样的!!!可以随意写如:My CA, My Server, My Client。
然后 Common Name (e.g. server FQDN or YOUR name) []: 这一项,是最后可以访问的域名,我这里为了方便测试,写成 localhost,如果是为了给我的网站生成证书,需要写成 barretlee.com。
第三步,生成服务器端证书和客户端证书
此时,我们的 keys 文件夹下已经有如下内容了:
看到上面两个 js 文件了么,我们来跑几个demo。
HTTPS本地测试
服务器代码:
短短几行代码就构建了一个简单的 https 服务器,options 将私钥和证书带上。然后利用 curl 测试:
当我们直接访问时,curl //localhost:8000 一堆提示,原因是没有经过 CA 认证,添加 -k 参数能够解决这个问题:
这样的方式是不安全的,存在我们上面提到的中间人攻击问题。可以搞一个客户端带上 CA 证书试试:
先打开服务器 node http-server.js,然后执行
如果你的代码没有输出 hello world,说明证书生成的时候存在问题。也可以通过浏览器访问:
提示错误:
此服务器无法证明它是localhost;您计算机的操作系统不信任其安全证书。出现此问题的原因可能是配置有误或您的连接被拦截了。
原因是浏览器没有 CA 证书,只有 CA 证书,服务器才能够确定,这个用户就是真实的来自 localhost 的访问请求(比如不是代理过来的)。
你可以点击 继续前往localhost(不安全) 这个链接,相当于执行 curl -k //localhost:8000。如果我们的证书不是自己颁发,而是去靠谱的机构去申请的,那就不会出现这样的问题,因为靠谱机构的证书会放到浏览器中,浏览器会帮我们做很多事情。初次尝试的同学可以去 startssl.com 申请一个免费的证书。
Nginx 部署
ssh 到你的服务器,对 Nginx 做如下配置:
会发现,网页 URL 地址框左边已经多出了一个小绿锁。当然,部署好了之后可以去这个网站看看测评分数,如果分数是 A+,说明你的 HTTPS 的各项配置都还不错,速度也很快。
小结
好吧,我也是初次尝试,本地测试是 ok 的,由于买的阿里云服务器到期了也没续费,就没远程折腾,其实本地 Nginx + Nodejs,然后 Hosts 配置域名也是可以较好模拟的。文中很多地方描述的可能不是十分准确,提到的点也不够全面,如果有错误,还请斧正!
via:http://www.barretlee.com/blog/2015/10/05/how-to-build-a-https-server/
欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。
本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。
长按下方的二维码可以快速关注我们
如想加群讨论学习,请点击右下角的“加群学习”菜单入群。
HTTPS 证书生成原理和部署细节相关推荐
- 【教程】Linux下Https证书生成,与Nginx配置https
Linux系统Https证书生成与Nginx配置https 证书生成 查看openssl 生成证书 Nginx配置https(默认443端口) 证书生成 查看openssl 1,我们在linux系统下 ...
- https证书服务器怎么完成部署?
HTTPS是一种由http协议和SSL证书一同搭建的网络协议,也被称为https证书.部署了https证书服务器的网站也又更高的安全以及可信度.随着人们对于网络安全意识的提高,也使得https证书服务 ...
- https证书存在哪里?部署https证书的意义
https证书存在哪里?这个是很多新手比较疑惑的一个问题.我们都知道https证书(即SSL证书)可以用来保护网站或微信小程序的安全,但不知道它其实是部署到服务器上的. https证书在安装之后,ht ...
- 免费https证书生成
在线证书生成工具网站 freessl.cn 生成csr 证书管理工具 KeyManager
- Golang代码实现HTTPs(HTTPS证书生成和部署)
在win7下试试: 1.实现一个最简单的HTTPS Web Server // gohttps/2-https/server.go package mainimport ("fmt" ...
- TLS/HTTPS 证书生成与验证
https://www.cnblogs.com/kyrios/p/tls-and-certificates.html 最近在研究基于ssl的传输加密,涉及到了key和证书相关的话题,走了不少弯路,现在 ...
- Javaweb项目 http改成https 证书生成
前提条件:已经下载并安装配置好Tomcat,访问http://localhost:8080的时候会出现tomcat的界面. 第一步:配置hosts文件 添加一行127.0.0.1 codecrazy. ...
- 本地https证书生成步骤
步骤一:生成证书 keytool -genkey -v -alias tonguas -validity 3650 -keyalg RSA -keypass ucap123 -storepass u ...
- https 证书生成
因等保问题需要使用https 协议进行web程序的访问 关于证书制作的工具下载地址为 :http://slproweb.com/products/Win32OpenSSL.html 此为windows ...
- HTTPS原理与证书生成
原文链接: HTTPS原理与证书生成 HTTPS HTTPS与HTTP是什么关系呢?我们可以对比下HTTP与HTTPS的请求过程: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 ...
最新文章
- gradle多项目 svn依赖
- 你或许还未听说过的一些ASP.NET 2.0要诀 [转]
- Python练习-迭代器-模拟cat|grep文件
- Unicode和Ascii转byte,Unicode占二个byte,Ascii占一个byte
- 使用开源ASR框架在Mono和.NET C#中进行语音识别
- 各种卷积类型Convolution
- cisco packet tracer 5.3.rar_思科cisco的asa防火墙排错命令packet-tracer
- python难学吗-python语言好学吗
- 设计模式分类及UML汇总
- 变频器LED显示灯闪烁_图文并茂,彻头彻尾认识变频器,适合初学者!
- zip和rar文件的contentType
- Radius 协议介绍
- db9针232接口波特率标准_RS232串口通信:接口定义、标准接法详细说明,一看就懂了...
- 关于 Unity 绑定手机 收不到验证码 的解决方案
- 【linux命令】cp复制命令
- Ubuntu 安装Chrome(DEB 出现问题使用)
- Java 多线程平行计算总结
- 【20210906】让实验室服务器运行本地python代码
- Dynamic Memory Networks DMN+
- ibm软件下载网页链接