HTTPS静态服务搭建过程详解
HTTPS服务对于一个前端开发者来说是一个天天打招呼的老伙计了,但是之前我跟HTTPS打交道的场景一直是抓包,自己没有亲自搭建过HTTPS服务,对HTTPS的底层知识也是一知半解。最近正好遇到一个用户场景,页面需要调起手机的摄像头,这就要求页面服务必须是HTTPS的,所以就尝试搭建了HTTPS的静态服务,过程挺曲折的,所以总结一下分享给大家,希望能给看过本文的朋友一点帮助,提高工作效率。
本文主要讲三个点:HTTPS基本原理、证书的获取和httpd的https配置。
HTTPS基本原理
HTTPS = HTTP + TSL(transport layer security)在应用层和传输层之间添加了一个会话层,会话层采用SSL协议,完成数据的加密、身份认证、数据完整性校验。如下图所示:
要完成以上功能,TLS的连接在TCP连接的基础之上,需要增加握手次数,如下图所示:
新增的往返过程可以简单根据下图示意理解。
总结一下,HTTPS使用的过程中,主要是需要一个认证中心签名的证书,用该证书证明服务端返回的公钥是可信的,然后用该公钥加密浏览器端生成的对称密钥,服务端用自己私钥解密得到浏览器发送的对称密钥,然后浏览器和服务端通过对称密码进行加密通信。因此,搭建HTTPS服务首先要从认证中心申请到签名证书。
证书的获取
证书的获取过程是:向证书认证中心—CA提出申请,在CA判明申请者的身份后,为其分配一个公钥,然后CA将该公钥与申请者的身份信息绑在一起,然后用CA的私钥为其加密签名,签名后颁发给申请者。证书中的内容是用户公钥、用户信息、颁发机构、有效期等。分配的公钥可以通过证书请求中的用户私钥来获取。用户想要鉴别证书的真伪,只能用CA的公钥对证书上的签字进行验证。下图是证书获取过程的示意图:
由于正规的证书申请,CA机构是要收费的,所以测试过程中我们需要自建CA来颁发证书。
1.自建CA
利用openssl包可以创建CA,前提是需要openssl.conf的要求,创建自建CA所需的文件和目录,具体可以参见相关文章。这里主要指出几个必要的文件和目录:
new_certs_dir = $dir/newcerts # 新证书存放位置
private_key = $dir/private/cakey.pem #CA私钥
database = $dir/index.txt #证书索引数据库文件
serial = $dir/serial 颁发证书的序列号
(1)创建CA私钥
cd CA_PATH #CA_PATH为demoCA的上级目录,因为配置文件中CA默认的私钥路径是./demoCA/private/cakey.pem,所以一定要在该目录执行命令,否则会报错
openssl genrsa -out ./demoCA/private/cakey.pem 2048
(2)创建CA证书申请
openssl req -new -in .demoCA/private/cakey.pem -days 365 -out .demoCA/cacsr.pem
申请的过程中需要输入用户信息,如Country Name,Organization Name,Email Address等,注意自己填写的信息。
(3)创建自签证书
openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.crt
2. 用户申请证书
在任意机器或路径下创建用户私钥
(1)创建用户私钥
openssl genrsa -out userkey.pem 2048
(2)创建用户证书申请
openssl req -new -in userkey.pem -days 365 -out usercsr.pem
(3)CA签名
需要CA签名的话,就需要将用户申请文件usercsr.pem拷贝到CA所在的机器上,现在把用户的文件放置在与demoCA同级的demoUser目录中。CA默认的私钥路径是./demoCA/private/cakey.pem,因此仍需要切换到./demoCA的上级目录。
cd CA_PATH #CA_PATH为demoCA的上级目录,因为配置文件中CA默认的私钥路径是./demoCA/private/cakey.pem,所以一定要在该目录执行命令,否则会报错
openssl ca -in ./demoUser/userkey.pem -out ./demoUser/user.crt
httpd的https配置
经过以上两步的操作,我们拿到了用户证书user.crt和用户密钥userkey.pem,接下来就要在httpd的配置文件中配置https。
(1)确认ssl模块(mod_ssl.so)开启
(2)设置https相应的虚拟端口配置,默认为443端口
配置代码如下:
<VirtualHost *:443>
ServerName www.example.com
DocumentRoot /www/example.com/htdocs
SSLengine on
SSLProtocol all -SSLv3
SSLcertificatefile USER_CRT_PATH/user.crt
SSLcertificatekeyfile USER_KEY_PATH/user.key
</VirtualHost>
(3)重启httpd即可
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(11)-系统日志和异常的处理①
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
- No.3 啥是数据运营(三):思维方式
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid
- MySQL数据同步【双主热备】
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(6)-Unity 依赖注入
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(4)-创建项目解决方案
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(3)-漂亮系统登陆界面
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
- 扬言毁灭人类的索菲亚再一次挑战了人类
- SQL Server 存储过程生成insert语句
- silverlight 背景透明
- .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(33)-MVC 表单验证
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- a伪类
- CodeForces - 1102A(思维题)
- C++使用指针,动态数组,指针做参数需要注意的问题等总结
- POJ 1170 Shopping Offers非状态压缩做法
- HDU 4283 You Are the One
- C++cin,cout以及常见函数总结,cin,cout格式化控制
- 最简单,最明了,看了就会的VScode和C++的配置!(Visual Studio Code)
- C++字符串输入输出以及复合类型浅谈
- Codeforce 1155D Beautiful Array(DP)
- C++类型转换几种情况
- 疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays
- 『数据库』你这些知识点都不会,你学个锤子SQL数据库!
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 XKC's basketball team
- The Preliminary Contest for ICPC Asia Xuzhou 2019 徐州网络赛 D Carneginon
- 地表最强的MySQL安装一键式安装,信不信你下完我就给你装好!附各种Mysql安装失败的解决办法(什么你安装失败了?快来看这个)