最近想搞一个网站玩玩,发布网站用https协议已是大势所趋了。例如微信小程序,不使用https协议根本不让接入。因此,分享一下我尝试过的三种方法。
1.Linux自签(OPENSSL生成SSL自签证书)
2.阿里云免费证书
3.Let's Encrypt永久免费SSL证书【墙裂推荐】html
执行以下命令生成一个RSA私钥python
//生成rsa私钥,des3算法,1024位强度,ssl.key是秘钥文件名。 openssl genrsa -des3 -out ssl.key 1024
而后他会要求你输入这个key文件的密码,由你随便设置。
因为之后要给nginx使用。每次reload nginx配置时候都要你验证这个PAM密码的。
可是生成时候必须输入密码。若是不想之后那么麻烦,生成以后能够执行以下命令再删掉。linux
openssl rsa -in ssl.key -out ssl.key
根据刚刚生成的key文件来生成证书请求文件,操做以下:nginx
openssl req -new -key ssl.key -out ssl.csr
说明:执行以上命令后,须要依次输入国家、地区、城市、组织、组织单位、Common Name和Email。其中Common Name应该与域名保持一致。git
Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:GuangDong Locality Name (eg, city) []:ShenZhen Organization Name (eg, company) [Internet Widgits Pty Ltd]:tsy Organizational Unit Name (eg, section) []:tsy Common Name (e.g. server FQDN or YOUR name) []:selfssl.hxkj.vip 这一项必须和你的域名一致 Email Address []:t@tsy6.com
根据以上2个文件生成crt证书文件,执行下面命令:程序员
//这里3650是证书有效期(单位:天)。这个你们随意。最后使用到的文件是key和crt文件。 openssl x509 -req -days 3650 -in ssl.csr -signkey ssl.key -out ssl.crt
须要注意的是,在使用自签名的临时证书时,浏览器会提示证书的颁发机构是未知的。github
打开conf目录中的nginx.conf配置文件修改443端口监听配置。通常nginx配置文件默认路径为 /etc/nginx/nginx.conf,执行以下命令打开并修改:算法
vim /etc/nginx/nginx.conf //路径是你的nginx配置文件路径
Nginx默认配置是将443端口的监听配置注释掉了的,以下:sql
# Settings for a TLS enabled server. # server { # listen 443; # server_name localhost; #ssl on; #root /usr/share/nginx/html; #ssl_certificate ""; #ssl_certificate_key ""; #ssl_session_cache shared:SSL:1m; #ssl_session_timeout 5m; #ssl_protocols SSLv2 SSLv3 TLSv1; #ssl_ciphers HIGH:!aNULL:!MD5; #ssl_prefer_server_ciphers on; # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # # location / { # } # # error_page 404 /404.html; # location = /40x.html { # } # # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } #}
将注释打开,并对其中部份内容进行修改,修改后以下:shell
# Settings for a TLS enabled server. server { listen 443; server_name selfssl.hxkj.vip; //此处填写你本身的域名 ssl on; root /usr/share/nginx/html; ssl_certificate "/home/ssl/ssl.crt"; //此处填写刚刚生成的ssl.crt文件路径 ssl_certificate_key "/home/ssl/ssl.key"; //此处填写刚刚生成的ssl.key文件路径 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
修改配置并保存后,执行如下命令:
nginx -s reload
可以使nginx从新加载配置,使配置生效。
tips:自签证书由于安全性很低,会被谷歌浏览器拦截
若是配置正确,左边会显示“DNS配置记录正确,请耐心等候”。不然的话,就是域名TXT记录配置错误,返回检查第12步的信息是否填写正确
下面是个人nginx配置内容,可供参考:
server { listen 443; server_name alissl.hxkj.vip; ssl on; root /usr/share/nginx/html; ssl_certificate "/home/alissl/214715369370158.pem"; ssl_certificate_key "/home/alissl/214715369370158.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
修改配置并保存后,执行如下命令:
nginx -s reload
可以使nginx从新加载配置,使配置生效。
Let's Encrypt做为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推动网站从HTTP向HTTPS过分的进程,目前已经有愈来愈多的商家加入和赞助支持。
Let's Encrypt免费SSL证书的出现,也会对传统提供付费SSL证书服务的商家有不小的打击。到目前为止,Let's Encrypt得到IdenTrust交叉签名,这就是说能够应用且支持包括FireFox、Chrome在内的主流浏览器的兼容和支持,虽然目前是公测阶段,可是也有很多的用户在自有网站项目中正式使用起来。
Let's Encrypt 的最大贡献是它的 ACME 协议,第一份全自动服务器身份验证协议,以及配套的基础设施和客户端。这是为了解决一直以来 HTTPS TLS X.509 PKI 信任模型,即证书权威(Certificate Authority, CA)模型缺陷的一个起步。在客户端-服务器数据传输中,公私钥加密使得公钥能够明文传输而依然保密数据,但公钥自己是否属于服务器,或公钥与服务器是否同属一个身份,是没法简单验证的。证书权威模型经过引入事先信任的第三方,由第三方去验证这一点,并经过在服务器公钥上签名的方式来认证服务器。第三方的公钥则在事先就约定并离线准备好,以备访问时验证签名之用。这个第三方就称为证书权威,简称CA。相应的,CA验证过的公钥被称为证书。问题是,若是服务器私钥泄露,CA没法离线使对应的证书无效化,只能另外发布无效记录供客户端查询。也就是说,在私钥泄露到CA发布无效记录的窗口内,中间人能够肆意监控服-客之间的传输。若是中间人设法屏蔽了客户端对无效记录的访问,那么直到证书过时,中间人均可以进行监控。而因为当前CA验证和签发证书大多手动,证书有效期每每在一年到三年。Let's Encrypt 签发的证书有效期只有90天,甚至但愿缩短到60天。有效期越短,泄密后可供监控的窗口就越短。
检测Python指令
#检查Python的版本是否在2.7以上 python -v //2.7版本
若是没有安装Python的话,执行如下命令进行安装(若是检测到已安装则略过)
#安装python所需的包 yum install zlib-devel yum install bzip2-devel yum install openssl-devel yum install ncurses-devel yum install sqlite-devel #获取到Python cd /usr/local/src wget https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz #解压Python2.7.12 tar -xvf Python-2.7.12.tar.xz #编译python cd Python-2.7.12/ ./configure --prefix=/usr/local/python2.7 make && make install #创建link ln -s /usr/local/python2.7/bin/python2.7 /usr/local/bin/python #解决系统 Python 软连接指向 Python2.7 版本后,由于yum是不兼容 Python 2.7的,所须要指定 yum 的Python版本 # vim /usr/bin/yum 将头部的 #!/usr/bin/python 改为 #!/usr/bin/python2.6.6
检测Git指令
#检查系统是否安装git git --version
若是没有安装Git的话,执行如下命令进行安装(若是检测到已安装则略过)
#git 安装 yum install git
相较于第一种自签生成证书的方法,Let's Encrypt确定是考虑到推广HTTPS的普及型会让用户简单的获取和部署SSL证书,因此能够采用下面简单的一键部署获取证书。
#获取letsencrypt git clone https://github.com/letsencrypt/letsencrypt #进入letsencrypt目录 cd letsencrypt #生成证书 --email后填写本身的邮箱 -d 后面填写须要配置证书的域名(支持多个哦) ./letsencrypt-auto certonly --standalone --email t@tsy6.com -d hxkj.vip -d www.hxkj.vip
Let's Encrypt是支持绑定多域名的,上述两种方法都是只支持单域名。
在完成Let's Encrypt证书的生成以后,咱们会在"/etc/letsencrypt/live/hxkj.vip/"域名目录下有4个文件就是生成的密钥证书文件。
cert.pem - Apache服务器端证书
chain.pem - Apache根证书和中继证书
fullchain.pem - Nginx所须要ssl_certificate文件
privkey.pem - 安全证书KEY文件
由于个人是Nginx环境,那就须要用到fullchain.pem和privkey.pem两个证书文件。修改nginx配置的详细过程,上面两种方法都提到了,这里再也不赘述,如下我修改好的配置文件:
server { listen 443; server_name hxkj.vip www.hxkj.vip; ssl on; root /usr/share/nginx/html; ssl_certificate "/etc/letsencrypt/live/hxkj.vip/fullchain.pem"; ssl_certificate_key "/etc/letsencrypt/live/hxkj.vip/privkey.pem"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
从上图能够看出,Let's Encrypt证书是有效期90天的,须要咱们本身手工更新续期才能够。可是,身为程序员,能够自动执行的事,坚定不手动搞。
执行如下命令,在"/etc/letsencrypt/live/hxkj.vip/"域名目录下建立脚本,方便管理
vim /etc/letsencrypt/live/hxkj.vip/updatessl.sh //建立一个名字为updatessl的脚本
而后在脚本里添加以下代码
#!/bin/sh /usr/local/src/Python-2.7.12/letsencrypt/certbot-auto renew --force-renew --pre-hook "service nginx stop" --post-hook "service nginx start" #第一行是指此脚本使用/bin/sh 来执行 #第二行中--force-renew参数表明强制更新
退出并保存,而后给脚本添加可执行权限
// 这里的文件路径填写你本身的文件路径 chmod +x /etc/letsencrypt/live/hxkj.vip/updatessl.sh
打开crontab文件
crontab -e
而后在文件末尾添加一行如下内容
0 0 28 * * root /etc/letsencrypt/live/hxkj.vip/updatessl.sh //我这里表明每个月28号更新一次证书文件,文件路径填写你本身的文件路径
具体格式以下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令
每一个字段表明的含义以下:
Minute 每一个小时的第几分钟执行该任务
Hour 天天的第几个小时执行该任务
Day 每个月的第几天执行该任务
Month 每一年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段之外,其它字段皆为可选字段,可视须要决定。对于不指定的字段,要用“*”来填补其位置。
转载请注明出处:https://www.jianshu.com/p/eaad77ed1c1b
做者:TSY
我的空间:https://www.hxkj.vip