这篇文章介绍一种免费申请CA证书的方式,而且是通配符域名哦。首先介绍一下证书颁发机构的背景。

其他资源

Let’s Encrypt

Let’s Encrypt是一个于2015年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的SSL/TLS证书。Let’s Encrypt由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会、Mozilla基金会、Akamai以及思科。2015年4月9日,ISRG与Linux基金会宣布合作。用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub上有这一规范的草案,且提案的一个版本已作为一个Internet草案发布。

Let’s Encrypt宣称这一过程将十分简单、自动化并且免费。

  • 2015年8月7日,该服务更新其推出计划,预计将在2015年9月7日发布首个证书,随后向列入白名单的域名发行少量证书并逐渐扩大发行量。

  • 2015年12月3日,服务进入公测阶段,正式面向公众。

  • 2016年3月8日,ISRG宣布已经签发了第一百万张证书。

  • 2016年4月12日,该项目正式离开Beta阶段。

  • 2017年6月28日,ISRG宣布,他们已经签发了一亿张证书。

技术

2015年6月,Let’s Encrypt得到了一个存储在硬件安全模块中的离线的RSA根证书。这个由IdenTrust证书签发机构交叉签名的根证书,被用于签署两个证书。其中一个就是用于签发请求的证书,另一个则是保存在本地的证书,这个证书用于在上一个证书出问题时作备份证书之用。因为IdenTrust的CA根证书目前已被预置于主流浏览器中,所以Let’s Encrypt签发的证书可以从项目开始时就被识别并接受,甚至在用户的浏览器中没有信任ISRG的根证书时也没问题。为了解决对Windows XP的兼容性,目前Let’s Encrypt已经获取了另外两个根证书,原来的证书作为备用。

Let’s Encrypt的开发者们本计划在2015年年末推出签发ECDSA根证书的服务,但该计划已经经历三次推迟,目前定于2018年3月前完成。

以上内容来自维基百科

证书申请

官网有整个教程,点击跳转。首先选择证书环境,不同选择的区别仅仅是证书编码和格式,一般可以互转,我们以Centos7上配置Nginx为例。
image.png

安装

Certbot的包装在EPEL(Enterprise Linux的额外软件包)中。要使用Certbot,必须首先启用EPEL存储库。在RHEL或Oracle Linux上,还必须启用可选通道。

如果在EC2上使用RHEL,则可以运行以下命令来启用可选通道:

$ yum -y install yum-utils
$ yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional

如果做完了这些,可以通过以下命令安装:

$ sudo yum install python2-certbot-nginx

Certbot的DNS插件也可用于你的系统,该插件可用于从Let’s Encrypt的ACMEv2服务器中自动获取通配符证书。要使用这些插件,必须为想要获得Certbot插件提供的DNS提供商的证书的域配置DNS。这些插件的列表和更多关于使用它们的信息可以点击这里找到。要安装其中一个插件,请运行上面的安装命令,但是要将python2-certbot-nginx替换为要安装的DNS插件的名称。

开始申请

Certbot有一个Nginx插件,它在许多平台上都受支持,并且安装了证书。

运行这个命令可以自动生成证书和Nginx的证书配置文件:

$ sudo certbot --nginx

如果希望手动配置Nginx,只需要生成证书,使用如下命令:

$ sudo certbot --nginx certonly

如果想使用Let’s Encrypt的新ACMEv2服务器获得通配符证书,则还需要使用Certbot的一个DNS插件。为此,请确保使用上述说明安装了DNS提供商的插件,然后运行如下所示的命令:

$ sudo certbot -a dns-plugin -i nginx -d "*.example.com" -d example.com --server https://acme-v02.api.letsencrypt.org/directory

需要用你想使用的DNS插件的名称替换dns-plugin。可能还需要提供其他标签,例如上面链接的DNS插件文档中所述的API凭据路径。配上一个我申请的命令:

$ certbot certonly  -d "*.yangqiang.im" --manual --preferred-challenges dns-01  --server https://acme-v02.api.letsencrypt.org/directory

命令执行过程中会出现以下内容,其中部分需要填写邮箱等信息:

Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): yangqiang@yangqiang.im

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for yangqiang.im

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: Y

在过程中注意以下信息,这些信息需要你按照下面的信息配置TXT的域名解析,证明这个域名是你有权限操作的:

Please deploy a DNS TXT record under the name
_acme-challenge.yangqiang.im with the following value:

eHihXZhJUid9mLFTdU17sk223Klksdkl223k23

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

如果成功,用_acme-challenge.yangqiang.im访问,应该显示:eHihXZhJUid9mLFTdU17sk223Klksdkl223k23

点击回车就会开始验证,如果证书申请成功回显示如下信息:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yangqiang.im/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yangqiang.im/privkey.pem
   Your cert will expire on 2018-08-30. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

现在在目录中应该有证书文件了:

[root@hp certbot]# ls /etc/letsencrypt/live/yangqiang.im/
cert.pem  chain.pem  fullchain.pem  privkey.pem  README

自动续期

因为证书的有效期只有90天,所以我们需要通过以下方式来续期。

可以通过以下命令来测试自动续期功能是否正常:

$ sudo certbot renew --dry-run

如果正常,我们可以通过系统的cron任务来定时执行续期命令:

$ certbot renew

注意:
如果使用cron任务等定时执行的方式,推荐每天执行两次(除非你的证书需要续约或撤销,否则它不会执行任何操作,但是如果由于某种原因发生了加密发起的撤销,则定期运行它会让你的网站有机会一直保持在线状态)。请在一小时内为你的续订任务选择一个随机分钟。

一个cron任务的例子可能是这样的,它会在每天的23:00和早上7:00运行:

0 23,7 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew

entos7中先使用crontab -e命令,这时候会打开一个vi编辑器。然后把cron任务命令保存进去,用wd保存退出。
推荐一个cron命令在线测试的工具:Cron表达式在线测试工具

更简单的方式

已经有人帮我们做了很多工作,感谢!我们可以通过一个脚本来更简单的生成和续期。

acme.sh

点击跳转到Github项目地址

安装

curl https://get.acme.sh | sh
或者
wget -O -  https://get.acme.sh | sh

创建证书

acme提供了很多种方式,我们以最简单的方式dns api的方式,官方教程连接。这里使用阿里云的域名为例。

  • 阿里云创建RAM账号,账号具有域名管理权限。
  • 配置环境变量(账号信息是RAM的账号信息):
    export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
    export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
    
  • 创建
    acme.sh --issue --dns dns_ali -d example.com -d *.example.com
    

创建的过程种,acme会拿着账号信息去域名管理那里创建dns访问,会等待120秒,120秒过后会去验证是否配置成功,配置部分可以手动,只是比较麻烦,如果不想把账号信息给到acme就通过其他方式去创建就好了,验证成功后就会创建出来证书了,创建好的证书会给出目录,默认在~/.acme.sh/example.com/目录下。

注意:如果只是使用example.com.cer证书,部分情况下ios可以访问,Android不能访问,Android的证书必须带上中间证书,也就是证书内容是:fullchain.cer

续期

所有的证书都是60天后自动续期,不需要手动续期,acme会自动处理。也可以强制续期:

acme.sh --renew -d example.com --force

停止自动续期

acme.sh --remove -d example.com [--ecc]

证书文件不会从磁盘删除,可以手动删除:~/.acme.sh/example.com。从这里可以看出来,如果要自动续期,证书文件应该在这个默认目录才行,指定了目录的话应该在指定目录。

acme.sh更新

  • 更新
    acme.sh --upgrade
    
  • 配置自动更新
    acme.sh --upgrade --auto-upgrade
    
  • 关闭自动更新
    acme.sh --upgrade --auto-upgrade 0
    

证书相关工具

收集整理了一些证书工具。

使用centos主机搭建django使用nginx服务器运行环境。

名词解释

nginx:Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器。
uwsgi:WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

搭建步骤

安装python

  1. 下载:https://www.python.org/ftp/python/3.4.3/Python-3.4.3.tgz
  2. 安装:
    [root@carlton download]# tar -xf Python-3.4.3.tgz 
    [root@carlton download]# cd Python-3.4.3
    [root@carlton Python-3.4.3]# ./configure --prefix=/usr/local/python3.4
    显示:Successfully installed pip-6.0.8 setuptools-12.0.5 安装成功。
    
  3. 检测:
    [root@carlton ~]# cd /usr/local/python3.4/bin/
    [root@carlton bin]# ./python3
    Python 3.4.3 (default, May 25 2015, 11:40:38) 
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
  4. 安装virtualenv虚拟环境(python通过包管理的,为了不把以后用到的python的所有功能包含到基础python环境里,我们可以通过virtualenv来区分不同功能的不同python运行环境,比如django,我们可以建立一个虚拟环境只包含django运行相关的包,这样能够保证python环境是干净的):
    [root@carlton bin]# ./easy_install-3.4 virtualenv
  5. 使用一个django运行的虚拟环境:
    # 创建一个虚拟环境:
    [root@carlton bin]# ./virtualenv /home/python-virtual/django
    # 激活虚拟环境:
    [root@carlton bin]# source /home/python-virtual/django/bin/activate
    # 退出在虚拟环境中使用:
    (django)[root@carlton bin]# deactivate

注意:以下关于python包的安装都需要激活虚拟环境,这样才能保证安装的功能是只针对这个虚拟环境的(激活后命令行前面会有一个标志,如下面的红色(django))。

安装uwsgi

# 开始安装
(django)[root@carlton bin]# pip install uwsgi 
#安装成功: Successfully built uwsgi Installing collected #packages: uwsgi Successfully installed uwsgi-2.0.10

安装django

(django)[root@carlton bin]# pip install django
Collecting django
  Downloading Django-1.8.2-py2.py3-none-any.whl (6.2MB)
    100% |████████████████████████████████| 6.2MB 46kB/s 
Installing collected packages: django
Successfully installed django-1.8.2

安装nginx

  1. 下载
    (django)[root@carlton download]# wget http://nginx.org/download/nginx-1.9.0.tar.gz
  2. 安装
    (django)[root@carlton download]# tar -zxvf nginx-1.9.0.tar.gz 	
    (django)[root@carlton download]# cd nginx-1.9.0
    (django)[root@carlton nginx-1.9.0]# ./configure —prefix=/usr/local/nginx-1.9.0
    # 如果出现下面的情况则需要安装PCRE,如果没有出现直接忽略PCRE的安装,直接跳转到继续安装nginx:
    checking for PCRE library ... not found
    checking for PCRE library in /usr/local/ ... not found
    checking for PCRE library in /usr/include/pcre/ ... not found
    checking for PCRE library in /usr/pkg/ ... not found
    checking for PCRE library in /opt/local/ ... not found
    ./configure: error: the HTTP rewrite module requires the PCRE library.
    You can either disable the module by using --without-http_rewrite_module
    option, or install the PCRE library into the system, or build the PCRE library
    statically from the source with nginx by using --with-pcre=<path> option.
    # 那么你需要安装PCRE:
    # 下载PCRE和安装
    (django)[root@carlton download]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
    (django)[root@carlton download]# tar -zxvf pcre-8.36.tar.gz 
    (django)[root@carlton download]# cd pcre-8.36
    (django)[root@carlton pcre-8.36]# ./configure
    # 如果报错:需要c++:
    yum -y install gcc-c++
    # 然后:
    (django)[root@carlton pcre-8.36]# make && make install
    #继续安装nginx:
    (django)[root@carlton pcre-8.36]# ./configure —prefix=/usr/local/nginx-1.9.0
    #配置成功:
    Configuration summary
      + using system PCRE library
      + OpenSSL library is not used
      + md5: using system crypto library
      + sha1: using system crypto library
      + using system zlib library
    
      nginx path prefix: "/usr/local/nginx-1.9.0"
      nginx binary file: "/usr/local/nginx-1.9.0/sbin/nginx"
      nginx configuration prefix: "/usr/local/nginx-1.9.0/conf"
      nginx configuration file: "/usr/local/nginx-1.9.0/conf/nginx.conf"
      nginx pid file: "/usr/local/nginx-1.9.0/logs/nginx.pid"
      nginx error log file: "/usr/local/nginx-1.9.0/logs/error.log"
      nginx http access log file: "/usr/local/nginx-1.9.0/logs/access.log"
      nginx http client request body temporary files: "client_body_temp"
      nginx http proxy temporary files: "proxy_temp"
      nginx http fastcgi temporary files: "fastcgi_temp"
      nginx http uwsgi temporary files: "uwsgi_temp"
      nginx http scgi temporary files: “scgi_temp"
    # 编译和安装
    (django)[root@carlton nginx-1.9.0]# make && make install
  3. 检测
    #安装完成后如果没有报错,则尝试开启服务:
    (django)[root@carlton lib]# /usr/local/nginx-1.9.0/sbin/nginx 
    #如果发现报错:
    ./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory
    # 1、确认已经安装PCRE: 
    [root@carlton lib]$ cd /lib  
    [root@carlton lib]$ ls *pcre*  
    libpcre.so.0  libpcre.so.0.0.1   
    # 2、添加软链接:  
    [root@carlton lib]$ ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.1  
    注: 在有的操作系统上面,安装pcre后,安装的位置为/usr/local/lib/*pcre*
    在redhat 64位机器之上有这样的情况.
    在redhat 64位机器上, nginx可能读取的pcre文件为/lib64/libpcre.so.1文件.
    所以在改用下面的软连接:
    [root@carlton ~]$ ln -s /usr/local/lib/libpcre.so.1 /lib64/

至此全部软件已经安装完成,uwsgi和nginx的配置可以参考下面的思路,详细的配置,空了再弄:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django