| 
       
	Let’ s Encrypt 是一个免费的 SSL/TLS 证书发行机构, 证书有效期为90天, 到期前30内可续期, 实现永久免费. 
	本次安装使用的服务器配置: 
	DigitaIOcean VPS + CentOS 7 + Nginx 1.9.12 
	Let’ s Encrypt SSL 证书的的获取并不是像其他网站一样, 在页面上填写资申请证书, 而是需要在域名所在的服务器上安装一个客户端(python写的)去获取证书和续期. 
	客户端安装
	Let’ s Encrypt 的客户端托管在 github 上, 每次运行客户端都会先自动升级, 再运行最新的客户端, 所以需要安装 git. 因为是 python 写的程序, 所以需要安装 python. 
	下载客户端, 放到某路径下 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								git clone https://github.com/letsencrypt/letsencrypt 
						 
					 | 
				 
			
		 
	 
 
	运行一次客户端, 自动检查升级, 请确保内存足够多, 大概要几十兆吧. 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								cd letsencrypt 
							
								./letsencrypt-auto --help 
						 
					 | 
				 
			
		 
	 
 
	如果没什么问题, 会显示帮助文档. 
	获取证书
	申请过程中要验证绑定的域名是否属于申请人, 其原理就是申请人在域名所在的服务器上申请证书, 然后 Let’ s Encrypt 会访问绑定的域名与客户端通信成功即可通过. 
	这个验证的方法有两种, 一种需要停止当前的 web server 服务, 让出 80 端口, 由客户端内置的 web server 启动与 Let’ s Encrypt 通信. 另一种不需要停止当前 web server , 但需要在域名根目录下创建一个临时目录, 并要保证外网通用域名可以访问这个目录. 
	通过客户端 web server 获取证书 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								#停止nginx 
							
								systemctl stop nginx 
							
								  
							
								#获取证书, --standalone 参数:使用内置web server. --email 参数:管理员邮箱,证书到期前会发邮件到此邮箱提醒. -d 参数:要绑定的域名,同一域的不同子域都要输入. 
							
								./letsencrypt-auto certonly --standalone --email admin@itnmg.net -d blog.itnmg.net -d itnmg.net -d www.itnmg.net 
							
								  
							
								#启动nginx 
							
								systemctl start nginx 
						 
					 | 
				 
			
		 
	 
 
	通过临时目录获取证书 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								#创建临时目录,可能要修改nginx rewrite 规则才能从外网访问 
							
								mkdir -p /usr/share/nginx/html/.well-known/acme-challenge 
							
								  
							
								#--webroot 参数:指定使用临时目录的方式. -w 参数:指定后面-d 域名所在的根目录, 如果一次申请多个域的, 可以附加更多 -w...-d... 这段. 
							
								./letsencrypt-auto certonly --webroot --email admin@itnmg.net -w /usr/share/nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net 
						 
					 | 
				 
			
		 
	 
 
	完成上面的操作即可获得 SSL 证书, 保存在 “/etc/letsencrypt/live/根域名/” 目录下, 会产生 4 个文件, 其中3个证书文件, 1个私钥文件. 不要移动证书的位置, 以免续期时出现错误. 
	证书自动续期
	证书续期的命令如下 
	renew 参数是官方推荐的续期方式, 使用这个参数会遍历 /etc/letsencrypt/live 下所有的证书, 如果证书在可续期的时间范围内(过期前30天内), 就会申请新的证书并替换原有证书, 否则跳过. 
	如果要指定更新某个域名的证书, 则要使用 certonly 参数, 其实和新申请证书时的命令差不多. 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								./letsencrypt-auto certonly --webroot --renew-by-default --email admin@itnmg.net -w /usr/share/nginx/html -d blog.itnmg.net -d itnmg.net -d www.itnmg.net 
						 
					 | 
				 
			
		 
	 
 
	通过 cron 运行脚本的方式可以实现定时续期, 官方提供了脚本示例. https://letsencrypt.org/getting-started/ 最下面 
	最终脚本如下 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								#!/bin/sh 
							
								#停止 nginx 服务,使用 --standalone 独立服务器验证需要停止当前 web server. 
							
								systemctl stop nginx 
							
								if ! /path/to/letsencrypt-auto renew -nvv --standalone > /var/log/letsencrypt/renew.log 2>&1 ; then 
							
								    echo Automated renewal failed: 
							
								    cat /var/log/letsencrypt/renew.log 
							
								    exit 1 
							
								fi 
							
								#启动 nginx 
							
								systemctl start nginx 
						 
					 | 
				 
			
		 
	 
 
	将这段脚本保存为 letsencrypt-renew.sh 
	编辑 crontab 配置文件或执行 crontab -e 添加 cron 任务 
	我这里设置为每月28号23点执行此脚本. 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								#分 时 日 月 星期 执行用户 执行命令 
							
								0 23 28 *  *   root    /脚本目录/letsencrypt-renew.sh 
						 
					 | 
				 
			
		 
	 
 
	保存退出即可. 
	配置 Nginx SSL 证书
	  
	
	
		
			
				
					| 
						
					 | 
					
						
							
								nano /etc/nginx/conf.d/default.conf 
						 
					 | 
				 
			
		 
	 
 
	找到 SSL 证书对应域名的 Server 段, 修改为如下设置(根据自身需求做调整) 
	
	
		
			
				
					
						
							
								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 
						 
					 | 
					
						
							
								#设置非安全连接永久跳转到安全连接 
							
								server{ 
							
								    listen 80; 
							
								    server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net; 
							
								    #告诉浏览器有效期内只准用 https 访问 
							
								    add_header Strict-Transport-Security max-age=15768000; 
							
								    #永久重定向到 https 站点 
							
								    return 301 https://$server_name$request_uri; 
							
								} 
							
								server { 
							
								    #启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复. 
							
								    listen 443 ssl http2; 
							
								    server_name blog.itnmg.net *.blog.itnmg.net itnmg.net www.itnmg.net; 
							
								    #告诉浏览器当前页面禁止被frame 
							
								    add_header X-Frame-Options DENY; 
							
								    #告诉浏览器不要猜测mime类型 
							
								    add_header X-Content-Type-Options nosniff; 
							
								    root /usr/share/nginx/html/wordpress; 
							
								  
							
								    #证书路径 
							
								    ssl_certificate /etc/letsencrypt/live/itnmg.net/fullchain.pem; 
							
								    #私钥路径 
							
								    ssl_certificate_key /etc/letsencrypt/live/itnmg.net/privkey.pem; 
							
								    #安全链接可选的加密协议 
							
								    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
							
								    #可选的加密算法,顺序很重要,越靠前的优先级越高. 
							
								    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH; 
							
								    #在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法. 
							
								    ssl_prefer_server_ciphers on; 
							
								    #储存SSL会话的缓存类型和大小 
							
								    ssl_session_cache shared:SSL:10m; 
							
								    #缓存有效期 
							
								    ssl_session_timeout 60m; 
							
								  
							
								    #省略后面与证书无关的设置 
							
								} 
						 
					 | 
				 
			
		 
	 
 
	保存配置, 重新加载 Nginx 配置或重启. 
	
	
		
			
				
					| 
						
					 | 
					
						
							
								#重新加载配置 
							
								systemctl reload nginx 
							
								#或重启nginx 
							
								systemctl restart nginx 
						 
					 | 
				 
			
		 
	 
 
	到这步, Nginx 的 SSL 证书就配置完成了, 打开浏览器访问网站就会启用 https, 看到绿色安全锁的图标. 
	规范页面中的链接
	如果你发现浏览器中的安全锁上带有叹号, 说明页面中引用到了非 https 的链接, 你可能要花上一点时间来修改这些链接, 如果是本站资源, 可以使用相对地址, 如果是外部资源, 要先看外部资源是否支持 https, 如果支持改为 https 地址即可,如果不支持则要想办法替换为 https 资源或将资源保存到本地并使用相对地址. 
	 
	 
	 
	  
      (责任编辑:IT) |