Linux CentOS 7 下 Nginx 安装使用 Let’ s Encrypt 证书的完整过程

网站转成https是大势所趋。但是在国内,推进的过程显然要比国外慢很多。

现阶段如果将自己的网站改成https以后,会碰到这样的尴尬现象:如果在页面上引用了http://的链接或者图片,用户在浏览器上会看到类似该网站是非安全网站的警告,对于网站运营者来说可以说非常冤。由于很多链接是第三方的,没有办法去控制。

对于api接口类的网站,就不存在混合的问题,所以首先应该从api后台接口部分开始用https。(ios已经强制要求接口地址必须为https了)

大牌提供商的SSL证书可不便宜,对于大公司也许不算什么,但是对于小公司及个人来说贵了。现在国外出现的免费SSL服务商Let’s Encrypt,绝对是小公司或者开发者的福音。(现阶段在天朝也能够正常使用,但是未来不清楚。如果天朝有一天自绝于世界网络的话,没准这个证书也会被封堵。)

这里整理了在CentOS7 + nginx安装和使用Let’s Encrypt的完整过程。

官方网站:https://letsencrypt.org

申请let’s encript 证书可以有三种方式:

  1. 通过certbot脚本
  2. 通过支持Letencript的虚拟主机提供商
  3. 手工申请manual mode

没有特殊情况,首选采用certbot脚本方式。

由于letsencrypt证书的有效期只有90天,需要长期使用的话,需要在失效前进行延长申请。用certbot脚本工具,可以将延期申请的脚本写到定时任务来自动完成,非常方便。

一、前提条件

  1. 拥有一个域名,例如mydomain.com (在国内主机的用的话,还需要通过ICP备案)
  2. 在域名服务器创建一条A记录,指向云主机的公网IP地址。例如demo.mydomain.com指向xxx.xxx.xxx.xxx的IP地址
  3. 要等到新创建的域名解析能在公网上被解析到。
  4. 据说国内的域名提供商对letsencrypt的支持非常差,但是经过试验,至少现阶段用dnspod解析的域名还没碰到问题。

二、在云主机上安装nginx服务器,配置好最基本的80口ngnix站点

例如,假设为demo.mydomain.com快速配置一个最简单的nginx站点

  1. 安装nginx服务器
    yum install -y nginx
    
  2. 配置一个nginx站点
    mkdir /opt/www/demo.mydomain.com -p
    chown nginx:nginx /opt/www/demo.mydomain.com/ -R
    vi /etc/nginx/conf.d/demo.mydomain.com.conf
    

    将以下内容复制到该文件中

    server {
    listen 80;
    server_name demo.mydomain.com;
    charset utf-8;
    
    root /opt/www/demo.mydomain.com;
    index index.html index.htm;
    
    access_log  /var/log/nginx/demo.mydomain.com_access.log;
    error_log   /var/log/nginx/demo.mydomain.com_error.log;
    }
    
  3. 启动nginx服务
    systemctl start nginx
    

    注意:要确认CentOS服务器开放80口及443端口

  4. 在浏览器上确认访问到http://demo.mydomain.com 如果没有页面的话,正常情况下应该会显示403错误。nginx站点配置完成。

三、安装certbot工具

yum install -y epel-release
yum install -y certbot

四、使用certbot命令初次申请证书

# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
certbot certonly --webroot -w /opt/www/demo.mydomain.com -d demo.mydomain.com -m myname@gmail.com --agree-tos

注意:联系人email地址要填写真实有效的,letsencrypt会在证书在过期以前发送预告的通知邮件。 申请成功后,会显示以下Congratulations信息

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/[xxx.xxx.xxx]/fullchain.pem. Your cert will
   expire on 2017-03-20. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - 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

证书的保存位置在:

/etc/letsencrypt/live/demo.mydomain.com/

用户证书 		                             cert.pem -> ../../archive/demo.mydomain.com/cert1.pem
中间证书 		                             chain.pem -> ../../archive/demo.mydomain.com/chain1.pem
证书链, chain.pem + cert.pem	fullchain.pem -> ../../archive/demo.mydomain.com/fullchain1.pem
证书私钥 		                             privkey.pem -> ../../archive/demo.mydomain.com/privkey1.pem

五、查看证书有效期的命令

openssl x509 -noout -dates -in /etc/letsencrypt/live/[demo.mydomain.com]/cert.pem

显示的是格林威治时间,不知道怎么才能显示当前时区。

六、设置定时任务自动更新证书

letsencrypt证书的有效期是90天,但是可以用脚本去更新。

# 更新证书
certbot renew --dry-run
# 如果不需要返回的信息,可以用静默方式
certbot renew --quiet

注意:更新证书时候网站必须是能访问到的

# 可以使用crontab定时更新,例如:
# 每月1号5时执行执行一次更新,并重启nginx服务器
00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

七、应用实例:配置nginx使用证书开通https站点

  1. 生成Perfect Forward Security(PFS)键值
    mkdir /etc/ssl/private/ -p
    cd /etc/ssl/private/
    openssl dhparam 2048 -out dhparam.pem
    
    • Perfect Forward Security(PFS)是个什么东西,中文翻译成完美前向保密,一两句话也说不清楚,反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值,需要先执行生成的命令。
    • 生成的过程还挺花时间的,喝杯咖啡歇会儿吧。
  2. 配置nginx站点,例如/etc/nginx/conf.d/demo.mydomain.com.conf,样例内容如下:
    server {
    listen 80;
    server_name demo.mydomain.com;
    rewrite ^ https://$server_name$request_uri? permanent;
    }
    server {
      listen 443 ssl;
      server_name demo.mydomain.com;
    
      charset utf-8;
      root /opt/www/demo.mydomain.com;
      index index.html index.htm;
    
      access_log  /var/log/nginx/demo.mydomain.com_access.log;
      error_log  /var/log/nginx/demo.mydomain.com_error.log;
    
      # letsencrypt生成的文件
      ssl_certificate /etc/letsencrypt/live/demo.mydomain.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/demo.mydomain.com/privkey.pem;
    
      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:50m;
      ssl_session_tickets on;
    
      ssl_dhparam /etc/ssl/private/dhparam.pem;
    
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
      ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
      ssl_prefer_server_ciphers on;
    }
    
  3. 在浏览器打开http://demo.mydomain.com, 如果正常跳转到https://demo.mydomain.com,就算成功了。 如果是chrome浏览器,在地址栏点击小锁的图标,可以查看证书的详情

http://blog.csdn.net/andylau00j/article/details/54604415

免费SSL证书Let’s Encrypt安装使用教程:Apache和Nginx配置SSL

Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

Let’s Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft和Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let’s Encrypt安装简单,未来大规模采用可能性非常大。

Let’s Encrypt虽然还在测试当中,但是市场需求非常大,已经有非常多的朋友迫不及待地安装并用上了Let’s Encrypt。Let’s Encrypt向广大的网站提供免费SSL证书,不管是对于网站站长、互联网用户,还是对整个Web互联网,都是非常有利的,它有利于整个互联网的安全。

本篇文章就来为大家讲解一下如何获取Let’s Encrypt免费SSL证书,并附上Apache和Nginx的SSL证书配置方法。更多的免费SSL证书及SSL配置安装教程,可以看:

免费SSL证书Let’s Encrypt安装使用教程:Apache和Nginx配置方法

PS:20170208更新,感谢热心朋友的反馈,Let’s Encrypt官网推荐大家使用Certbot来安装,参考如下(详细图文过程:Aimer):

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
56
57
问题已经解决了,用的是Certbot,我把我的方法贴一下:
首先要说明一下几点:
1.存在一个已经建立的虚拟主机
2.我用的是oneinstack
3.Python的版本是2.7以下(如果是2.7以上SSL证书会自动安装,不用手动的)
4.使用Certbot脚本
————-分界线————————————–
过程:
1.去Certbot的官网找到与web环境相应的脚本(官网qi姐已经贴出来了)
2.按照官网的步骤来:(这是CentOS6 ,Nginx的脚本,不要直接复制哦,要按照自己的情况来)
# wget https://dl.eff.org/certbot-auto
# chmod a+x certbot-auto
$ ./certbot-auto
——————-分界线———————–
然后Python版本低于2.7的服务器就会出现问题了
Certbot会报错,代码如下:
Installing Python packages…
Installation succeeded.
/root/.local/share/letsencrypt/lib/python2.6/site-packages/cryptography/__init__.py:26: DeprecationWarning: Python 2.6 is no longer supported by the Python core team, please upgrade your Python. A future version of cryptography will drop support for Python 2.6
DeprecationWarning
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Failed to find apachectl in PATH: /usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
/root/.local/share/letsencrypt/lib/python2.6/site-packages/certbot/main.py:568: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
return e.message
Certbot doesn’t know how to automatically configure the web server on this system. However, it can still get a certificate for you. Please run “certbot-auto certonly” to do so. You’ll need to manually configure your web server to use the resulting certificate.
——————-分界线————————–
我们不用管它,因为他说了,你可以手动安装SSL,那我们就手动安装
——————-分界线——————————
输入命令:
# ./certbot-auto certonly
然后它依旧会报错,那我们依旧不管他
继续进行命令,因为我们是手动配置
——————–分界线——————————–
再输入上面的命令以后,会出现选项,一个是独立服务器,一个是web服务
我们选择1,web服务
它会要求我们输入email(可以不输入),那我们输入email
———————–分界线—————————–
接下来它会要求我们输入域名
输入域名
————————分界线—————————
然后它会要求我们给出域名所在的根目录
用的oneinstack的话就输入
/data/wwwroot/你的域名
————————-分界线———————–
返回如下代码,获得SSL 证书:
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/ex.acgbuster.com/fullchain.pem. Your cert
will expire on 2017-05-02. 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”
– If you like Certbot, please consider supporting our work by: 
 
Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF:
————————–分界线——————————-

一、 安装Let’s Encrypt免费SSL准备

1、Let’s Encrypt官网:

  • 1、官方网站:https://letsencrypt.org/
  • 2、项目主页:https://github.com/letsencrypt/letsencrypt

2、安装Let’s Encrypt脚本依赖环境:(这一部分可以跳过,因为官方提供的Let’s Encrypt脚本会自动检测并安装)


# Debian
apt-get install git

# CentOS 6
yum install centos-release-SCL && yum update
yum install python27
scl enable python27 bash
yum install python27-python-devel python27-python-setuptools python27-python-tools python27-python-virtualenv
yum install augeas-libs dialog gcc libffi-devel openssl-devel python-devel
yum install python-argparse

# CentOS 7
yum install -y git python27
yum install -y augeas-libs dialog gcc libffi-devel openssl-devel python-devel
yum install python-argparse

3、查看自己的VPS主机到底是安装了哪个操作系统版本,可以执行命令:cat /etc/issue 或者 cat /etc/redhat-release。

Let's Encrypt安装的操作系统

二、获取Let’s Encrypt免费SSL证书

1、获取Let’s Encrypt免费SSL证书很简单,你只需要执行以下命令,就会自动在你的VPS上生成SSL证书和私钥。


git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

2、经过部落测试,上述代码对于Debian系统支持最好,可以完成自动检测并安装相应的软件。如果你是使用其它的Linux系统,Redhat或CentOS 6可能需要配置EPEL软件源,Python需要2.7版本以上。

Let's Encrypt安装方法

3、执行上述命令后,会弹出对话框,同意用户协议。

Let's Encrypt同意用户协议

4、接着会提示让你关闭Nginx或者Apache。

Let's Encrypt关闭Nginx

5、Let’s Encrypt需要用到80和443端口,所以你需要关闭那些占用这两个端口的应用。

Let's Encrypt占用80端口

6、当你看以下内容时,就表明你的Let’s Encrypt免费SSL证书获取成功了。


IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/freehao123.org/fullchain.pem. Your cert will
   expire on 2016-03-09. To obtain a new version of the certificate in
   the future, simply run  again.
 - If like , please consider supporting our work by:

   Donating to ISRG / :   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

7、见下图:

Let's Encrypt获取SSL证书成功

三、利用脚本快速获取Let’s Encrypt SSL证书

1、嫌上面的麻烦,不妨来试试利用脚本快速获取Let’s Encrypt SSL证书,调用 acme_tiny.py 认证、获取、更新证书,不需要额外的依赖。

  • 1、项目主页:https://github.com/xdtianyu/scripts/tree/master/lets-encrypt

2、下载到本地:


wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
chmod +x letsencrypt.sh

Let's Encrypt下载脚本

3、配置文件。只需要修改 DOMAIN_KEY DOMAIN_DIR DOMAINS 为你自己的信息


ACCOUNT_KEY="letsencrypt-account.key"
DOMAIN_KEY="freehao123.com.key"
DOMAIN_DIR="/var/www/freehao123.com"
DOMAINS="DNS:freehao123.com,DNS:www.freehao123.com"

4、本脚本在Debian下运行正常,但是如果你使用的是CentOS,你还需要修改letsencrypt.sh中openssl.cnf的位置,先找到你的CentOS的openssl.cnf位置。然后打开letsencrypt.sh,将路径/etc/ssl/openssl.cnf替换为你的新路径,例如/etc/pki/tls/openssl.cnf。

PS:20151214更新,该脚本已经更新,现在不需要对CentOS的openssl.cnf进行修改了。感谢ty博主的提醒。

Let's Encrypt配置脚本

5、执行过程中会自动生成需要的 key 文件。运行:


./letsencrypt.sh letsencrypt.conf

6、注意需要已经绑定域名到 /var/www/www.freehao123.com 目录,即通过 http://freehao123.com https://www.freehao123.com 可以访问到 /var/www/freehao123.com目录,用于域名的验证。

Let's Encrypt生成证书

7、正常按照上面的操作即可成功获取到Let’s Encrypt SSL证书,不过经过部落测试最大的问题就是“DNS query timed out”,由于域名DNS解析的问题导致无法验证域名从而获取SSL证书不成功。


Traceback (most recent call last):
  File "/tmp/acme_tiny.py", line 198, in 
    main(sys.argv[1:])
  File "/tmp/acme_tiny.py", line 194, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
  File "/tmp/acme_tiny.py", line 149, in get_crt
    domain, challenge_status))
ValueError: hkh.freehao123.info challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'url': u'http://hkh.freehao123.info/.well-known/acme-challenge/sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'hostname': u'hkh.freehao123.info', u'addressUsed': u'', u'port': u'80', u'addressesResolved': None}],  u'https://acme-v01.api.letsencrypt.org/acme/challenge/5m1su6O5MmJYlGzCJnEUAnvhweAJwECBhEcvsQi5B2Q/1408863', u'token': u'sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'error': {u'type': u'urn:acme:error:connection', u'detail': u'DNS query timed out'}, u'type': u'http-01'}

8、经过对比发现,国内的DNSPOD阿里云DNSCloudXNS等都会出现Let’s Encrypt 验证域名超时的情况,国外的Namecheap DNS、Linode DNS、Domain.com DNS等都是没有问题。

Let's Encrypt遇到DNS超时

四、 Ngnix配置Let’s Encrypt免费SSL

1、注意查看你的Let’s Encrypt免费SSL证书保存位置,一般是在/etc/letsencrypt/live/freehao123.com这样的下面。

Let's Encrypt证书保存位置

2、fullchain.pem就是公钥,privkey.pem就是私钥。有了这两个文件我们就可以在Ngnix上配置SSL证书了。OneinStack一键工具在创建虚拟主机时可以选择为网站配置SSL。

Let's Encrypt一键配置SSL

3、如果有用OneinStack,那么最简单的方法就是用fullchain.pem和privkey.pem替代原来生成的CRT和Key文件,这样做的好处就可以保留Ngnix配置的SSL证书路径,只要简单修改引用的公钥和私钥即可。

Let's Encrypt替换原来的SSL

4、当然,为了后面的操作方便,我们建议保留Let’s Encrypt生成的SSL证书,直接在网站的配置中修改SSL证书引用路径。使用VPS主机创建网站时会为网站生成一个.conf文件。

Let's Encrypt主机配置文件

5、这个这个.conf文件,直接替换掉ssl_certificate和ssl_certificate路径即可,如下图:

Let's Encrypt修改代码

6、OneinStack的Nginx配置SSL证书代码示例:


server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/freehao123.org/fullchain.pem;//改动地方1
ssl_certificate_key /etc/letsencrypt/live/freehao123.org/privkey.pem;//改动地方2
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-SHA384:ECDHE-RSA-:ECDHE:!DES:!3DES:!MD5:!DSS:!PKS;
ssl_session_cache builtin:1000 shared:SSL:10m;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
server_name www.freehao123.org freehao123.org;
access_log /data/wwwlogs/www.freehao123.org_nginx.log combined;
index index.html index.htm index.php;
include /usr/local/nginx/conf/wordpress.conf;
root /data/wwwroot/www.freehao123.org;
if ($host != www.freehao123.org) {
    rewrite ^/(.*)$ $scheme://www.freehao123.org/$1 permanent;
    }
server {
listen 80;
server_name www.freehao123.org;
rewrite ^/(.*) https://$server_name/$1 permanent;
}

7、最后重启Nginx,打开浏览器就可以看到SSL证书已经成功配置好了。

Let's Encrypt配置成功

8、对于安装了LNMP的朋友,可以参考以下代码修改自己的Nginx配置。


server
{
listen 443 ssl;   //如果需要spdy也可以加上,lnmp1.2及其后版本都默认支持spdy,lnmp1.3 nginx 1.9.5以上版本默认支持http2
server_name www.freehao123.com;     //域名
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.freehao123.com;            //网站目录
ssl_certificate /etc/letsencrypt/live/www.freehao123.com/fullchain.pem;    //前面生成的证书
ssl_certificate_key /etc/letsencrypt/live/www.freehao123.com/privkey.pem;   //前面生成的密钥
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

include wordpress.conf;  //这个是伪静态
#error_page 404 /404.html;
location ~ [^/]\.php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;     //lnmp 1.0及之前版本替换为include fcgi.conf;
#include pathinfo.conf;
}

五、Apache配置Let’s Encrypt免费SSL

1、首先,我们需要对Apache的配置进行修改,打开 /usr/local/apache/conf/httpd.conf ,查找httpd-ssl将前面的#去掉,然后执行命令(注意将路径换你自己的):

  • cat >/usr/local/apache/conf/extra/httpd-ssl.conf<<EOF
    Listen 443
  • AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl .crl
  • SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
    SSLProxyCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
    SSLHonorCipherOrder on
  • SSLProtocol all -SSLv2 -SSLv3
    SSLProxyProtocol all -SSLv2 -SSLv3
    SSLPassPhraseDialog builtin
  • SSLSessionCache “shmcb:/usr/local/apache/logs/ssl_scache(512000)”
    SSLSessionCacheTimeout 300
  • SSLMutex “file:/usr/local/apache/logs/ssl_mutex”
    EOF

2、接着,在你创建的网站的Apache配置的最后</VirtualHost>下面添加上SSL部分的配置文件:

  • <VirtualHost *:443>
    DocumentRoot /home/wwwroot/www.freehao123.com   //网站目录
    ServerName www.freehao123.com:443   //域名
    ServerAdmin admin@freehao123.com      //邮箱
    ErrorLog “/home/wwwlogs/www.freehao123.com-error_log”   //错误日志
    CustomLog “/home/wwwlogs/www.freehao123.com-access_log” common    //访问日志
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www.freehao123.com/fullchain.pem   //之前生成的证书
    SSLCertificateKeyFile /etc/letsencrypt/live/www.freehao123.com/privkey.pem    //之前生成的密钥
    <Directory “/home/wwwroot/www.freehao123.com”>   //网站目录
    SetOutputFilter DEFLATE
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    DirectoryIndex index.html index.php
    </Directory>
    </VirtualHost>

3、最后就是重启Apache,然后打开浏览器就可以看到SSL证书配置成功了。

Let's Encrypt访问SSL成功

六、 Let’s Encrypt免费SSL证书续期

1、Let’s Encrypt免费SSL证书有效期是90天,也就是每三个月你就得续期一次。采用官方的方法获取到的免费SSL证书,你不需要更改Apache和Nginx配置代码,执行以下代码即可自动替换证书为新的(注意修改域名和邮箱):


./letsencrypt-auto certonly --renew-by-default --email freehao123@gmail.com -d freehao123.org -d www.freehao123.org

2、采用上面脚本快速获取Let’s Encrypt免费SSL证书的,在90天内再次执行命令即可:./letsencrypt.sh letsencrypt.conf。

Let's Encrypt证书续期

3、cron 定时任务。每个月自动更新一次证书,可以在脚本最后加入 service nginx reload等重新加载服务。


0 0 1 * * /etc/nginx/certs/letsencrypt.sh /etc/nginx/certs/letsencrypt.conf >> /var/log/lets-encrypt.log 2>&1

七、Let’s Encrypt免费SSL证书使用小结

1、Let’s Encrypt免费SSL证书获得方式比较简单,不管采用何种方式,只要能够得到证书和密钥,我们就可以在自己的服务器上配置好SSL。上面讲到了Apache和Nginx的配置方法,如果你有自己的虚拟主机面板,可以直接通过后台添加证书和私钥文件即可。

Let's Encrypt各大浏览器支持

2、想要将Let’s Encrypt SSL安装在DirectAdmin面板的朋友可以参考:DirectAdmin安装StartSSL免费SSL证书。Cpanel面板的朋友参考:Cpanel主机安装Godaddy SSL证书方法。使用Kloxo面板的朋友,可以参考:Kloxo搭建网站安装StartSSL免费SSL证书

ShadowsocksR一键安装脚本

本脚本适用环境:
系统支持:CentOS,Debian,Ubuntu
内存要求:≥128M
日期:2017 年 07 月 27 日

关于本脚本:
一键安装 ShadowsocksR 服务端。
请下载与之配套的客户端程序来连接。
(以下客户端只有 Windows 客户端和 Python 版客户端可以使用 SSR 新特性,其他原版客户端只能以兼容的方式连接 SSR 服务器)

默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,默认为 aes-256-cfb)
协议(Protocol):自己设定(如不设定,默认为 origin)
混淆(obfs):自己设定(如不设定,默认为 plain)

客户端下载:
Windows / OS X
Linux
Android / iOS
OpenWRT

使用方法:
使用root用户登录,运行以下命令:

wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh
chmod +x shadowsocksR.sh
./shadowsocksR.sh 2>&1 | tee shadowsocksR.log
安装完成后,脚本提示如下:

Congratulations, ShadowsocksR server install completed!
Your Server IP :your_server_ip
Your Server Port :your_server_port
Your Password :your_password
Your Protocol :your_protocol
Your obfs :your_obfs
Your Encryption Method:your_encryption_method

Welcome to visit:https://shadowsocks.be/9.html
Enjoy it!
卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocksR.sh uninstall
安装完成后即已后台启动 ShadowsocksR ,运行:

/etc/init.d/shadowsocks status
可以查看 ShadowsocksR 进程是否已经启动。
本脚本安装完成后,已将 ShadowsocksR 自动加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

配置文件路径:/etc/shadowsocks.json
日志文件路径:/var/log/shadowsocks.log
代码安装目录:/usr/local/shadowsocks

多用户配置示例:

{
“server”:”0.0.0.0″,
“server_ipv6”: “[::]”,
“local_address”:”127.0.0.1″,
“local_port”:1080,
“port_password”:{
“8989”:”password1″,
“8990”:”password2″,
“8991”:”password3″
},
“timeout”:300,
“method”:”aes-256-cfb”,
“protocol”: “origin”,
“protocol_param”: “”,
“obfs”: “plain”,
“obfs_param”: “”,
“redirect”: “”,
“dns_ipv6”: false,
“fast_open”: false,
“workers”: 1
}
如果你想修改配置文件,请参考:
https://github.com/breakwa11/shadowsocks-rss/wiki/Server-Setup
https://github.com/breakwa11/shadowsocks-rss/blob/master/ssr.md
https://github.com/breakwa11/shadowsocks-rss/wiki/config.json

更新日志:
2017 年 07 月 27 日:
1、新增:可选协议(protocol)auth_chain_b 。使用该协议需更新到最新版(4.7.0)ShadowsocksR 版客户端;
2、修改:更新 ShadowsocksR 源码下载地址。

2017 年 07 月 22 日:
1、新增:安装时可选 13 种加密方式的其中之一(none 是不加密)。如下所示:

none
aes-256-cfb
aes-192-cfb
aes-128-cfb
aes-256-cfb8
aes-192-cfb8
aes-128-cfb8
aes-256-ctr
aes-192-ctr
aes-128-ctr
chacha20-ietf
chacha20
rc4-md5
rc4-md5-6
2、新增:安装时可选 7 种协议(protocol)的其中之一。如下所示:

origin
verify_deflate
auth_sha1_v4
auth_sha1_v4_compatible
auth_aes128_md5
auth_aes128_sha1
auth_chain_a
auth_chain_b
3、新增:安装时可选 9 种混淆(obfs)的其中之一。如下所示:

plain
http_simple
http_simple_compatible
http_post
http_post_compatible
tls1.2_ticket_auth
tls1.2_ticket_auth_compatible
tls1.2_ticket_fastauth
tls1.2_ticket_fastauth_compatible
2016 年 08 月 13 日:
1、新增多用户配置示例。注意:如果你新增了端口,也要将该端口从防火墙(iptables 或 firewalld)中打开。

2016 年 05 月 12 日:
1、新增在 CentOS 下的防火墙规则设置。
windows工具
https://github.com/shadowsocksr-backup/shadowsocksr-csharp

tar jxvf是什么指令

tar jxvf 是解压指今
解压以bzip2压缩的文件

-j 解压命令(*.bz)
-x  释放
-v 释放时的信息
-f  指定解压文件

看看下面这些
           tar -cvf a.tar a                  创建文件a的tar包

           tar -tvf a.tar                     查看tar包包含的文件

           tar -xvf a.tar                     释放tar包文件

           tar -rvf a.tar b                   追加文件b到tar包a.tar

           tar -Avf a.tar c.tar            追加c.tar包到a.tar包 

           tar -zcvf a.tar.gz a            创建文件a的gzip压缩的tar包 

           tar -ztvf a.tar.gz               查看文件a的tar压缩包内容               

           tar -zxvf aa.tar.gz             释放aa.tar.gz包的内容

           tar -jcvf aa.tar.bz2 aa        创建文件a的bzip压缩的tar包 

           tar -jtvf aa.tar.bz2             查看文件a的tar压缩包内容

           tar -jxvf aa.tar.bz2             释放aa.tar.bz2包的内

lnmp1.3-full安装包安装lnmp环境,如何安装PHP扩展

1. 如果已经安装LNMP套件,请按以下步骤处理

a. 跳转到fileinfo源代码目录` cd /root/downloads/lnmp1.2-full/src/php-7.0.7/ext/fileinfo/`  (里面全是压缩包,可以先解压你想要安装的扩展所对应的php版本)
b. 执行 `/usr/local/php/bin/phpize`
c. 执行 `./configure –with-php-config=/usr/local/php/bin/php-config`
d. 执行 `make && make install`
e. 修改php.ini文件 `vi /usr/local/php/etc/php.ini` 在末尾增加`extension = fileinfo.so`即可
f. 重启php-fpm ,`/etc/init.d/php-fpm reload`(service php-fpm restart)

————————————————————————————————————————————–

近期在开发新项目时,需要使用到上传文件功能。我使用的上传附件管理是第三方的库laravel-stapler,使用也是挺方便的。但是因为线上服务器使用的是lnmp安装套件,在正式使用时会出现fileinfo插件不可用的问题,这是因为lnmp套件下安装php 5.6.9时默认不开放fileinfo支持。这里可以用以下两种方法解决:

1. 如果尚未安装lnmp套件,请按以下步骤处理。

a. 打开`cd /root/downloads/lnmp1.2-full/include/php.sh`文件,路径请参考自己安装的路径。
b. 找到函数`Install_PHP_56()`,然后修改编译选项`–disable-fileinfo`,将这里修改为`–enable-fileinfo`
c. 执行安装过程

2. 如果已经安装LNMP套件,请按以下步骤处理

a. 跳转到fileinfo源代码目录` cd /root/downloads/lnmp1.2-full/src/php-5.6.9/ext/fileinfo/`
b. 执行 `/usr/local/php/bin/phpize`
c. 执行 `./configure –with-php-config=/usr/local/php/bin/php-config`
d. 执行 `make && make install`
e. 修改php.ini文件 `vi /usr/local/php/etc/php.ini` 在末尾增加`extension = fileinfo.so`即可
f. 重启php-fpm ,`/etc/init.d/php-fpm reload`

采用以上两个步骤均可解决fileinfo扩展不存在的问题,也可以自行手动编译安装。

作者:letonode
链接:http://www.jianshu.com/p/17e3abcce44a
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分享4个网址二维码API接口

说明:把url=后面的网址改成你的,四种任选一。
http://pan.baidu.com/share/qrcode?w=150&h=150&url=http://goonls.com
http://b.bshare.cn/barCode?site=weixin&url=http://goonls.com
http://s.jiathis.com/qrcode.php?url=http://goonls.com
http://www.kuaizhan.com/common/encode-png?large=true&data=http://goonls.com
说明:下面是EMLOG程序专用的,把代码复制到EMLOG模板echo_log.php你需要的位置即可。
http://b.bshare.cn/barCode?site=weixin&url=<?php echo Url::log($logid);?>
http://s.jiathis.com/qrcode.php?url=<?php echo Url::log($logid);?>

xampp 配置多个虚拟站点

在xampp环境中,为了更方便的管理我们的多个项目,就需要我们通过配置相关文件来设置多个虚拟站点,下面我们就一起来看看这些虚拟站点是怎么配置出来的吧!

工具/原料

  • xampp虚拟环境
  • hosts文件
  • httpd-vhosts.conf 文件
  • httpd.conf 文件

方法/步骤

  1. 1

    首先安装xampp环境(这里就不详细介绍了,非常简单),在浏览器地址栏中输入:localhost 能正常访问,如下图所示:

  2. 2

    在电脑中找到hosts文件,路径为:C:/WINDOWS/system32/drivers/etc/hosts  将hosts文件中对应 127.0.0.1 加入你要设置的域名,如下图:

  3. 3

    找到xampp的安装目录,并按照路径:xampp\apache\conf\httpd.conf 找到httpd.conf 文件,并在文件中找到 Include conf/extra/httpd-vhosts.conf 确认前面没有加# 如下图:

  4. 4

    按照路径:xampp\apache\conf\extra\httpd-vhosts.conf 找到httpd-vhosts.conf 文件并在此文件末尾添加内容:

    <VirtualHost *:80>DocumentRoot “C:/xampp/htdocs/thinkphp”ServerName www.tp.com</VirtualHost>

    如下图所示:

  5. 5

    通过以上设置,在浏览器地址栏中输入:www.tp.com 就能看到配置的虚拟目录成功了,如下图:

    END

注意事项

  • hosts文件为系统文件,有时候修改后可能不能保存,需要参考对应系统下修改hosts文件教程
  • 配置多个站点可以掠过httpd.conf 文件只需要配置hosts和httpd-vhosts.conf 两个文件

Nginx的https配置记录以及http强制跳转到https的方法梳理 ssl

一、Nginx安装(略)
安装的时候需要注意加上 –with-http_ssl_module,因为http_ssl_module不属于Nginx的基本模块。
Nginx安装方法:

1
2
# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# make && make install

二、生成证书(略)
可以使用openssl生成证书:
可参考:http://www.cnblogs.com/kevingrace/p/5865501.html
比如生成如下两个证书文件(假设存放路径为/usr/local/nginx/cert/):
wangshibo.crt
wangshibo.key

三、修改Nginx配置
server {
          listen 443;
          server_name www.wangshibo.com;
          root /var/www/vhosts/www.wangshibo.com/httpdocs/main/;

ssl on;
          ssl_certificate /usr/local/nginx/cert/wangshibo.crt;
          ssl_certificate_key /usr/local/nginx/cert/wangshibo.key;
          ssl_session_timeout 5m;
          ssl_protocols SSLv2 SSLv3 TLSv1;
          ssl_ciphers HIGH:!aNULL:!MD5;                                            //或者是ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
          ssl_prefer_server_ciphers on;

access_log /var/www/vhosts/www.wangshibo.com/logs/clickstream_ssl.log main;
          error_log /var/www/vhosts/www.wangshibo.com/logs/clickstream_error_ssl.log;

if ($remote_addr !~ ^(124.165.97.144|133.110.186.128|133.110.186.88)) {           //对访问的来源ip做白名单限制
                rewrite ^.*$ /maintence.php last;
         }

location ~ \.php$ {
              fastcgi_pass 127.0.0.1:9000;
              fastcgi_read_timeout 300;
              fastcgi_index index.php;
              fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
             #include fastcgi_params;
             include fastcgi.conf;
         }
}

———————————http访问强制跳转到https———————————
网站添加了https证书后,当http方式访问网站时就会报404错误,所以需要做http到https的强制跳转设置.

—————一、采用nginx的rewrite方法———————

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
1) 下面是将所有的http请求通过rewrite重写到https上。
    例如将所有的dev.wangshibo.com域名的http访问强制跳转到https。
    下面配置均可以实现:
配置1:
server {
    listen 80;
    server_name dev.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    
    rewrite ^(.*)$  https://$host$1 permanent;        //这是ngixn早前的写法,现在还可以使用。
 
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }
-------------------------------------------------------
上面的跳转配置rewrite ^(.*)$  https://$host$1 permanent;
也可以改为下面
rewrite ^/(.*)$ http://dev.wangshibo.com/$1 permanent;
或者
rewrite ^ http://dev.wangshibo.com$request_uri? permanent;
-------------------------------------------------------
配置2:
server {
    listen 80;
    server_name dev.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    return      301 https://$server_name$request_uri;      //这是nginx最新支持的写法
 
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }
配置3:这种方式适用于多域名的时候,即访问wangshibo.com的http也会强制跳转到https://dev.wangshibo.com上面
server {
    listen 80;
    server_name dev.wangshibo.com wangshibo.com *.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    
    if ($host ~* "^wangshibo.com$") {
    rewrite ^/(.*)$ https://dev.wangshibo.com/ permanent;
    }
 
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }
配置4:下面是最简单的一种配置
server {
    listen 80;
    server_name dev.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    
    if ($host = "dev.wangshibo.com") {
       rewrite ^/(.*)$ http://dev.wangshibo.com permanent;
    }
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }

—————二、采用nginx的497状态码———————

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
497 - normal request was sent to HTTPS 
解释:当网站只允许https访问时,当用http访问时nginx会报出497错误码
 
思路:
利用error_page命令将497状态码的链接重定向到https://dev.wangshibo.com这个域名上
配置实例:
如下访问dev.wangshibo.com或者wangshibo.com的http都会被强制跳转到https
server {
    listen 80;
    server_name dev.wangshibo.com wangshibo.com *.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    
    error_page 497  https://$host$uri?$args; 
 
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }
也可以将80和443的配置放在一起:
server { 
    listen       127.0.0.1:443;  #ssl端口 
    listen       127.0.0.1:80;   #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口 
    server_name  dev.wangshibo.com; 
    #为一个server{......}开启ssl支持 
    ssl                  on; 
    #指定PEM格式的证书文件  
    ssl_certificate      /etc/nginx/wangshibo.pem;  
    #指定PEM格式的私钥文件 
    ssl_certificate_key  /etc/nginx/wangshibo.key; 
      
    #让http请求重定向到https请求  
    error_page 497  https://$host$uri?$args; 
    location ~ / {
    root /var/www/html/8080;
    index index.html index.php index.htm;
    }
    }

—————三、利用meta的刷新作用将http跳转到https———————

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
上述的方法均会耗费服务器的资源,可以借鉴百度使用的方法:巧妙的利用meta的刷新作用,将http跳转到https
可以基于http://dev.wangshibo.com的虚拟主机路径下写一个index.html,内容就是http向https的跳转
将下面的内容追加到index.html首页文件内
[root@localhost ~]# cat /var/www/html/8080/index.html
<html> 
<meta http-equiv="refresh" content="0;url=https://dev.wangshibo.com/"
</html>
[root@localhost ~]# cat /usr/local/nginx/conf/vhosts/test.conf
server {
    listen 80;
    server_name dev.wangshibo.com wangshibo.com *.wangshibo.com;
    index index.html index.php index.htm;
  
    access_log  /usr/local/nginx/logs/8080-access.log main;
    error_log  /usr/local/nginx/logs/8080-error.log;
    
    #将404的页面重定向到https的首页 
    error_page  404 https://dev.wangshibo.com/;  
 
    location ~ / {
    root /var/www/html/8080;         
    index index.html index.php index.htm;
    }
    }

return 301 https://$server_name$request_uri; //这是nginx最新支持的写法
下面是nginx反代tomcat,并且http强制跳转至https。
访问http://zrx.wangshibo.com和访问http://172.29.34.33:8080/zrx/结果是一样的

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
[root@BJLX_34_33_V vhosts]# cat zrx.conf
server {
    listen 80;
    server_name zrx.wangshibo.com;
    index index.html index.php index.htm;
   
    access_log  logs/access.log;
    error_log   logs/error.log;
 
    return      301 https://$server_name$request_uri;     
    
    location ~ / {
    root /data/nginx/html;
    index index.html index.php index.htm;
    }
    }
[root@BJLX_34_33_V vhosts]# cat ssl-zrx.conf
upstream tomcat8 {
    server 172.29.34.33:8080 max_fails=3 fail_timeout=30s;
}
server {
   listen 443;
   server_name zrx.wangshibo.com;
   ssl on;
   ### SSL log files ###
   access_log logs/ssl-access.log;
   error_log logs/ssl-error.log;
### SSL cert files ###
   ssl_certificate ssl/wangshibo.cer;     
   ssl_certificate_key ssl/wangshibo.key;  
   ssl_session_timeout 5m;
   location / {
   proxy_pass http://tomcat8/zrx/;                                     
   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
   proxy_set_header Host $host;
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Forwarded-Proto https;
   proxy_redirect off;
}
}

—————四、通过proxy_redirec方式———————

1
2
3
解决办法:
# re-write redirects to http as to https, example: /home
proxy_redirect http:// https://;

http://www.cnblogs.com/kevingrace/p/6187072.html

js 定时弹出qq客服

var qq_chat = true;

function PlayJsAdPopWin() {

if (qq_chat) {

popwin = window.location.href = ‘tencent://message/?uin=200988027&Site=在线咨询&Menu=yes’

}

};

setTimeout(“PlayJsAdPopWin()”, 15000);