让我们加密吧Let's encrypt

前言

如今的互联网越来越不安全,我们每个人的信息以及隐私不断被暴露,地下黑产盛行,经常收到垃圾短信,经常被陌生人的电话骚扰。我们的个人信息是怎么泄漏的呢?各种爬虫无时无刻不在互联网爬取着信息,各种嗅探工具无时无刻不在劫持着网络数据包,各种大大小小互联网公司因各种漏洞被脱库。互联网安全非常重要,如今很多大公司都强制使用https加密协议访问,安全性有了很大的提高,最起码数据包不能被劫持了,保证了客户端与服务器端通讯安全性。服端配置加密协议访问,在我的印象中是非常麻烦的,要搞老半天,而且不一定能跑起来。前段时间看了一篇讲解部署https的文章,整个过程简单自动化透明,而且证书是免费的,而且大部分主流操作系统主流浏览器都支持。在部署https之前需要对https协议以及CA证书以及CA有一定了解。

Let‘ encypt

Let‘s encypt是一家不以盈利为目的提供免费CA证书的机构,它旨在让全世界所有的互联网服务能够简单自动化部署加密协议,让https能够在所有的网站中普及。很多著名公司对其提供赞助,比如facebook,思科,mozilla等。它是对ACME(automated certificate management environment)协议的实现,只要实现了ACME协议的客户端都可以跟它交互。

实现原理

这里根据自己的理解简单描述下

1.生成用于授权对域名列表证书操作的RSA密钥对
2.客户端询问Let‘s encypt获取证书需要做什么?
3.Let‘s encypt告诉客户端需要验证是否真的持有域名以及授权私钥,怎么验证呢?告诉客户端把随机字符串保存在这个域名的根目录下指定命名的文件中以及对指定的字段使用授权私钥进行签名并回传


4.当客户端告诉Let‘s encypt完成了指定的任务时,服端开始验证签名的有效性,开始通过域名访问指定生成的资源,当都验证通过时,服端认为当前客户端拥有指定域名,可以开始发证书了,当前密钥对被授权用于当前域名相关操作,当前密钥对被称之为账户授权密钥对


5.生成网站证书使用的RSA密钥对,请求获取证书时需要用到
6.根据协议生成CSR(certificate sign request)文件,发起CSR请求,请求Let‘s encypt发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

时间: 2024-08-10 16:48:49

让我们加密吧Let's encrypt的相关文章

AES加密

package util; import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;impo

转:system.Security.Cryptography C# 加密和解密

以下文转自: http://www.360doc.com/content/13/0122/05/19147_261678471.shtml 总结:注册的时候经过MD5加密存进数据库,在登录的时候需要先加密输入的密码,再进行和数据库里的比对,因为同一字符串加密后是一样的,并不是无规则的:实例: string name = this.TextBox1.Text;        string pwd = System.Web.Security.FormsAuthentication.HashPassw

iOS代码加密常用加密方式

在今天的面试中,被问到了iOS是采用什么进行加密解密操作的,我的回答是这样的:AES,MD5,Base 64,然后是对这几种加密算法进行了一下简单的介绍和概述和几种算法之间的不同点和优缺点.然而,收到的回答是:这些都不是iOS的加密!我顿时就无语了,这不就是iOS加密所用到的方法么?然后向面试官请教了一下:MD5是一种摘要....什么叫加密呢?加密是客户端对数据加密和服务器端采用秘钥对数据进行解密处理,为了数据的安全考虑.要说加密应该是RSA.幸亏之前有了解过RSA,只是了解的不是很彻底和清楚.

RSA AES 前端JS与后台JAVA的加密解密的是实现

AES CryptoJS 前提是编码方式,key,vi中设置一样,就可以进行跨语言加密解密 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <link rel="stylesheet" href="<%=

java和php实现RSA加密互通-b

java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pem 1024 生产结果 -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbrbo/JaPJTJLl+6hfZm7uuLIr t/hivaLfot32wq/nSzoSsYkoNk27Yy+n10ODoZ75/91Y8Q

最简单的加密解密算法

1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace WindowsFormsApplication1 11 { 12 pu

WebApi实现通讯加密 (转)

http://www.cnblogs.com/jonneydong/p/WebApi_Encryption.html 一. 场景介绍: 如题如何有效的,最少量的现有代码侵入从而实现客户端与服务器之间的数据交换加密呢? 二. 探究: 1.需求分析 webapi服务端 有如下接口: public class ApiTestController : ApiController { // GET api/<controller>/5 public object Get(int id) { return

ajax_jsonp_php加密_跨域例子

服务端 php <?php header("Content-Type:text/html;charset=UTF-8"); // $string: 明文 或 密文 // $operation:DECODE表示解密,其它表示加密 // $key: 密匙 // $expiry:密文有效期 function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { // 动态密匙长度,相同的明文会生成不同密文就

熟悉一下GO的AES加密库

  package main import ( "crypto/aes" "crypto/cipher" "errors" ) type ConnAes struct { key string keyBlock cipher.Block iv string } func NewConnAes(key string, iv string) (ca ConnAes, err error) { if len(iv) != aes.BlockSize {