Let's Encrypt,站点加密之旅

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

Let‘s Encrypt,是2016年4月12日成立的一家证书授权中心,提供免费的传输层安全(TLS)X.509证书,通过自动化的过程消除目前安全网站证书需要手工创建,加密,签名,安装以及更新的复杂性。

一直以来都觉得浏览器网址开头的那把小绿锁很别致啊,现在Let‘s Encrypt横空出世提供免费证书,说明https势在必行,那我也来动手给博客加把锁吧,看着就安全是吧。

Let‘s Encrypt 的官网提供的脚本看起来更加自动化一些,但我没有亲自尝试,而是在Github上搜到了一个开源脚本acme-tiny,用下来之后成功将博客加密完成。

根据acme-tiny提供的说明文档和我自己的实施过程列出以下几步:

克隆脚本

sudo git clone https://github.com/diafygi/acme-tiny.git
cd acme-tiny

创建Let‘s Encrypt私钥

openssl genrsa 4096 > account.key

创建CSR(Certificate Signing Request,证书签名请求) 文件

ACME协议 (Let‘s Encrypt所使用的) 需要一个csr文件,用来进行证书签名和证书更新。

将需要加密的域名加到下面的代码中,目前一张证书最多可以加密 100 个域名:

openssl genrsa 4096 > domain.key
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr

证明你拥有该域名

acme-tiny脚本会生成验证文件并写入到你指定的目录下,然后通过 ".well-known/acme-challenge/" 这个URL来访问到验证文件. 注意: Let‘s Encrypt 会对你的服务器做一次http请求来进行验证,因此你需要保证80端口能够访问.

  • 手动生成challenges目录,用来存放验证文件(路径可以根据需要修改)

    mkdir -p /var/www/challenges

  • 配置nignx的80端口
    server {

        listen 80;
        server_name yoursite.com www.yoursite.com;
        return 301 https://yoursite.com$request_uri; # 注意进行301重定向到https,否则通过http仍能访问你的站点

        location /.well-known/acme-challenge/ {
            alias /var/www/challenges/;
            try_files $uri =404;
        }

        #...你的其他配置
    }

获取签名证书

sudo chmod +x acme_tiny.py
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt

安装证书

针对nginx, 你还需要将 Let‘s Encrypt 的中间件证书 intermediate.pem 内容附加在签名证书signed.crt之后:

    wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
    cat signed.crt intermediate.pem > chained.pem

    server {
        listen 443;
        server_name yoursite.com, www.yoursite.com;

        ssl on;
        ssl_certificate /path/to/chained.pem;
        ssl_certificate_key /path/to/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;

        #...你的其他配置
    }

证书自动更新定时任务

恭喜!你的网站已经使用上了HTTPS。 但Let‘s Encrypt 证书有效期只有90天, 所以需要定期更新。现在只需要写一个更新脚本并把它放到定时任务中即可。

脚本内容:

    #!/usr/bin/sh

    python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit

    wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem

    cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem

    service nginx reload

定时任务可以设置为每个月执行一次:
0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log

Let's Encrypt,站点加密之旅

时间: 2024-10-28 12:00:23

Let's Encrypt,站点加密之旅的相关文章

居然有对站点加密的东西——这个沃通免费SSL证书

今日无聊在看看博客园,突然看到这样的文章关于SSL站点加密.觉得很好奇看了看,感觉不错,现在出了可以对站点数据加密的呢.而且居然有免费试用,呵呵.看来给用户体验还是有考虑到的.所以把文章给转了供其他博友分享下..如果自己建设站点然后想试试是什么样的话.可以通过这个去申请个然后部署上去看看.感觉挺新鲜的..哈哈.. 以下是原文.... 在百度中搜索“使用OpenSSL生成证书”,百度为您找到相关结果约74,500个,还有这么多人在找免费SSL证书,还用OpenSSL生成自签证书吗? 沃通的在线宣传

用ASP为你的站点加密

正在学习建设web站点的读者,可能正在为站点的安全性而担忧:也许你正在建设一个非公开性网站,只有系统用户才可以访问你的站点.如果你编制的是ASP网页,那么你可以通过本文轻松达到这一目的. 首先,你需要制作登录页面,在html中加入form,并设为自发送页 〈form name=″login″ action=″default.ASP″ method=″post″ target=″-top″〉 action后接本页url,这样即使用户登录错误,在本页即获提示,而无须再返回前一页登录.在表单中加入 〈

Encrypt(加密解密)

using System;using System.Security.Cryptography;  using System.Text;using System.IO; public class Encrypt{    public Encrypt()    { } #region MD5加密    /// <summary>    ///  MD5加密    /// </summary>    public static string MD5Encrypt(string Text

c语言课程设计之文本文件加密技术

#include<stdio.h> #include<stdlib.h>//使用了exit函数 #include<string.h> #define M 30 void menu(void);//菜单函数 void create(void);//新建文件及输入文本函数 void encrypt(void);//加密函数 void decrypt(void);//解密函数 int judge(void);//判断函数 int proceed(code);//判断密码是否合

php 加密解密字符串

/********************************************************************* 函数名称:encrypt 函数作用:加密解密字符串 使用方法: 加密 :encrypt('str','E','nowamagic'); 解密 :encrypt('被加密过的字符串','D','nowamagic'); 参数说明: $string :需要加密解密的字符串 $operation:判断是加密还是解密:E:加密 D:解密 $key :加密的钥匙(密

C#一个字符串的加密与解密

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO;   namespace ConsoleApplication1 {     class Program     {         static string encryptKey = "Oyea";    //

PHP的加密解密字符串函数

/********************************************************************* 函数名称:encrypt 函数作用:加密解密字符串 使用方法: 加密 :encrypt('str','E','nowamagic'); 解密 :encrypt('被加密过的字符串','D','nowamagic'); 参数说明: $string :需要加密解密的字符串 $operation:判断是加密还是解密:E:加密 D:解密 $key :加密的钥匙(密

C#/JS AES字符串加密和解密

往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. js端加密解密 aes.js: /* CryptoJS v3.1.2 code.google.com/p/crypto-js (c) 2009-2013 by Jeff Mott. All rights reserved. code.google.com/p/crypto-js/wiki/Licen

[Java 安全]加密、解密与数字签名

引言 本文使用的密码学术语请见术语章节. Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的ASCII字符序列,常用在需用通过文本协议(比如HTTP和SMTP)来传输二进制数据的情况下.Base64并不是加密解密算法,尽管我们有时也听到使用Base64来加密解密的说法,但这里所说的加密与解密实际是指编码(encode)和解码(decode)的过程,其