博客

  • 世界,您好!

    欢迎使用 WordPress。这是您的第一篇文章。编辑或删除它,然后开始写作吧!

  • OneIndex:OneDrive网盘的目录列表程序

    [jetpack_subscription_form]

    简介

    OneIndex是一个可以将OneDrive网盘的目录索引出来的程序,可以供多人查看/下载,也就是变成了公共的网盘。不用服务器空间,不走服务器流量,直接列onedrive目录,文件直链下载。GitHub地址:https://github.com/donwa/oneindex

    demo

    https://xn.tn
    请输入图片描述

    特点

    • 响应式,支持小屏设备。
    • 图片在线预览。
    • 视频在线播放。
    • 代码在线查看(js、css、html、sh、php、java、md等)。
    • README.md支持,解析各目录下(onedirive目录下) README.md文件,在页面尾部展示。
    • 音频在线播放。
    • HEAD.md支持,在页面头部展示。
    • .password文件夹加密。

    需求

    • PHP空间,PHP 5.6+ 打开curl支持。
    • onedrive business账号 (企业版或教育版)。
    • oneindex程序:Github下载

    安装:

    1、复制oneindex到服务器,设置config/、config/base.php 、 cache/ 可读写
    2、浏览器访问、绑定账号
    3、可以使用

  • Caddy一键安装脚本——跨平台支持的极简 HTTP Server (自动申请HTTPS证书)

    前言

    Caddy是一个HTTP server,可以非常简单的安装(Go语言编写,二进制单文件),配置文件也很简单,同时还有一些有趣的扩展,可以非常方便的搭建一个HTTP服务

    脚本系统要求

    CentOS 6+ / Debian 6+ / Ubuntu 14.04 +
    推荐 Debian 7 x64

    安装步骤

    执行下面的代码安装 Caddy

    wget -N --no-check-certificate https://softs.loan/Bash/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh
    

    如果上面这个脚本无法下载,尝试使用备用下载:

    wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh
    

    如果想要安装其他扩展可以把名字加到命令后面,例如安装扩展:http.filemanager、http.git、http.filter

    那么就是: bash caddy_install.sh install http.filemanager,http.git,http.filter (扩展之间英文半角逗号分割)
    例如要安装filemanager扩展(在线文件管理器/私人网盘),则代码如下:

    wget -N --no-check-certificate https://softs.loan/Bash/caddy_install.sh && chmod +x caddy_install.sh && bash caddy_install.sh install http.filemanager
    

    扩展列表https://caddyserver.com/download

    使用说明

    安装完成后在/usr/local/caddy/目录下新建文件名为Caddyfile的配置文件,并写入配置

    启动:/etc/init.d/caddy start

    停止:/etc/init.d/caddy stop

    重启:/etc/init.d/caddy restart

    查看状态:/etc/init.d/caddy status

    查看Caddy启动日志: tail -f /tmp/caddy.log

    安装目录:/usr/local/caddy

    Caddy配置文件位置:/usr/local/caddy/Caddyfile

    Caddy自动申请SSL证书位置:/.caddy/acme/acme-v01.api.letsencrypt.org/sites/xxx.xxx(域名)/

    升级Caddy或者更新扩展

    只需要重新执行你当初安装时候用的命令即可,会覆盖安装最新的Caddy+扩展(如有)

    卸载Caddy

    卸载不会删除虚拟主机的内容,只会删除Caddy自身和配置文件。

    wget -N --no-check-certificate https://softs.loan/Bash/caddy_install.sh && bash caddy_install.sh uninstall
    

    如果上面这个脚本无法下载,尝试使用备用下载:

    wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh && bash caddy_install.sh uninstall
    

    原文地址:https://doub.io/shell-jc1/

  • 教你申请.tk/.ml/.cf/.gq/.ga等免费域名

    很多站长想要建站玩玩,为了降低建站成本,会去找各种免费域名和免费空间。但是百度上搜到的都是很坑的伪免费域名:二级域名。这样的二级域名(甚至三级)你没有最大的控制权。

    你需要申请顶级域名,就像doub.io就是顶级域名www.doub.io和abc.doub.io 都是二级域名!顶级域名理论可以无限添加二级域名

    所以我就为大家写一个这个教程!

    如果你觉得自带的域名DNS服务器不好用,可以看看这个:使用 CloudXNS 接管 Freenom 的免费域名解析,加快国内生效速度!


    检查域名是否被占用

    先打开域名注册网站:Freenom.com,然后在屏幕中间输入框输入你想要的域名比如:toyo233.ml,然后点击检查可用性

    再新页面里看到你想要的域名是否已被注册!

    购买免费域名

    选择你想要的域名,点击现在获取(如果都被注册了,请换一个)!可以加入购物车。

    然后点击完成。在确认页面,Period选项默认选的是3个月的,可以最高调到12个月,然后点击Continue继续下一步。

    然后会让你输入邮箱来获取注册链接,点击Verify My Email Address发送邮件。

    然后去你的邮箱点他发来的注册链接

    注册账号

    在页面填上你的资料,按照我的格式填写,记得勾选我已阅读并同意条款和条件。(这里是我翻译了一下页面,让你们看明白,实际是英文的。)

    国家请不要乱选,他会记录你的ip,一旦ip对应的国家和你填写的不一致就会不允许你注册购买!

    完成订单后就会给出订单号,然后点击下面的Click here to go to your Client Area按钮进入客户中心。

    登陆客户中心

    登陆用户名是你的注册邮箱。

    登陆后,点左上角Domains——My Domains进入我的域名。

    可以看到你购买的免费域名都是激活状态,点击后面的Manage Domain可以设置域名解析和DNS服务器。

    域名配置

    点击Manage Freenom DNS设置域名解析。

    Name中填写域名记录(比如@是toyo233.cfwww是www.toyo233.cf等等),Type(类型)根据主机空间商提供的方式选择(如果给你的是一个独立ip那就选A记录,如果是个ipv6的ip那就选AAAA记录,如果是一个共享IP或者域名那就选CNAME记录),在Target中填写主机空间商提供的IP或者域名,然后点击Save Changes保存。如果想要添加更多请点More Records按钮。

    如果你域名解析的地方搞不懂,可以看看这篇文章:使用 CloudXNS 接管 Freenom 的免费域名解析,加快国内生效速度!

    当然,如果你网站是面向国内用户的,我建议你使用国内的域名解析服务(比如Cloudxns什么的)

    Management Tools——Nameserver中可以更改DNS服务器,Use custom nameservers (enter below)是自定义DNS服务器,改完之后点Change Nameservers保存。(切记不要短时间内多次更换dns,容易导致一些解析问题!)

    Management Tools——URL Forwarding中也可以设置URL转发,建议选择301重定向。

    免费续订域名

    在域名到期前14天时,Freenom 就会给你发送邮件通知你域名快到期了,让你续费,当然域名续费也是免费的。

    首先我们登陆进去后台:https://my.freenom.com/ ,然后点击 Services – Renew Domains 后进入域名续订页面。

    在下图中我们会看到 我有一个域名剩余14天就到期了,点击域名右边的 Renew This Domain 按钮续订。

    然后我们就会进入该域名的续订页面,点击右边的列表框,选择要续订的时间(默认是 1个月,图中我选择了 12个月),最多12个月,免费。

    选择后就点击 Order Now >> 按钮结算,然后就会跳转到结算成功页面,这时候就续订成功了!


    好了,差不多就这样了。有什么问题请留言!

    如果你域名解析的地方搞不懂,可以使用 CloudXNS 接管 Freenom 的免费域名解析,加快国内生效速度!

    转载请超链接注明:逗比根据地 » 教你申请.tk/.ml/.cf/.gq/.ga等免费域名

  • 席慕容诗句

    浮华一生,淡忘一季。 空有回忆,打乱缠绵。 笑容不见,落寞万千。
    弦,思华年。 那些年华,恍然如梦。
    亦如,流水,一去不返。 不泣离别,不诉终殇。

  • 转载笔记:如何使用 Hexo 和 Pages 搭建这个博客

    一个博客的搭建过程分为三步:

    • 编写:包含内容的书写与格式的配置
    • 构建:从编写的原始内容生成可发布的最终内容
    • 发布:让待发布的内容对读者可见

    依托于博客平台(如博客园、新浪博客等)发布内容的用户只需要关注编写部分,但要搭建一个独立的个人博客则以上三方面都需要关心。幸运的是,现在有大量的工具帮助我们简化这个过程:丰富的 Markup 语言简化了编写;强大的静态站点生成器简化了构建;友好的托管平台简化了发布。

    这个博客的诞生也得益于这些工具:

    • 编写:使用 Markdown,内置大量层级、列表、超链接、代码等的简便语法支持
    • 构建:使用 Hexo,几条命令完成生成、预览、发布步骤
    • 发布:使用 GitHub Pages 进行托管,方便又免费

    接下来我会按以下顺序介绍如何基于这些工具完成整个博客的搭建过程:

    • 环境准备
    • Hexo 和 NexT 主题的使用
    • GitHub Pages 的配置与部署
    • 绑定自定义域名(可选)
    • Hexo 的详细配置过程

    环境准备

    常用 Hexo 命令

    • 初始化目录:hexo init [folder]
    • 新建文章:hexo new [layout] <title>hexo n [layout] <title>

      • 新建草稿:hexo new draft <title>

    • 将草稿发布为正式文章:hexo publish <title>
    • 生成静态文件:hexo generatehexo g

      • 监听文件变化:hexo g –watchhexo g -w

    • 部署:hexo deployhexo d

      • 先生成后部署:hexo d -g

    • 启动本地服务器(服务器会监听文件变化并自动更新):hexo serverhexo s

      • 启动调试:hexo s –debug
      • 预览草稿:hexo s –draft

    • 清除缓存:hexo clean

    使用 NexT 主题

    下载主题

    1
    2
    cd <your-hexo-site>
    git clone https://github.com/iissnan/hexo-theme-next themes/next

    启用主题

    编辑 _config.yml

    1
    theme: next

    设置语言

    编辑 _config.yml

    1
    language: zh-Hans

    查看是否生效

    1
    2
    3
    hexo clean
    hexo generate
    hexo server

    创建 GitHub Pages

    在自己的 GitHub 账号下创建名为 <username>.github.io 的项目即可。

    部署博客到 GitHub Pages

    设置 ssh 访问 GitHub 仓库

    • 生成 ssh key :ssh-keygen -t rsa -b 4096 -C "[email protected]"
    • 在 GitHub -> Settings -> SSH and GPG keys -> New SSH key 添加 ~/.ssh/id_rsa.pub 中的内容

    安装 git-deploy 插件

    1
    npm install hexo-deployer-git –save

    配置 git-deploy 插件

    编辑 _config.yml

    1
    2
    3
    4
    deploy:
    type: git
    repo: [email protected]:<username>/<username>.github.io.git
    branch: master

    部署

    1
    hexo d -g

    绑定自定义域名

    1. 在万网申请域名:https://wanwang.aliyun.com/

      • 其他可供选择的域名服务商:

        • GoDaddy:世界上最大的域名注册商,但续费比较贵
        • freenom:可以找到免费的域名,但都是很奇怪的后缀,比如.ml(感觉做机器学习的初创公司可以弄来玩玩,反正不要钱wwww)
        • 不同域名服务商的详细对比(主要是价格):Domain Name Price and Availability

    2. 注册 DNSPOD:https://www.dnspod.cn

    3. 在 DNSPOD 的控制台选择:域名解析 -> 全部域名 -> 添加域名,将在万网申请到的域名填入

    4. 在万网的域名控制台的相应域名依次选择:管理 -> 基本信息 -> 修改 DNS,将 DNS 修改为 DNSPOD 的 DNS:f1g1ns1.dnspod.netf1g1ns2.dnspod.net

    5. 在 DNSPOD 的控制台选择相应域名并添加记录,主机记录使用 "@",记录类型选择 "CNAME",记录值使用 "<username>.github.io",保存

    6. 在 Hexo 中绑定域名:

      1
      2
      3
      [create/edit source/CNAME]
      <your-domain-name>
      [end]

    7. 重新部署,并等待 DNS 生效

    如果需要绑定多个域名,可以将 GitHub Pages 绑定到其中一个域名,并把其他域名重定向到该域名。在 DNSPOD 中,这可以通过在需要重定向的域名中添加类型为"显性URL"的记录实现。具体请参考"隐/显性转发"和"DNSPod 支持域名301重定向吗?"。

    配置 Hexo

    设置头像

    编辑 _config.yml

    1
    avatar: <avatar-url>

    添加标签页面

    • 新建页面:

      1
      hexo new page tags

    • 设置页面(编辑 source/tags/index.md):

      1
      2
      3
      4

      type: “tags”
      comments: false

    • 修改菜单(编辑 themes/next/_config.yml):

      1
      2
      menu:
      tags: /tags

    添加分类页面

    • 新建页面:

      1
      hexo new page categories

    • 设置页面(编辑 source/categories/index.md):

      1
      2
      3
      4

      type: “categories”
      comments: false

    • 修改菜单(编辑 themes/next/_config.yml):

      1
      2
      menu:
      tags: /categories

    添加 about 页面

    • 新建页面:

      1
      hexo new page about

    • 设置页面(编辑 source/about/index.md

    • 修改菜单(编辑 themes/next/_config.yml):

      1
      2
      menu:
      about: /about

    首页文章显示摘要

    在文章中适当位置插入 <!–more–>,该位置之前的部分即为摘要,会显示在首页中。

    显示文章更新时间

    编辑 themes/next/_config.yml

    1
    2
    3
    # Post meta display settings
    post_meta:
    updated_at: true

    文章更新时间默认使用文件的修改时间,如果想自己指定,可以在文章的 Front-matter (即文件最上方以 分隔的区域)中加入:

    1
    updated: <update-time>

    其中,<update-time> 的格式示例为 2017-04-11 16:29:50

    设置代码高亮

    编辑 themes/next/_config.yml

    1
    2
    3
    4
    # Available value:
    # normal | night | night eighties | night blue | night bright
    # https://github.com/chriskempson/tomorrow-theme
    highlight_theme: normal

    添加 Creative Commons 署名协议

    编辑 themes/next/_config.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # Declare license on posts
    # Creative Commons 4.0 International License.
    # http://creativecommons.org/
    # Available: by | by-nc | by-nc-nd | by-nc-sa | by-nd | by-sa | zero
    creative_commons: by

    post_copyright:
    enable: true
    license: CC BY 4.0
    license_url: http://creativecommons.org/licenses/by/4.0/

    添加评论系统

    使用 Disqus 作为评论系统。需要注意的是,Disqus 已经被墙,所以不翻墙是看不到的,只能相信大家都是带着梯子来的了。。。

    编辑 themes/next/_config.yml

    1
    2
    3
    4
    5
    # Disqus
    disqus:
    enable: true
    shortname: <your-shortname>
    count: true

    也可以使用来必力代替 Disqus,编辑 themes/next/_config.yml

    1
    livere_uid: <your-uid>

    侧边栏社交链接

    编辑 themes/next/_config.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # Social links
    social:
    GitHub: https://github.com/your-user-name
    Twitter: https://twitter.com/your-user-name
    微博: http://weibo.com/your-user-name
    豆瓣: http://douban.com/people/your-user-name
    知乎: http://www.zhihu.com/people/your-user-name

    # Social Icons
    social_icons:
    enable: true
    # Icon Mappings
    GitHub: github
    Twitter: twitter
    微博: weibo

    开启打赏功能

    编辑 themes/next/_config.yml

    1
    2
    3
    reward_comment: 坚持原创技术分享,您的支持将鼓励我继续创作!
    wechatpay: /path/to/wechat-reward-image
    alipay: /path/to/alipay-reward-image

    腾讯公益404页面

    编辑 source/404.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!DOCTYPE HTML>
    <html>
    <head>
    <meta http-equiv=“content-type” content=“text/html;charset=utf-8;”/>
    <meta http-equiv=“X-UA-Compatible” content=“IE=edge,chrome=1” />
    <meta name=“robots” content=“all” />
    <meta name=“robots” content=“index,follow”/>
    <link rel=“stylesheet” type=“text/css” href=https://qzone.qq.com/gy/404/style/404style.css">
    </head>
    <body>
    <script type=“text/plain” src=http://www.qq.com/404/search_children.js"
    charset=“utf-8” homePageUrl=“/“
    homePageName=“回到我的主页”>
    </script>
    <script src=https://qzone.qq.com/gy/404/data.js" charset=“utf-8”></script>
    <script src=https://qzone.qq.com/gy/404/page.js" charset=“utf-8”></script>
    </body>
    </html>

    站点建立时间

    编辑 themes/next/_config.yml

    1
    since: 2017

    阅读次数统计

    使用不蒜子统计,编辑 themes/next/_config.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Show PV/UV of the website/page with busuanzi.
    # Get more information on http://ibruce.info/2015/04/04/busuanzi/
    busuanzi_count:
    # count values only if the other configs are false
    enable: true
    # custom uv span for the whole site
    site_uv: true
    site_uv_header: <i class=”fa fa-user”></i>
    site_uv_footer:
    # custom pv span for the whole site
    site_pv: true
    site_pv_header: <i class=”fa fa-eye”></i>
    site_pv_footer:
    # custom pv span for one page only
    page_pv: true
    page_pv_header: <i class=”fa fa-eye”></i>
    page_pv_footer:

    集成搜索服务

    使用本地搜索,按以下步骤配置:

    • 安装 hexo-generator-searchdb 插件:

      1
      npm install hexo-generator-searchdb –save

    • 编辑 _config.yml

      1
      2
      3
      4
      5
      search:
      path: search.xml
      field: post
      format: html
      limit: 10000

    • 编辑 themes/next/_config.yml

      1
      2
      3
      # Local search
      local_search:
      enable: true

    本地搜索的一个替代方案是 Algolia,按以下步骤配置:

    • 前往 Algolia 注册页面注册一个新账户。注册后的 14 天内拥有所有功能(包括收费类别的),之后若未续费会自动降级为免费账户,免费账户总共有 10,000 条记录,每月有 100,000 的可操作数。注册完成后,创建一个新的 Index。

    • 安装 hexo-algolia 插件(默认使用的 0.1.1 版本会出现问题,必须指定 0.2.0 版本):

      1
      npm install –save [email protected]

    • 在 Algolia 网站上找到需要使用的配置值,包括 ApplicationID、Search API Key、Admin API Key。

      编辑 _config.yml

      1
      2
      3
      4
      5
      algolia:
      applicationID: <application-id>
      apiKey: <search-api-key>
      indexName: <index-name>
      chunkSize: 5000

      由于 Admin API Key 需要保密保存,我们在一个单独的文件 _config.private.yml 中配置它:

      1
      2
      algolia:
      adminApiKey: <admin-api-key>

      如果使用了 Git 进行源码管理的话,在 .gitignore 中忽略 _config.private.yml_multiconfig.yml (这是在更新 Index 过程中合并 _config.yml_config.private.yml 的内容生成的文件,里面也包含 Admin API Key),防止 Admin API Key 被公开到 GitHub 等托管网站上。

    • 执行以下命令更新 Index:

      1
      hexo algolia –config _config.yml,_config.private.yml

      需要注意的是,在 3.3.1 版本的 Hexo 中,该命令会出现下列报错信息:

      1
      2
      21:15:11.652 ERROR Local hexo not found in C:\projects\archive\xxx
      11:15:11.654 ERROR Try running: 'npm install hexo –save'

      这是 Hexo 的 bug,具体请参考:

      该 bug 已在该 commit 中修复:Fix multiple config issue #2518 (#2520) · hexojs/[email protected],并在 3.3.5 版本中 release。

    • 编辑 themes/next/_config.yml

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # Algolia Search
      algolia_search:
      enable: true
      hits:
      per_page: 10
      labels:
      input_placeholder: Search for Posts
      hits_empty: “We didn’t find any results for the search: ${query}”
      hits_stats: “${hits} results found in ${time} ms”

    添加 sitemap 插件

    安装 hexo-generator-sitemap 插件:

    1
    npm install hexo-generator-sitemap –save

    配置(编辑 _config.yml):

    1
    2
    sitemap:
    path: sitemap.xml

    添加蜘蛛协议 robots.txt

    新建 source/robots.txt

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    User-agent: *
    Disallow: /CNAME
    Disallow: /README

    Allow: /
    Allow: /about/
    Allow: /archives/
    Allow: /categories/
    Allow: /tags/

    Allow: /css/
    Allow: /images/
    Allow: /js/
    Allow: /lib/

    Sitemap: <your-domain-name>/sitemap.xml

    设置 RSS

    安装 hexo-generator-feed 插件:

    1
    npm install hexo-generator-feed –save

    配置(编辑 _config.yml):

    1
    2
    3
    4
    5
    6
    feed:
    type: atom
    path: atom.xml
    limit: 20 # Maximum number of posts in the feed (Use 0 or false to show all posts)
    hub:
    content:

    添加脚注/上标/下标/缩写支持

    由于 Hexo 默认使用的 Markdown renderer 是 marked,它不支持脚注/上标/下标/缩写,我们可以使用 Markdown-it 替代 marked:

    1
    2
    npm un hexo-renderer-marked –save
    npm i hexo-renderer-markdown-it –save

    配置(编辑 _config.yml):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # Markdown-it config
    ## Docs: https://github.com/celsomiranda/hexo-renderer-markdown-it/wiki
    markdown:
    render:
    html: true
    xhtmlOut: false
    breaks: false
    linkify: true
    typographer: false
    quotes: ‘“”‘’’
    plugins:
    - markdown-it-abbr
    - markdown-it-footnote
    - markdown-it-ins
    - markdown-it-sub
    - markdown-it-sup
    anchors:
    level: 2
    collisionSuffix: ‘v’
    permalink: false
    permalinkClass: header-anchor
    permalinkSymbol:

    转载自:https://uchuhimo.me/2017/04/11/genesis/

    参考链接

  • Linux 下使用 acme.sh 和 NS 代管申请 Let’s Encrypt 免费通配符证书

    作者: @msg7086

    1、简介

    在《Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书》一文中,我们介绍了如何使用 acme.sh 生成 Let’s Encrypt 通配符证书,而 DNS 认证签发证书一直是一个麻烦事。例如需要将 API Key 甚至是账号密码与签发脚本保存在一起,会有潜在的安全隐患;有些 DNS 服务商不提供 API,只能每三个月手工修改等等。

    本文主要介绍了一种折衷的方法,将 ACME 认证域名单独托管至支持 API 的 DNS 服务商。即使 API Key 泄露,攻击者也无法篡改网站的其它 DNS 记录。

    2、选择一个 DNS 服务商

    2.1、CloudFlare

    CloudFlare 提供免费的 DNS 和 CDN 服务,无需认证即可开通

    • 价格:免费
    • API:有
    • API 安全性:中
    • 时效:高,5秒内生效
    • 推荐度:五星

    你可以在这个页面获取 API Key

    2.2、DigitalOcean

    DigitalOcean 是一家老牌云计算服务商,同时也提供免费的 DNS 托管服务。在其管理平台上可以随时生成或注销 API Key,以便于保护账号的安全。DigitalOcean 的免费 DNS 托管服务需要进行支付认证方可开通。绑定信用卡或 PayPal 即可完成支付认证。

    • 价格:免费
    • API:有
    • API 安全性:中
    • 时效:高,5秒内生效
    • 推荐度:五星

    你可以在这个页面获取 API Key

    2.3、Linode

    Linode 也是一家老牌云计算服务商,同时也提供免费的 DNS 托管服务。在其管理平台上可以随时生成或注销 API Key,以便于保护账号的安全。Linode 独特的子账号功能,可以为自己开设低权限的子账号,然后在子账号中生成 API,保护主账号下服务器等数据的安全。Linode 的免费 DNS 托管服务需要进行支付认证方可开通。

    值得注意的是,Linode DNS 的生效时间大约为 15 分钟,因此每次进行域名认证都要花费不少时间。

    • 价格:免费
    • API:有
    • API 安全性:高
    • 时效:低,15-20 分钟生效
    • 推荐度:四星

    你可以在这个页面获取 API Key

    2.4、OVH

    OVH 也是一家老牌云计算服务商,成立于1999年,在提供独立服务器和云计算服务的同时也提供免费的 DNS 托管服务。在其管理平台上可以随时生成 API Token,但是注销 API Token 相当繁琐。OVH 账号需要先通过身份验证才能添加域名解析,需要上传身份证件和地址证明,比较适合已经有账号的朋友使用。

    • 价格:免费
    • API:有
    • API 安全性:高
    • 时效:高
    • 推荐度:四星

    不推荐任何国内厂商,比如某 NS,某 Pod ,因为他们 DNS 服务器在国内,从而会容易导致 Let’s Encrypt 的认证服务器请求超时

    3、选择一个域名代管方法

    常用的域名代管包括 NS 代管和 CNAME 转发。无论如何,在 DNS 托管平台上,至少要有一个 NS 代管子域名。其他域名的认证纪录则可以用 CNAME 转发到这个代管域名上。

    4、示例

    本例采用的方法是 NS 代管一个任意子域名,然后利用 CNAME 转发 ACME 挑战子域名。

    你也可以选择直接将 ACME 挑战子域名用 NS 代管至其他域名托管服务,做法类似,不再赘述。

    本例假设你拥有两个域名 example.com 和 example.org,现在希望将 acme.example.com 转交由 DigitalOcean 域名托管服务代管,并将两个域名的 ACME 挑战子域名转发至这个子域名。

    4.1、设置 NS 代管

    我们以 DigitalOcean 为例

    1. 访问 DigitalOcean 的域名设置中心: https://cloud.digitalocean.com/networking/domains
    2. 添加域名 acme.example.com
    3. 访问你自己域名的设置中心
    4. 添加三条 NS 记录并等待其生效:
    NS acme.example.com ns1.digitalocean.com. 1800
    NS acme.example.com ns2.digitalocean.com. 1800
    NS acme.example.com ns3.digitalocean.com. 1800

    4.2、设置 CNAME 转发

    1. 访问你自己域名的设置中心
    2. 为每个要转发的域名添加 CNAME 转发记录并等待其生效:
    CNAME _acme-challenge.example.com acme.example.com. 1800
    CNAME _acme-challenge.example.org acme.example.com. 1800

    4.3、使用 acme.sh 申请 Let’s Encrypt 通配符证书

    先设定 API Key 变量为你自己申请的 API Key。

    export DO_API_KEY=blablablablabla 你的一长串 API Key 

    如需其他的 DNS ,请修改 DO_API_KEY 为对应的 API 名称,详见 acme.sh/dnsapi

    接着根据你的实际需要,执行以下命令,为这些域名签署证书。

    4 个域名在同一张证书:

    acme.sh --dns dns_dgon --issue -d example.com -d \*.example.com -d example.org -d \*.example.org --domain-alias @.acme.example.com

    如需其他的 DNS ,请修改 dns_dgo 为对应的 API 名称,详见 acme.sh/dnsapi

    2 个同根域名在同一张证书,共两张:

    acme.sh --dns dns_dgon --issue -d example.com -d \*.example.com --domain-alias @.acme.example.com
    acme.sh --dns dns_dgon --issue -d example.org -d \*.example.org --domain-alias @.acme.example.com

    不包含根域名,只包含通配符域名的证书,共两张:

    acme.sh --dns dns_dgon --issue -d \*.example.com --domain-alias @.acme.example.com
    acme.sh --dns dns_dgon --issue -d \*.example.org --domain-alias @.acme.example.com

    部署 SSL 证书方式请继续参考《Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书》

     

    原文地址:https://sb.sb/blog/linux-lets-encrypt-wildcard-ssl/

  • Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书

    1、什么是 SSL 证书?

    SSL 是保护用户数据和防止身份被盗用的最佳方式。拥有 SSL 证书的网站可以告诉用户,他们可以放心的浏览,SSL 可以保护他们的数据安全。不同的 SSL 证书提供不同级别的验证。了解更多 >

    目前比较火的适合个人用户的证书就是 Let’s Encrypt,这货是免费的,下面我们就介绍一下如何在 Linux 服务器上配置 SSL 证书

    2、使用 acme.sh 安装 Let’s Encrypt 证书

    Let’s Encrypt 提供很多方式,网上也有不少教程,但是都不方便操作,下面我们就介绍一款国人写的开源脚本 acme.sh

    首先,进入服务器后获取 acme.sh 脚本,此操作不一定需要 root 用户登陆

    使用 curl 方式获取,系统需要安装 curl 软件

    curl https://get.acme.sh | sh

    你也可以使用 wget 方式

    wget -O - https://get.acme.sh | sh

    更多安装方式请这儿

    因为这货的脚本服务器放在了 Google Cloud Platform,国内服务器操作偶尔会抽风,解决方法的话,要么挂代理,要么选择大半夜网络好的时候

    接着重新加载 Bash

    source ~/.bashrc

    输入 acme.sh --help 即可查看 acme.sh 的帮助命令

    root@sb-blog ~ # acme.sh --help
    https://github.com/Neilpang/acme.sh
    v2.7.8
    Usage: acme.sh  command ...[parameters]....
    Commands:
      --help, -h               Show this help message.
      --version, -v            Show version info.
      --install                Install acme.sh to your system.
      --uninstall              Uninstall acme.sh, and uninstall the cron job.
      --upgrade                Upgrade acme.sh to the latest code from https://github.com/Neilpang/acme.sh.
      --issue                  Issue a cert.
      --signcsr                Issue a cert from an existing csr.
      --deploy                 Deploy the cert to your server.
      --install-cert           Install the issued cert to apache/nginx or any other server.
      --renew, -r              Renew a cert.
      --renew-all              Renew all the certs.
      --revoke                 Revoke a cert.
      --remove                 Remove the cert from list of certs known to acme.sh.
      --list                   List all the certs.
      --showcsr                Show the content of a csr.
      --install-cronjob        Install the cron job to renew certs, you don't need to call this. The 'install' command can automatically install the cron job.
      --uninstall-cronjob      Uninstall the cron job. The 'uninstall' command can do this automatically.
      --cron                   Run cron job to renew all the certs.
      --toPkcs                 Export the certificate and key to a pfx file.
      --toPkcs8                Convert to pkcs8 format.
      --update-account         Update account info.
      --register-account       Register account key.
      --deactivate-account     Deactivate the account.
      --create-account-key     Create an account private key, professional use.
      --create-domain-key      Create an domain private key, professional use.
      --createCSR, -ccsr       Create CSR , professional use.
      --deactivate             Deactivate the domain authz, professional use.
    
    Parameters:
      --domain, -d   domain.tld         Specifies a domain, used to issue, renew or revoke etc.
      --challenge-alias domain.tld      The challenge domain alias for DNS alias mode: https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode
      --domain-alias domain.tld         The domain alias for DNS alias mode: https://github.com/Neilpang/acme.sh/wiki/DNS-alias-mode
      --force, -f                       Used to force to install or force to renew a cert immediately.
      --staging, --test                 Use staging server, just for test.
      --debug                           Output debug info.
      --output-insecure                 Output all the sensitive messages. By default all the credentials/sensitive messages are hidden from the output/debug/log for secure.
      --webroot, -w  /path/to/webroot   Specifies the web root folder for web root mode.
      --standalone                      Use standalone mode.
      --stateless                       Use stateless mode, see: https://github.com/Neilpang/acme.sh/wiki/Stateless-Mode
      --apache                          Use apache mode.
      --dns [dns_cf|dns_dp|dns_cx|/path/to/api/file]   Use dns mode or dns api.
      --dnssleep  [120]                  The time in seconds to wait for all the txt records to take effect in dns api mode. Default 120 seconds.
    
      --keylength, -k [2048]            Specifies the domain key length: 2048, 3072, 4096, 8192 or ec-256, ec-384.
      --accountkeylength, -ak [2048]    Specifies the account key length.
      --log    [/path/to/logfile]       Specifies the log file. The default is: "/root/.acme.sh/acme.sh.log" if you don't give a file path here.
      --log-level 1|2                   Specifies the log level, default is 1.
      --syslog [0|3|6|7]                Syslog level, 0: disable syslog, 3: error, 6: info, 7: debug.
    
      These parameters are to install the cert to nginx/apache or anyother server after issue/renew a cert:
    
      --cert-file                       After issue/renew, the cert will be copied to this path.
      --key-file                        After issue/renew, the key will be copied to this path.
      --ca-file                         After issue/renew, the intermediate cert will be copied to this path.
      --fullchain-file                  After issue/renew, the fullchain cert will be copied to this path.
    
      --reloadcmd "service nginx reload" After issue/renew, it's used to reload the server.
    
      --server SERVER                   ACME Directory Resource URI. (default: https://acme-v01.api.letsencrypt.org/directory)
      --accountconf                     Specifies a customized account config file.
      --home                            Specifies the home dir for acme.sh .
      --cert-home                       Specifies the home dir to save all the certs, only valid for '--install' command.
      --config-home                     Specifies the home dir to save all the configurations.
      --useragent                       Specifies the user agent string. it will be saved for future use too.
      --accountemail                    Specifies the account email, only valid for the '--install' and '--update-account' command.
      --accountkey                      Specifies the account key path, only valid for the '--install' command.
      --days                            Specifies the days to renew the cert when using '--issue' command. The max value is 60 days.
      --httpport                        Specifies the standalone listening port. Only valid if the server is behind a reverse proxy or load balancer.
      --local-address                   Specifies the standalone/tls server listening address, in case you have multiple ip addresses.
      --listraw                         Only used for '--list' command, list the certs in raw format.
      --stopRenewOnError, -se           Only valid for '--renew-all' command. Stop if one cert has error in renewal.
      --insecure                        Do not check the server certificate, in some devices, the api server's certificate may not be trusted.
      --ca-bundle                       Specifies the path to the CA certificate bundle to verify api server's certificate.
      --ca-path                         Specifies directory containing CA certificates in PEM format, used by wget or curl.
      --nocron                          Only valid for '--install' command, which means: do not install the default cron job. In this case, the certs will not be renewed automatically.
      --no-color                        Do not output color text.
      --ecc                             Specifies to use the ECC cert. Valid for '--install-cert', '--renew', '--revoke', '--toPkcs' and '--createCSR'
      --csr                             Specifies the input csr.
      --pre-hook                        Command to be run before obtaining any certificates.
      --post-hook                       Command to be run after attempting to obtain/renew certificates. No matter the obtain/renew is success or failed.
      --renew-hook                      Command to be run once for each successfully renewed certificate.
      --deploy-hook                     The hook file to deploy cert
      --ocsp-must-staple, --ocsp        Generate ocsp must Staple extension.
      --always-force-new-domain-key     Generate new domain key when renewal. Otherwise, the domain key is not changed by default.
      --auto-upgrade   [0|1]            Valid for '--upgrade' command, indicating whether to upgrade automatically in future.
      --listen-v4                       Force standalone/tls server to listen at ipv4.
      --listen-v6                       Force standalone/tls server to listen at ipv6.
      --openssl-bin                     Specifies a custom openssl bin location.
      --use-wget                        Force to use wget, if you have both curl and wget installed.

    然后可以执行 acme.sh --upgrade --auto-upgrade 获取 acme.sh 更新,并设置之后都自动更新 acme.sh 脚本

    3、获取 Let’s Encrypt 证书

    如果你本地没有装任何 Web 服务器软件,或者你的 Web 服务器软件并没有监听 TCP 80 端口,那么可以用 Standalone 方式直接获取多域名证书,注意以下操作必须使用 root 或 sudo 切换

    我们以 example.com / www.example.com / subdomain.example.com 这三个域名为例

    首先,你需要把这三个域名都解析到你的服务器 IPv4 上,并且确保你的服务器可以访问公网,无法访问公网的内网服务器是不行的

    另外,你也可以给 example.com 增加一个 CAA 记录为 0 issue "letsencrypt.org" 这样可以告诉 Let’s Encrypt 的 CA ,你授权给他们签发 SSL 证书

    acme.sh --issue --standalone -d example.com -d www.example.com -d subdomain.example.com

    通过这个方式,即可为 example.com www.example.com 和 subdomain.example.com 三个域名签发一张多域名证书

    但是一般情况下,我们都装了 Web 服务器,并且安装了 SSL 以后很多用户选择 http 跳转到 https,所以你需要确保 Let’s Encrypt 能访问 80 端口下的 /.well-known/acme-challenge 目录,我们以 Nginx 为例

    以下操作之前可以通过本站的教程安装 LEMP

    Debian 9 / Debian 8 使用源安装 LEMP 教程

    Ubuntu 16.04 / Ubuntu 14.04 使用源安装 LEMP 教程

    CentOS / RHEL 7 使用 EPEL 安装 LEMP 教程

    Linux 下编译安装最新版本 Nginx

    首先建立一个 /var/www/letsencrypt 目录

    mkdir -p /var/www/letsencrypt

    然后修改 /etc/nginx/sites-enabled/default 文件

    server {
    	listen 80 default_server;
    	listen [::]:80 default_server;
    	server_name _;
    
    	location /.well-known/acme-challenge {
    		root /var/www/letsencrypt;
    	}
    
    	location / {
    		return 301 https://$host$request_uri;
    	}
    }

    这段话的意思是,所有访问 80 端口的请求,都自动跳转到 https ,但是 /.well-known/acme-challenge 这个目录仍然可以通过 80 端口进行访问

    然后重启 Nginx

    nginx -t && nginx -s reload

    接下来给 example.com www.example.com 和 subdomain.example.com 三个域名签发一张多域名证书

    acme.sh --issue -d example.com -d www.example.com -d subdomain.example.com -w /var/www/letsencrypt

    如果没有问题,就会看到如下结果

    root@example ~ # acme.sh --issue -d example.com -d www.example.com -w /var/www/letsencrypt
    [Tue Mar 20 15:50:37 HKT 2018] Domains have changed.
    [Tue Mar 20 15:50:37 HKT 2018] Multi domain='DNS:example.com,DNS:www.example.com'
    [Tue Mar 20 15:50:37 HKT 2018] Getting domain auth token for each domain
    [Tue Mar 20 15:50:37 HKT 2018] Getting webroot for domain='example.com'
    [Tue Mar 20 15:50:37 HKT 2018] Getting new-authz for domain='example.com'
    [Tue Mar 20 15:50:38 HKT 2018] The new-authz request is ok.
    [Tue Mar 20 15:50:38 HKT 2018] Getting webroot for domain='www.example.com'
    [Tue Mar 20 15:50:38 HKT 2018] Getting new-authz for domain='www.example.com'
    [Tue Mar 20 15:50:39 HKT 2018] The new-authz request is ok.
    [Tue Mar 20 15:50:39 HKT 2018] example.com is already verified, skip http-01.
    [Tue Mar 20 15:50:39 HKT 2018] Verifying:www.example.com
    [Tue Mar 20 15:50:43 HKT 2018] Success
    [Tue Mar 20 15:50:43 HKT 2018] Verify finished, start to sign.
    [Tue Mar 20 15:50:44 HKT 2018] Cert success.
    -----BEGIN CERTIFICATE-----
    这里一长串就是证书文件输出
    -----END CERTIFICATE-----
    [Tue Mar 20 15:50:44 HKT 2018] Your cert is in  /root/.acme.sh/example.com/example.com.cer 
    [Tue Mar 20 15:50:44 HKT 2018] Your cert key is in  /root/.acme.sh/example.com/example.com.key 
    [Tue Mar 20 15:50:45 HKT 2018] The intermediate CA cert is in  /root/.acme.sh/example.com/ca.cer 
    [Tue Mar 20 15:50:45 HKT 2018] And the full chain certs is there:  /root/.acme.sh/example.com/fullchain.cer

    签发完成后,我们可以安装到 Nginx

    为了进后方便维护,我们建立一个 /etc/nginx/ssl 目录用来放证书

    mkdir -p /etc/nginx/ssl
    acme.sh --install-cert -d example.com \
    --key-file       /etc/nginx/ssl/example.com.key  \
    --fullchain-file /etc/nginx/ssl/example.com.crt \
    --reloadcmd     "service nginx force-reload"

    不管多域名证书里有几个域名,这里的 -d 参数只需要带第一个域名即可

    如果是 Apache 2.4.8 以上版本的话,可以使用这个命令

    acme.sh --install-cert -d example.com \
    --key-file       /etc/apache2/ssl/example.com.key  \
    --fullchain-file /etc/apache2/ssl/example.com.crt \
    --reloadcmd     "service apache2 force-reload"

    这样 SSL 证书就已经获取完毕并且加入了自动更新

    4、配置 Nginx 或 Apache

    这部分教程网站实在太多,本文不做一一描述,直接贴上我们推荐的配置文件

    4.1、Nginx 配置

    以下版本适用于 Nginx 1.10+ 默认开启了 HTTP/2.0 和 HSTS Preload 支持

    首先我们生成 DHE 参数文件,这货是迪菲-赫尔曼密钥交换,一种灰常强大的安全协议

    openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

    然后编辑 /etc/nginx/sites-enable/example.com.conf

    server {
    	listen 443 ssl http2 default_server;
    	listen [::]:443 ssl http2 default_server;
    
    	server_name example.com;
    
    	root /var/www/example.com;
    	index index.html index.htm index.php;
    
    # 我们采用强大的迪菲-赫尔曼密钥交换,生成命令 openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
    	ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    	ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    	ssl_prefer_server_ciphers on;
    
    	ssl_session_cache shared:SSL:50m;
    	ssl_session_timeout 1d;
    
    # 如果你 Nginx 配置了 SNI 即多个站点,多个证书,则需要用到如下配置,先生成文件 openssl rand 48 > /etc/nginx/ssl/session_ticket.key
    #	ssl_session_ticket_key     /etc/nginx/ssl/session_ticket.key;
    #	ssl_session_tickets        off;
    
    # 如果需要开启 OSCP 功能,则需要加入
    #	ssl_stapling               on;
    #	ssl_stapling_verify        on;
    # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
    #	resolver                   8.8.8.8 8.8.4.4 valid=300s;
    #	resolver_timeout           10s;
    
    # 此处是证书文件
    
    	ssl_certificate /etc/nginx/ssl/example.com.crt;
    	ssl_certificate_key /etc/nginx/ssl/example.com.key;
    
    # 开启 HSTS Preload 支持
    
    	add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"; 
    	add_header X-Frame-Options SAMEORIGIN;
    	add_header X-Content-Type-Options nosniff;
    	add_header X-XSS-Protection "1; mode=block";
    
    # 开启 PHP7.2-fpm 模式,如需要安装 PHP 7.1.x 请修改为 fastcgi_pass unix:/run/php/php7.1-fpm.sock;
    #	location ~ \.php$ {
    #	  include snippets/fastcgi-php.conf;
    #    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    #  }
    
    	access_log /var/log/nginx/example.com.access.log;
    	error_log /var/log/nginx/example.com.error.log;
    }

    注意 ssl_ciphers 的配置,这里贴的配置适合大多数的浏览器,最低浏览器支持是 Firefox 1, Chrome 1, IE 7, Opera 5, Safari 1, Windows XP IE8, Android 2.3, Java 7

    如果需要更老的浏览器支持,可以改成

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305: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:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:SEED:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!RSAPSK:!aDH:!aECDH:!EDH-DSS-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA:!SRP';
    ssl_prefer_server_ciphers on;

    此方案适合最低 IE6, Java 6 但是我们强烈不推荐,因为漏洞太多, SSLv3 目前已经基本被淘汰,参考 #1 #2

    当然如果需要激进一点,可以改成

    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
    ssl_prefer_server_ciphers on;

    此方案最低浏览器支持是 Firefox 27, Chrome 30, IE 11 on Windows 7, Edge, Opera 17, Safari 9, Android 5.0, and Java 8

    再激进一点的,就要用 TLSv1.3 了,坐等各种浏览器都支持吧

    然后检查配置并重启 Nginx

    nginx -t && nginx -s reload

    4.2、Apache 2.4 配置

    <VirtualHost *:80>
    
      ServerName example.com
      Redirect permanent / https://example.com/
    </VirtualHost>
    
    LoadModule headers_module modules/mod_headers.so
    
    <VirtualHost *:443>
    
        SSLEngine on
        SSLCertificateFile      /etc/apache2/ssl/example.com.crt
        SSLCertificateKeyFile   /etc/apache2/ssl/example.com.key
    
        # Uncomment the following directive when using client certificate authentication
        #SSLCACertificateFile    /path/to/ca_certs_for_client_authentication
    
    
        # HSTS (mod_headers is required) (15768000 seconds = 6 months)
        Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
        Header always set X-Frame-Options SAMEORIGIN
        Header always set X-Content-Type-Options nosniff
        Header set X-XSS-Protection "1; mode=block"
    </VirtualHost>
    
    # intermediate configuration, tweak to your needs
    SSLProtocol             all -SSLv3
    SSLCipherSuite          ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
    SSLHonorCipherOrder     on
    SSLCompression          off
    SSLSessionTickets       off
    
    # OCSP Stapling, only in httpd 2.3.3 and later
    # SSLUseStapling          on
    # SSLStaplingResponderTimeout 5
    # SSLStaplingReturnResponderErrors off
    # SSLStaplingCache        shmcb:/var/run/ocsp(128000)

    以上 Apache 2.4 的配置并不完整,需要你根据实际情况调整,更多服务器软件的 SSL 配置可以参考 Mozilla SSL Configuration Generator

    配置完成后重启 Apache 2.4

    service apache2 reload

    另外,开启了 HSTS Preload 后,可以去 HSTS Preload List Submission 检查并且提交你的网站,这样以后的各种浏览器就会把你的网址加入到 HSTS Preload List 访问 example.com 的时候就不需要额外去请求 80 端口了

    5、获取 Let’s Encrypt 通配符证书

    通配符证书,英文 Wildcard Certificate 国内黑话叫做野卡,经过一个月的跳票后,Let’s Encrypt 目前已经支持通配符的证书,同样 acme.sh 也是支持的,和多域名证书不同,通配符证书必须使用 DNS TXT 记录验证方式,我们以 example.com 和 *.example.com 为例

    acme.sh --issue -d example.com -d '*.example.com' --dns

    如果你的 DNS 提供商支持 API,你也可以直接使用 API 而不需要手工修改 TXT 记录,详细用法请见这里

    然后会看到如下的输出

    root@example ~ # acme.sh --issue -d example.com -d '*.example.com' --dns
    [Tue Mar 20 16:34:35 HKT 2018] Domains have changed.
    [Tue Mar 20 16:34:35 HKT 2018] Registering account
    [Tue Mar 20 16:34:36 HKT 2018] Registered
    [Tue Mar 20 16:34:36 HKT 2018] ACCOUNT_THUMBPRINT='blablablabla'
    [Tue Mar 20 16:34:36 HKT 2018] Multi domain='DNS:example.com,DNS:*.example.com'
    [Tue Mar 20 16:34:36 HKT 2018] Getting domain auth token for each domain
    [Tue Mar 20 16:34:38 HKT 2018] Getting webroot for domain='example.com'
    [Tue Mar 20 16:34:38 HKT 2018] Getting webroot for domain='*.example.com'
    [Tue Mar 20 16:34:38 HKT 2018] Add the following TXT record:
    [Tue Mar 20 16:34:38 HKT 2018] Domain: '_acme-challenge.example.com'
    [Tue Mar 20 16:34:38 HKT 2018] TXT value: 'blablablabla1'
    [Tue Mar 20 16:34:38 HKT 2018] Please be aware that you prepend _acme-challenge. before your domain
    [Tue Mar 20 16:34:38 HKT 2018] so the resulting subdomain will be: _acme-challenge.example.com
    [Tue Mar 20 16:34:38 HKT 2018] Add the following TXT record:
    [Tue Mar 20 16:34:38 HKT 2018] Domain: '_acme-challenge.example.com'
    [Tue Mar 20 16:34:38 HKT 2018] TXT value: 'blablablabla2'
    [Tue Mar 20 16:34:38 HKT 2018] Please be aware that you prepend _acme-challenge. before your domain
    [Tue Mar 20 16:34:38 HKT 2018] so the resulting subdomain will be: _acme-challenge.example.com
    [Tue Mar 20 16:34:38 HKT 2018] Please add the TXT records to the domains, and re-run with --renew.
    [Tue Mar 20 16:34:38 HKT 2018] Please add '--debug' or '--log' to check more details.
    [Tue Mar 20 16:34:38 HKT 2018] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh

    接着你需要给 _acme-challenge.example.com 增加两个 TXT 记录 "blablablabla1" 和 "blablablabla2",然后慢慢等 DNS 生效

    root@example ~ # dig TXT _acme-challenge.example.com @9.9.9.9 +short
    "blablablabla1"
    "blablablabla2"

    生效后给证书续一秒

    acme.sh --renew -d example.com -d '*.example.com'

    输出如下

    root@example ~ # acme.sh --renew -d example.com -d '*.example.com' --force
    [Tue Mar 20 16:41:25 HKT 2018] Renew: 'example.com'
    [Tue Mar 20 16:41:26 HKT 2018] Multi domain='DNS:example.com,DNS:*.example.com'
    [Tue Mar 20 16:41:26 HKT 2018] Getting domain auth token for each domain
    [Tue Mar 20 16:41:26 HKT 2018] Verifying:example.com
    [Tue Mar 20 16:41:29 HKT 2018] Success
    [Tue Mar 20 16:41:29 HKT 2018] Verifying:*.example.com
    [Tue Mar 20 16:41:32 HKT 2018] Success
    [Tue Mar 20 16:41:32 HKT 2018] Verify finished, start to sign.
    [Tue Mar 20 16:41:33 HKT 2018] Cert success.
    -----BEGIN CERTIFICATE-----
    这里是证书文件
    -----END CERTIFICATE-----
    [Tue Mar 20 16:41:33 HKT 2018] Your cert is in  /root/.acme.sh/example.com/example.com.cer 
    [Tue Mar 20 16:41:33 HKT 2018] Your cert key is in  /root/.acme.sh/example.com/example.com.key 
    [Tue Mar 20 16:41:33 HKT 2018] The intermediate CA cert is in  /root/.acme.sh/example.com/ca.cer 
    [Tue Mar 20 16:41:33 HKT 2018] And the full chain certs is there:  /root/.acme.sh/example.com/fullchain.cer 
    [Tue Mar 20 16:41:33 HKT 2018] It seems that you are using dns manual mode. please take care: The dns manual mode can not renew automatically, you must issue it again manually. You'd better use the other modes instead.
    [Tue Mar 20 16:41:33 HKT 2018] Call hook error.

    然后就可以参考上面的 Nginx 或 Apache 2.4 的配置,这里不再重复

    理论上按照本站的 Nginx 配置教程配置完成后, SSL Lab 得分都会在 A+,参考本站的得分,限于篇幅,我们之后会再介绍 Nginx 下 SSL 配置的更详细教程,如有疑问请随时进讨论

     

    原文地址:https://sb.sb/blog/linux-acme-sh-lets-encrypt-ssl/

    由原博客声明,本文遵守的协议为:https://sb.sb/license.txt

  • Windows上的程序员神器——Cmder

    前言
    在Windows系统上做开发,总是对其Terminal不满意。无论是CMD还是PowerShell,真是太丑了。现在安利大家一款神器,除了外观好看以外,功能也是强劲的狠。
    请输入图片描述

    特点

    • 便携,解压即可用
    • 自带git、ls、curl等命令
    • 可设置命令别名
    • 丰富的颜色主题(Solarized、Twilight、Ubuntu、xterm、Monokai,甚至接受自定)、可定制字体
    • 支持tab分页、同屏多端口(支持水平分割、垂直分割)
    • 支持自定terminal,无论是CMD、PowerShell、bash都可以,还可以注入环境变量

    请输入图片描述

    安装

    分别有mini(6MB)和full(84MD)版本,都是portable的,解压即可使用。

    占用空间又小,所以直接放在u盘、云盘(像Onedrive、iCloud)里也行,达到多台设备同步设置的效果(我是把设置导出到gist上,更改就手动更新)。

    • 解压,双击Cmder.exe运行。

    外观配置

    1、Font,右键Tab栏空白处,弹出菜单选择Settings,映入眼帘的就是字体设置了。建议使用字体Input Mono、Inconsolata、Consolas、Courier New。还可以加上中文字体,”Main font”设置下方的”Alternative font”添加CJK字体,在设置”Unicode ranges”成CJK的就好了。
    2、Color Schemes,同样是在Settings中,左侧树形菜单中选择Features->Colors,就能来到Scheme设置界面。Cmder自带的Scheme很丰富,也可以通过自定Scheme,应用网络上简洁好看的风格。Github | joonro/ConEmu-Color-Themes提供了当前流行的Scheme安装方式。
    3、Quake Style, 开启后,Cmder就变成了下拉式。按住” ctrl + "Cmder就从屏幕上方弹出,焦点转移就收回(可修改成再次按住" ctrl + “收回)。开启Quake Style之后极客感很强 !( •̀ ω •́ )!

    终端设置

    1、Default Terminal, 在Startup置项框里就可以更改默认终端,选择Special named task,在下拉菜单中选择适合自己的终端。什么?!找不到自己满意的,还以在Startup->Tasks中添加新的终端,及初始化脚本(用来执行一些命令,设置环境变量、命令别名、ssh等)。还可以为这些终端添加快捷键HotKey,方便快速打开。Startup->Environment,能在这里为所有Tasks作初始化设置。
    2、Split window,按住”ctrl + shift + e”水平分屏;按住”ctrl + shift + o”垂直分屏 (可以在热键设置中更改); 点击Tab bar上的[+],选择”New Console Dialog”,里有”New console split”选项,即可分屏出不同类型的Terminal了。
    3、Integration,在其中即可添加右键菜单项,推荐用”ConEmu Here”。按住”Register”即可添加,但以后删除Cmder之前一定要记得”Unregister”一下。
    4、HotKey,在Keys & Macro中即可,修改添加各种热键。在子设置项中,还可以更改复制方式。Cmder默认设置是左键划取文本后,就自动复制了,十分方便。

    VSCode集成终端

    什么Cmder还可以当作VSCode的集成终端!?!?不过有个小bug,已经有人提了issue咯,等bug解决我再向大家安利吧。

    Q&A

    1. 哪里可以看到详细的使用文档?

    右键Tab bar->Help->About/Help就可以看到咯。

    1. 命令别名不起作用怎么办?

    打开Windows里的Terminal,无论是CMD还是PowerShell都行。在其设置中勾选”使用旧版控制台”即可。相关issue:Aliases not working at all

    1. ls命令不支持中文

    在设置界面Startup->Environment中的文本框下加入set LANG=zh_CN.UTF-8 即可。 顺便把代码页切成utf-8的吧,会省心很多跟你讲。输入chcp 65001

    1. 想放弃Windows自带的Terminal怎么办?因为真是丑的受不了……

    在设置界面Integration->Default term中有”Force ConEmu as default terminal for console applications”的选项。勾选之前别忘了看向上方的警告信息。

    原文链接:https://zhuanlan.zhihu.com/p/28400466

  • Cloudflare CNAME/IP/NS高级接入使用教程——免费CDN 全球加速

    前言

    此教程中演示域名 swordstudio.net 使用 DNSPOD 作为 DNS 服务(当然,你也可以使用域名注册商的默认NS接入),同时使用Cloudflare 作为 CDN。本站免费CDN服务https://cdn.agint.me 使用开源面板,基于cloudflare partner,不存储用户cloudflare数据。

    注册与登录

    1、前往 https://cdn.agint.me,输入你的 Cloudflare.com 上的登录账号,进行登录(账号不存在会自动注册账号)。很抱歉,现在 Cloudflare 不支持 OAuth,我们所使用的方法也是 Cloudflare 官方唯一提供的 API。我们承诺不保存您的任何信息,并且传输使用全程 HTTPS。
    该网站支持中文和英文,会根据浏览器语言(大多数情况下就是系统语言)来选择语言。如果你想使用中文的,请调整系统语言为中文。
    请输入图片描述
    2、登陆后可以看到已经添加在 Cloudflare 的所有域名。
    请输入图片描述

    添加域名

    1、这里以添加域名,你需要点击面板中的 “添加域名”,进入如下页面。输入域名(只能输入主域名,不支持二级域名输入),点击提交:
    请输入图片描述

    2、之后进入管理界面,就可以看到这个域名了。
    请输入图片描述

    配置源站

    我们以 CNAME/IP 的接入方式作为演示,源站 IP 为 104.223.61.83,我们要为 cf.swordstudio.net 配置 Cloudflare CDN,并对所有用户启用 Cloudflare CDN。

    1、首先点击 “添加记录”
    请输入图片描述
    2、输入完基本信息后,点击”提交”。注意记录名仅填写子域名即可,不要填写完整域名。另外,想根域名使用CDN的请直接填写 @
    请输入图片描述

    3、之后就可以看到添加后的信息,分为CNAME/IP/NS三种接入方式

    请输入图片描述

    CNAME接入cloudflare CDN

    NS接入这种常规接入方式就不说了,这里以CNAME接入为例,CNAME接入方便,生效响应快,几分钟到十几分钟一般就可以生效(NS接入需要修改NS把域名挂到cloudflare才能使用CDN,全球生效时间为48小时),IP接入与CNAME接入类似

    1、打开DNSPOD解析界面(当然很多人用的是域名注册商的解析界面,使用类似),点击添加记录
    请输入图片描述

    2、主机记录和上面填的记录名相同,这里为cf,记录类型选CNAME,记录值填上面显示的CNAME 接入这一项显示的域名,这里为cf.swordstudio.net.cdn.cloudflare.net,填好以后,点击保存
    请输入图片描述

    3、以上完成以后,基本上几分钟之内就会生效,这时候ping一下添加的域名,这里为cf.swordstudio.net
    看看IP是不是变成cloudflare的IP了,并不是自己的源站ip。到这里CDN已经启用了,高级应用请看下面
    请输入图片描述

    分区/智能解析配置

    如果你使用的是 CNAME/IP 接入,那么你可以为域名配置分区解析。可以达到如下一个或几个效果:
    1、国内外分区解析:国内解析到源站/国内 CDN,海外解析到 Cloudflare CDN
    2、备用服务器:源站宕机,自动切换到 Cloudflare
    可以智能解析的DNS服务商有DNSPOD,CloudXNS,阿里云等

    以下以cf.swordstudio.net二级域名为例,根域名同理。
    如图设置,用户海外访问cf.swordstudio.net会使用cloudflare CDN的线路解析,其他用户访问默认为直接访问源站
    请输入图片描述