English |
  • 美国VPS主机推荐
  • |
  • 代购服务
  • |
  • 10美元以下VPS
  • |
  • VPS新手指南/教程
  • |
  • 留言板
  • |
  • 关于
  • | 登录 |

    免费SSL安全证书Let's Encrypt安装使用教程(附Nginx/Apache配置)

    2015年12月9日 上午 | 作者:VPS侦探

    letsencrypt

    Let's Encrypt是最近很火的一个免费SSL证书发行项目,Let's Encrypt是由ISRG提供的免费免费公益项目,自动化发行证书,但是证书只有90天的有效期。适合个人使用或者临时使用,不用再忍受自签发证书不受浏览器信赖的提示。前段时间一直是内测,现在已经开放了。本教程安装不需要停掉当前Web服务(Nginx/Apache),直接生成证书,废话不多说下面开始:

    目前已经更新为新工具certbot,使用教程:https://www.vpser.net/build/letsencrypt-certbot.html 配置文件和以前一样。
    建议使用git 以后有了新版更新方便,没安装的话Debian/Ubuntu:apt-get install git ,CentOS:yum install git-core
    git clone https://github.com/letsencrypt/letsencrypt.git
    cd letsencrypt

    不安装git的话:wget -c https://github.com/letsencrypt/letsencrypt/archive/master.zip && unzip master.zip && cd letsencrypt-master

    LNMP一键安装包都是Nginx/Apache默认支持ssl不需要另外单独编译,接下来先以LNMP一键安装包为例,LNMP用户可以直接参考此教程(LNMP v1.4自带此功能,可以直接使用lnmp ssl add (已经添加过该域名) 或lnmp vhost add (未添加过该域名)添加,1.3及之前用户可以升级到1.4,lnmp1.3升级1.4教程):

    执行:mkdir -p /home/wwwroot/域名/.well-known/acme-challenge 创建临时目录,当然这个.well-known/acme-challenge前面的目录要替换为你自己的网站目录,根据你自己的实际情况修改。

    正式开始生成证书

    接下来正式进行证书生成操作:
    ./letsencrypt-auto certonly --email 邮箱 -d 域名 --webroot -w /网站目录完整路径 --agree-tos
    如果多个域名可以加多个-d 域名,注意替换上面的邮箱、域名和网站目录,注意这里的网站目录完整路径只是你单纯的网站目录也就是虚拟主机配置文件里的,如Nginx虚拟主机配置里的root,Apache虚拟主机配置里的DocumentRoot。

    首先Let's Encrypt会检测系统安装一些依赖包,安装完依赖包会有蓝色的让阅读TOS的提示,Agree回车 稍等片刻就行了可添加--agree-tos参数屏蔽该窗口。
    生成证书后会有如下提示:

    IMPORTANT NOTES:
    - If you lose your account credentials, you can recover through
    e-mails sent to licess@vpser.net.
    - Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/www.vpser.net/fullchain.pem. Your cert will
    expire on 2016-03-07. To obtain a new version of the certificate in
    the future, simply run Let's Encrypt again.
    - Your account credentials have been saved in your Let's Encrypt
    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 Let's
    Encrypt so making regular backups of this folder is ideal.
    - If like Let's Encrypt, please consider supporting our work by:

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

    Nginx虚拟主机的设置

    接下来进行配置Nginx虚拟主机文件,LNMP模式下完整配置如下:

    server
    {
    listen 443 ssl;   #lnmp1.3+版本默认支持http2,可以加上http2,lnmp1.2版本默认支持spdy,可以加上spdy
    server_name www.vpser.net;     ##这里是你的域名
    index index.html index.htm index.php default.html default.htm default.php;
    root /home/wwwroot/www.vpser.net;            #网站目录
    ssl_certificate /etc/letsencrypt/live/www.vpser.net/fullchain.pem;    #前面生成的证书,改一下里面的域名就行
    ssl_certificate_key /etc/letsencrypt/live/www.vpser.net/privkey.pem;   #前面生成的密钥,改一下里面的域名就行
    SSLCertificateChainFile /etc/letsencrypt/live/www.vpser.net/chain.pem; #Apache 2.2版本需要加入该中间证书,否则浏览器可能不信任
    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
    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;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    }

    location ~ .*\.(js|css)?$
    {
    expires 12h;
    }

    access_log off;
    }

    需将上述配置根据自己的实际情况修改后,添加到虚拟主机配置文件最后面。

    添加完需要执行:/etc/init.d/nginx reload 重新载入配置使其生效。

    不要轻易添加HSTS,如果需要HSTS,可以加上add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 前面参数里的数值是秒。 开启后有效期内只能https访问而且所有二级域名也都是强制https,不确定的话不要开启。

    LNMPA模式下只需要在Nginx上设置,只需要将location ~ [^/]\.php(/|$) { 到下一个 } 的php解析部分替换为 include proxy-pass-php.conf; 即可。

    Apache虚拟主机上的设置

    LAMP模式按下面配置文件。Apache在生成证书后也需要修改一下apache的配置文件 /usr/local/apache/conf/httpd.conf ,查找httpd-ssl将前面的#去掉。

    然后再执行:

    Apache 2.2如下:
    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+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
    SSLProxyCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
    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"

    SSLStrictSNIVHostCheck on
    NameVirtualHost *:443
    EOF

    Apache 2.4如下:

    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+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
    SSLProxyCipherSuite EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5
    SSLHonorCipherOrder on

    SSLProtocol all -SSLv2 -SSLv3
    SSLProxyProtocol all -SSLv2 -SSLv3
    SSLPassPhraseDialog builtin

    SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
    SSLSessionCacheTimeout 300

    Mutex sysvsem default

    SSLStrictSNIVHostCheck on
    EOF

    并在对应apache虚拟主机配置文件的最后</VirtualHost>下面添加上SSL部分的配置文件:

    <VirtualHost *:443>
    DocumentRoot /home/wwwroot/www.vpser.net   #网站目录
    ServerName www.vpser.net:443   #域名
    ServerAdmin licess@vpser.net      #邮箱
    ErrorLog "/home/wwwlogs/www.vpser.net-error_log"   #错误日志
    CustomLog "/home/wwwlogs/www.vpser.net-access_log" common    #访问日志
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www.vpser.net/fullchain.pem   #改一下里面的域名就行
    SSLCertificateKeyFile /etc/letsencrypt/live/www.vpser.net/privkey.pem    #改一下里面的域名就行
    <Directory "/home/wwwroot/www.vpser.net">   #网站目录
    SetOutputFilter DEFLATE
    Options FollowSymLinks
    AllowOverride All
    Order allow,deny
    Allow from all
    DirectoryIndex index.html index.php
    </Directory>
    </VirtualHost>

    需将上述配置根据自己的实际情况修改后,添加到虚拟主机配置文件最后面。注意要重启apache使其实现。执行:/etc/init.d/httpd restart 重启Apache使其生效。

    下面说一下可能会遇到的问题:

    1、国内DNS服务商可能会不行,目前已知dnspod、cloudxns不行dnspod、cloudxns目前已经可以

    Namecheap、Route 53的都可以。

    2、Linode福利或IPv6用户福利

    可能目前Linode用户应该遇到了
    An unexpected error occurred:
    There were too many requests of a given type :: Error creating new registration :: Too many registrations from this IP
    Please see the logfiles in /var/log/letsencrypt for more details.
    这个不一定是因为IP注册的次数过多,可能是因为IPv6的事,具体解决方法如下:
    执行:sysctl -w net.ipv6.conf.all.disable_ipv6=1 来临时禁用IPv6
    再生成证书后执行:sysctl -w net.ipv6.conf.all.disable_ipv6=0 再来解除禁用IPv6

    3、如果启用了防火墙需要将443端口加入允许规则,一般iptables可以参考:https://www.vpser.net/security/linux-iptables.html

    4、如果LNMP下访问http://abc.com/.well-known/acme-challenge/**** 这个链接403的话是因为默认LNMP 1.3的虚拟主机里是禁止.开头的隐藏文件及目录的。需要将
    location ~ /\.
    {
    deny all;
    }
    这段配置删掉或注释掉或在这段配置前面加上

    location ~ /.well-known {
    allow all;
    }

    以上配置代码,然后重启nginx。

    证书续期

    最后要说的是续期,因为证书只有90天,所以建议60左右的时候进行一次续期,续期很简单可以交给crontab进行完成,执行:

    cat >/root/renew-ssl.sh<<EOF
    #!/bin/bash
    mkdir -p /网站目录完整路径/.well-known/acme-challenge
    /root/letsencrypt/letsencrypt-auto --renew-by-default certonly --email 邮箱 -d 域名 --webroot -w /网站目录完整路径 --agree-tos
    /etc/init.d/nginx reload
    EOF
    chmod +x /root/renew-ssl.sh

    注意要修改上面letsencrypt-auto的路径为你自己的,并且里面的邮箱和域名也要修改。
    再crontab里添加上:0 3 */60 * * /root/renew-ssl.sh 具体crontab教程点击查看

    2015.12.13更新
    官网更新了参数,对本文进行了部分参数的调整。原-a webroot --webroot-path=/网站目录完整路径替换为--webroot -w;--renew替换为--renew-by-default;增加--agree-tos参数。

    同时这里提醒一下如果设置了http 301跳到https的用户,再续期前还需要在nginx设置如下:
    80端口的虚拟主机上需要添加上,不加的话会无法验证的

    location /.well-known/ {
    add_header Content-Type 'text/plain;';
    root /网站目录完整路径;
    }

    附完整的nginx下301 http跳到https的配置:

    server
    {
    listen 80;
    server_name www.vpser.net;
    location /.well-known/ {
    add_header Content-Type 'text/plain;';
    root /网站目录完整路径;
    }
    location / {
    return 301 https://www.vpser.net$request_uri;
    }
    }

    目前就先说这些,有问题可以在本文章下部留言或到VPS论坛发帖。

    VPS侦探论坛邀请码:https://bbs.vpser.net/reg.php?invitecode=4957327b6f7rDwOe  有效期至:2015-12-13 14:34

    >>转载请注明出处:VPS侦探 本文链接地址:https://www.vpser.net/build/letsencrypt-free-ssl.html
    VPS侦探推荐:
    遨游主机VultrLinode搬瓦工LOCVPSKVMLAHOSTKVMHostXen80VPS美国VPS主机,国内推荐腾讯云阿里云
    欢迎加入VPS侦探论坛交流:https://bbs.vpser.net

    发表评论

    *必填

    *必填 (不会被公开)

    评论(70条评论)

    1. VPS侦探说道:

      @军哥666, 什么错误信息?服务器上端口是否已开,iptables是否加

    2. 军哥666说道:

      lnmp1.2 一步一步按照操作来的,最后也有成功的提示,把主机配置也改好了,可是就是打不开https的网页

      请问军哥这是怎么回事

    3. VPS侦探说道:

      @loren, spdy和http2都测试过没问题,不过现在基本上都是直接用http2,chrome的spdy也快要移除了

    4. VPS侦探说道:

      @军哥V5, 用什么域名就输什么的 多域名,对应不同目录 --webroot -w -w /网站目录完整路径1 -d 域名1 -w /网站目录完整路径2 -d 域名2 -w /网站目录完整路径3 -d 域名3 多域名同一目录使用同一证书 --webroot -w -w /网站目录完整路径 -d 域名1 -d 域名2 -d 域名3

    5. 军哥V5说道:

      这个如果添加多个域名 比如 xxx.com aaa.com 格式是怎样的?
      /root/letsencrypt/letsencrypt-auto --renew-by-default certonly --email 邮箱 -d 域名 --webroot -w /网站目录完整路径 -d 域名 --webroot -w /网站目录完整路径 这样么

    6. loren说道:

      军哥,HTTPS访问都没有问题了,Nginx的配置文件也添加了spdy,但是chrome始终显示没有启用,不知道为什么

    7. Godoword说道:

      OK,搞定。感谢军哥。

    8. VPS侦探说道:

      @Godoword, 你可以先把配置文件里的这几行 location ~ /\.
      {
      deny all;
      }
      先临时注释掉,reload或重启nginx

    9. Godoword说道:

      lnmp1.3在该主机下创建其他多级目录测试也都是正常的。似乎是.well-known带了个.的原因?死活就是403,应该怎么改呢,求教~

    10. Godoword说道:

      另外,测试在lnmp1.2下是正常的。

    11. Godoword说道:

      目录权限给了777,www:www,配置文件如下:

      server
      {
      listen 80;
      #listen [::]:80;
      server_name abcd.com;
      index index.html index.htm index.php default.html default.htm default.php;
      root /home/wwwroot/abcd.com;

      include typecho.conf;
      #error_page 404 /404.html;
      include enable-php.conf;

      location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
      {
      expires 30d;
      }

      location ~ .*\.(js|css)?$
      {
      expires 12h;
      }

      location ~ /\.
      {
      deny all;
      }

      access_log /home/wwwlogs/abcd.com.log access;

    12. VPS侦探说道:

      @Godoword, 检查一下目录权限,贴你的该nginx的主机配置文件看看

    13. Godoword说道:

      详细提示:

      Failed authorization procedure. abc.com (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: Invalid response from http://abc.com/.well-known/acme-challenge/eHBcivvEWDyupquFysopqj3zqm7x6vtqFY8lBjeZP6M [IP地址]: 403

    14. Godoword说道:

      lnmp1.3下提示.well-known/acme-challenge/不可访问,403,请问如何解决,谢谢。

    15. VPS侦探说道:

      @军哥V5, 将outbound1.letsencrypt.org
      outbound2.letsencrypt.org

      acme-staging.api.letsencrypt.org
      acme-v01.api.letsencrypt.org
      这几个域名对应的ip都加入iptables允许规则里试试

    16. 军哥V5说道:

      开启Firewall后,letsencrypt 不能正常申请SSL ,当然,设置任务计划也会失效。
      为了安全,觉得还是开启防火墙好,这个有什么解决办法不