让我们加密吧Let's encrypt
前言
如今的互联网越来越不安全,我们每个人的信息以及隐私不断被暴露,地下黑产盛行,经常收到垃圾短信,经常被陌生人的电话骚扰。我们的个人信息是怎么泄漏的呢?各种爬虫无时无刻不在互联网爬取着信息,各种嗅探工具无时无刻不在劫持着网络数据包,各种大大小小互联网公司因各种漏洞被脱库。互联网安全非常重要,如今很多大公司都强制使用https加密协议访问,安全性有了很大的提高,最起码数据包不能被劫持了,保证了客户端与服务器端通讯安全性。服端配置加密协议访问,在我的印象中是非常麻烦的,要搞老半天,而且不一定能跑起来。前段时间看了一篇讲解部署https的文章,整个过程简单自动化透明,而且证书是免费的,而且大部分主流操作系统主流浏览器都支持。在部署https之前需要对https协议以及CA证书以及CA有一定了解。
Let' encrypt
Let's encrypt是一家不以盈利为目的提供免费CA证书的机构,它旨在让全世界所有的互联网服务能够简单自动化部署加密协议,让https能够在所有的网站中普及。很多著名公司对其提供赞助,比如facebook,思科,mozilla等。它是对ACME(automated certificate management environment)协议的实现,只要实现了ACME协议的客户端都可以跟它交互。
实现原理
这里根据自己的理解简单描述下
1.生成用于授权对域名列表证书操作的RSA密钥对
2.客户端询问Let's encrypt获取证书需要做什么?
3.Let's encrypt告诉客户端需要验证是否真的持有域名以及授权私钥,怎么验证呢?告诉客户端把随机字符串保存在这个域名的根目录下指定命名的文件中以及对指定的字段使用授权私钥进行签名并回传
4.当客户端告诉Let's encrypt完成了指定的任务时,服端开始验证签名的有效性,开始通过域名访问指定生成的资源,当都验证通过时,服端认为当前客户端拥有指定域名,可以开始发证书了,当前密钥对被授权用于当前域名相关操作,当前密钥对被称之为账户授权密钥对
5.生成网站证书使用的RSA密钥对,请求获取证书时需要用到
6.根据协议生成CSR(certificate sign request)文件,发起CSR请求,请求Let's encrypt发DV(domain certificate)类型的证书
7.获得证书之后,web服务器就可以开始配置https了
获取证书
客户端选择
官方推荐的certbot需要安装比较多的依赖,而且比较重,尝试之后果断放弃了。因为平时使用PHP开发,所以也尝试使用了PHP编写的客户端,没有发现满意的,也果断放弃了。前几天在搜索我之前看到的那篇文章时,那篇文章没有搜索到,搜索到了其它相关的一些文章,其中有篇文章提到了一个很简洁的客户端acme_tiny,使用python实现的,看起来不错,就使用它了。
生成账户私钥对
设置验证域名合法性路径的服端配置并重启服务器(NGINX为例)
location ~ /.well-known/acme-challenge/(.*)? {
root /u01/server/cert/www;
try_files /$1 =404;
}
生成网站证书私钥对
生成CSR文件
获取证书
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /u01/server/cert/www/ > ./signed.crt
获取中间证书
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
合并证书
cat signed.crt intermediate.pem > chained.pem
NGINX服务器配置
server {
listen 443;
server_name yoursite.com;
charset utf-8;
root yourroot;
index index.php index.html index.htm;
ssl on;
ssl_certificate /u01/server/cert/chained.pem;
ssl_certificate_key /u01/server/cert/domain.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_prefer_server_ciphers on;
}
chrome显示效果
需要注意的地方
1.证书有效期是90天
2.为了避免滥用,一周内同一个域名只能生成20次
3.开发客户端时,可以使用沙盒环境
4.为了避免证书过期,可以写一个shell脚本自动更新证书
5.使用第三方工具测试OpenSSL是否包含心脏漏血漏洞
6.Let's encrypt创建比较晚,很多老设备老终端老系统可能不能识别
7.脚本需要依赖一些python模块,按照提示安装即可
后记
整个部署过程挺顺利的,在部署之前花了一些时间了解相关的文档。使用安全加密协议是有代价的,响应速度比普通协议访问速度慢了将近一倍。
参考资料
【1】Let' encrypt
https://letsencrypt.org/
【2】How it works?
https://letsencrypt.org/how-it-works/
【3】证书签名
https://letsencrypt.org/certificates/
【4】acme协议
https://tools.ietf.org/html/draft-ietf-acme-acme-01
【5】let's encrypt docs
https://letsencrypt.org/docs/
【6】acme_tiny
https://github.com/diafygi/acme-tiny/tree/ecd26b1e784973e5b52d5a308964a8e29a6cf207
让我们加密吧Let's encrypt的更多相关文章
- SSL/TLS 加密新纪元 - Let's Encrypt
转自: https://linux.cn/article-6565-1.html SSL/TLS 加密新纪元 - Let's Encrypt 根据 Let's Encrypt 官方博客消息,Let's ...
- php密码对称encrypt加密
/** * 对用户的密码进行加密 * @param $password * @param $encrypt //传入加密串,在修改密码时做认证 * @return array/password */ ...
- .NET Core 常用加密和Hash工具NETCore.Encrypt
前言 在日常开发过程中,不可避免的涉及到数据加密解密(Hash)操作,所以就有想法开发通用工具,NETCore.Encrypt就诞生了.目前NETCore.Encrypt只支持.NET Core ,工 ...
- Android数据加密之Aes加密
前言: 项目中除了登陆,支付等接口采用rsa非对称加密,之外的采用aes对称加密,今天我们来认识一下aes加密. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes ...
- php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...
- AES加密解密通用版Object-C / C# / JAVA
1.无向量 128位 /// <summary> /// AES加密(无向量) /// </summary> /// <param name="plainByt ...
- 【WP开发】加密篇:双向加密
说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES.AES等.在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不 ...
- PHP使用OPENSSL RSA加密解密数据
加密数据有很多种方法,今天我们来看一下OPENSSL RSA的加密办法. 1.首先得安装php的openssl扩展 php -m | grep openssl 执行以上命令,确保已经安装了openss ...
- iOS代码加密常用加密方式
iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...
随机推荐
- P4049 [JSOI2007]合金
传送门 我数学可能白学了-- 因为三个数加起来等于\(1\),那么只要用前两个数就能表示,那么就能把每一种金属看成一个二维向量.考虑只有两个向量的时候,设这两个向量为\(a,b\),那么一个向量\(c ...
- Unity项目 - 打砖块游戏
基本功能:实现WASD进行视角在XY轴方向的移动,其次按下鼠标左键产生子弹bullet对面前的砖块cube进行碰撞. 主界面: 运行情况: 动态过程: 项目地址:BreakBricks 制作过程: 创 ...
- SpringBoot集成Swagger2 以及汉化 快速教程
(一) Swagger介绍 Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件 (二)为什么使用Swagger 在现在的开发过程中还有很大一部分公司都是以口口相传的方式来进行 ...
- BZOJ 1208 set
思路: 开俩set 模拟一下 就好了 //By SiriusRen #include <bits/stdc++.h> using namespace std; int n,xx,yy; s ...
- ACM_开挂的小G
开挂的小G Time Limit: 2000/1000ms (Java/Others) Problem Description: 小G寒假在家没网络,闲着没事干又看不下书,就玩起了单机游戏ACM_Ga ...
- Offer收割_4
1.水题 2.BFS宽搜(使用优先队列priority_queue) 4.题意:给数组a.要求重排列数组,使得数组中的任意相邻的两个元素不同.如果存在多个方案,那么选择字典序最小的方案. 如果不能满 ...
- 【转】Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
概要 前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...
- Mac sierra下 wget安装
本文由@ray 出品,转载请注明出处. 文章链接:http://www.cnblogs.com/wolfray/p/8040699.html 没有Wget的日子是非常难过的,强大的Mac OS 下安 ...
- android学习之路资料集合
版权声明:本文为 stormzhang 原创文章,可以随意转载,但必须在明确位置注明出处!!! 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回答如何自学android编程, 就借这个机会在 ...
- #2028 Lowest Common Multiple Plus
http://acm.hdu.edu.cn/showproblem.php?pid=2028 应该是比较简单的一道题啊...求输入的数的最小公倍数. 先用百度来的(老师教的已经不知道跑哪去了)辗转相除 ...