登录
  • 人们都希望被别人需要 却往往事与愿违
  • 郭敬明和唐骏的共同点是: 他们这类人越成功, 就说明我们这个社会越失败!

手动配置 Let’s Encrypt+Nginx/Apache, certonly, 解决 DialogError

Linux Benny 小土豆 10679 次浏览 7050 字 13 个评论
文章目录 [显示]
这篇文章在 2019 年 02 月 13 日 14:00:48 更新了哦~
警告:
国内的大部分服务器会拦截 80 端口的通信,所以在这种情况下,无论是用 webroot 还是 standalone 模式,都是不可能成功签发证书的(因为这俩本质上都是 http challenge)。
在这种情况下只能使用 DNS challenge 了,命令大致如下(renew 要稍微麻烦一些):
certbot certonly --manual --preferred-challenges dns
官网详的教程戳我

话说 Let's Encrypt 已经进入正式版了,咱就来说说怎么签发证书。本人呐,恰巧今日弄了个马甲站 www.shemissed.me, 还弄了几个子域名,于是乎就顺便也给弄了 Let's Encrypt 吧!

先声明下我的网站的结构,如果读者和我的建站结构一样,那么,跟着走就可以了!

使用 LNMP1.3 一键安装包,nginx 版本是 1.9.5

网站目录全部在 / home/wwwroot,其中包含三个子域名(不要管那个 default,是我懒得删除了)

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

通过

  1. lnmp vhost add

添加了三个子域名,配置为文件如下

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

关于子域名和二级域名的关系,其实子域名是个相对的概念,就像你是你爸爸的儿子,你儿子是你的儿子一样。而二级域名则是固定的概念,从右侧起第二个. 就算二级域名。
纯粹的说,www.shemissed.me 也是 shemissed.me 的子域名。
这里我就同一称作子域名啦!

要注意,Let's Encrypt 并不是泛域名证书(可以签.abc.com,就代表泛域名的意思啦)

现在 Let's Encrypt 已经支持泛域名证书啦,使用如下命令,推荐用 screen(0.22 以后版本):

  1. ./certbot-auto --server https://acme-v02.api.letsencrypt.org/directory -d *.example.com --manual --preferred-challenges dns-01 certonly

查询 TXT 记录

  1. dig txt example.com

 

准备 Let's Encrypt

这里有两种方法,一种是包管理器,一种的 repo

包管理器(Ubuntu 16.04)或者官方 PPA

  1. sudo apt install certbot

PPA

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot

使用 GitHub 的 repo

找个目录,执行下两句吧

  1. git clone https://github.com/certbot/certbot
  2. cd certbot

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

我该使用那种办法?这两种有何区别
包管理器中的 Let's Encrypt/certbot 版本比较旧。
当然啦,我个人选择 GitHub 上最新的,因为支持 wildcard 哟。
值得注意的是,低版本的并不会兼容高版本的!会出现错误的。

使用 Let's Encrypt 生成证书

无论使用那种方法,只需要执行 certonly 即可。
如果你是使用包管理器的,那么就

  1. letsencrypt certonly
  2. # or
  3. certbot certonly

如果你是使用 GitHub Repo 的,那就 cd 进对应的目录,然后执行

  1. ./certbot-auto certonly

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError
此后这两者的步骤是相同的了。
检测并安装环境…… 此时只需要等待等待……

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

很磕碜的界面是不是,PuTTY 就这熊样,xshell 就没这个问题了。要是有强迫症,就开个 screen,就没这么难看啦!

在这一步很多人选择第一项,包括我自己也曾这样尝试过,不知为何会报 "dialog error",各位如果失败了的话,就停掉 web 服务器,就果断选择 2 吧!

我这次讲解就直接从 2 来了,先停掉 web 服务器(以 Nginx 为例)

  1. service nginx stop

选择 2,回车

输入你的邮箱

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

接受许可条款

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

输入你的域名,这里我们先给 www.shemissed.me 签,所以就先输入这一个,要记得 www 哦(而且我并没有解析 @)

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

有人可能会问了,为什么我看到有的人的证书是 abc.com,但是域名却是 www.abc.com 呢?如图

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

其实,在输入域名这一块,你可以输入 abc.com,www.abc.com, 然后配置的时候直接选择 abc.com 的那个证书,就可以啦。
至于你想怎么选择,没有太大的安全考虑的情况下,那是随便滴!顺便提一句,这个叫做 DNS Name 啦……

回车确定就会提示 Congratulations 啦。

证书(fullchain.pem)和私钥(privkey.pem)已经给你放到了 / etc/letsencrypt/live/www.shemissed.me

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

修改 nginx 的配置文件

由于我是自行编译安装的,所以配置文件的路径在 / usr/local/nginx/conf

我们重点需要编辑的是 vhost 下的那个 www.shemissed.me.conf 的配置文件。

没有监听 443 端口,因此,我们就需要在这后面加入监听 443 的配置内容。

conf 目录下可以看到一个 enable-ssl-example.conf,都看到 example 了,还寻思啥呢,把这个 example 的内容全部复制到 www.shemissed.me.conf 最下面

之后我们只需要修改 server name, root, ssl_certificate, ssl_certificate_key, 并删掉下面多余的监听 80 的就可以了。我下面把我的完整的配置文件写出来供参考,# 后面的是注释。

默认的那个 example 其实我不太安全的,我根据自己的需求进行了一些更改,感谢落格博客

先生成迪菲 - 赫尔曼密钥 以增强安全

  1. openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

你所需要做的事情就是修改网站目录、域名、证书私钥路径,然后保存。最顺快的情况就是搜索替换 www.shemissed.me 为你的域名或者子域。(请注意此配置文件启用了 HTTP/2、自动跳转到 https,有 HSTS, X-Frame-Options, X-Xss-Protection, X-Content-Type-Options, Referrer-Policy 这几个响应头,会防止一些盗链,请确定这符合你的意愿、并且你的 Web 服务器支持 HTTP/2)

最新的配置文件请点击这里

  1. server
  2. {
  3. listen 80;
  4. #listen [::]:80;
  5. server_name www.shemissed.me;
  6. index index.html index.htm index.php default.html default.htm default.php;
  7. root /home/wwwroot/www.shemissed.me;
  8. rewrite ^(.*)$ https://$host$1 permanent;
  9. #include other.conf;
  10. #error_page 404 /404.html;
  11. include enable-php.conf;
  12.  
  13.  
  14. location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf)$
  15. { expires 30d;
  16. valid_referers none blocked www.shemissed.me *.google.com *.baidu.com *.so.com *.bing.com;
  17. if ($invalid_referer) {
  18. rewrite ^/ https://o51bfbumd.qnssl.com/link.jpg;
  19. }
  20. }
  21.  
  22.  
  23. location ~ .*\.(js|css)?$
  24. {
  25. expires 12h;
  26. }
  27.  
  28. location ~ /\.
  29. {
  30. deny all;
  31. }
  32.  
  33. access_log /home/wwwlogs/www.shemissed.me.log;
  34. }
  35.  
  36.  
  37.  
  38. server
  39. {
  40. listen 443 ssl http2 ;
  41. #listen [::]:443 ssl spdy;
  42. server_name www.shemissed.me; #此处写你的域名
  43. index index.html index.htm index.php default.html default.htm default.php;
  44. root /home/wwwroot/www.shemissed.me; #此处写你的网站目录
  45.  
  46. ssl on;
  47. ssl_certificate /etc/letsencrypt/live/www.shemissed.me/fullchain.pem; #此处写你的证书文件的路径
  48. ssl_certificate_key /etc/letsencrypt/live/www.shemissed.me/privkey.pem; #私钥,同上
  49. ssl_session_timeout 20m;
  50. ssl_session_cache builtin:1000 shared:SSL:10m;
  51. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  52. ssl_prefer_server_ciphers on;
  53. ssl_dhparam /etc/ssl/certs/dhparam.pem;
  54. 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-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
  55. ssl_stapling on;
  56. ssl_stapling_verify on;
  57. add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
  58. add_header X-Frame-Options "SAMEORIGIN" always;
  59. add_header X-Xss-Protection "1; mode=block" always;
  60. add_header X-Content-Type-Options "nosniff" always;
  61. #add_header Public-Key-Pins 'pin-sha256="YLh1dUR9y6Kja30RrAn7JKnbQG/uEtLMkBgFF2Fuihg="; pin-sha256="sRHdihwgkaib1P1gxX8HFszlD+7/gTfNvuAybgLPNis="; max-age=10; includeSubDomains';
  62. #add_header Content-Security-Policy "default-src https: 'unsafe-inline' 'unsafe-eval' data:;";
  63. add_header Referrer-Policy "no-referrer-when-downgrade";
  64.  
  65. #error_page 404 /404.html;
  66. include enable-php.conf;
  67. if ($http_user_agent ~* (python-requests|Python-urllib|Marxico)) {
  68. return 403;
  69. }
  70. location /nginx_status
  71. {
  72. stub_status on;
  73. access_log off;
  74. }
  75.  
  76. location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf)$
  77. { expires 30d;
  78. valid_referers none blocked www.shemissed.me *.google.com *.baidu.com *.so.com;
  79. if ($invalid_referer) {
  80. rewrite ^/ https://o51bfbumd.qnssl.com/link.jpg;
  81. }
  82. }
  83.  
  84. location ~ .*\.(js|css)?$
  85. {
  86. expires 12h;
  87. }
  88. location /
  89. {
  90. try_files $uri $uri/ /index.php;
  91. }
  92.  
  93. access_log /home/wwwlogs/www.shemissed.me.log; #日志文件
  94. }

保存,然后启动 nginx

  1. service nginx start

我们访问下,自动跳转了哟,而且启用了 HSTS 支持。

小锁头已经出现

手动配置Let's Encrypt+Nginx/Apache, certonly,解决DialogError

 

PS,SSLLabs 可以来测试你的 HTTPS 安全性哦!戳我

其他两个子域,大家看着改吧… 生成 memory.shemissed.me… 我玩不动了,要歇菜了。

大家要注意,let's encrypt 的证书会在 90 天之后过期,快到期的时候

  1. ./certbot-auto renew

续期,这就不用说啥了。按照官网的推荐,一天两次 cron 最好了

另外,如果用 webroot 模式,这样申请证书

  1. certbot certonly --webroot --webroot-path /home/wwwroot/dmesg.app --renew-by-default --email 111@111.com --text --agree-tos -d dmesg.app

Nginx 里这么配置

  1. location ~ /.well-known {
  2. allow all;
  3. }
  4.  

对呢,由于咱用的 standlone 模式,所以要关掉 webserver 才能续期成功,方法之一是写个 bash 脚本判断上一条命令返回值,方法之二是用 hook,比如说:

certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"

其他的一些小问题

HTTP 自动跳转 HTTPS

啥都别说啦,在每个 vhost 的 80 的 server 段加个

  1. rewrite ^(.*)$  https://$host$1 permanent;

  1. root /home/wwwroot/www.shemissed.me;

这一行下加就行。实测在 nginx.conf 加这一句是没有用滴……(Apache 就用. htaccess 吧)

顺便提一句,如果是 apache 的话,思路也是一样的。同样以我【本站】的配置文件为例(很不幸本站没有 vhost 啊……),修改 httpd-ssl.conf 中的

  1. SSLCertificateFile "/etc/letsencrypt/live/dmesg.app/fullchain.pem"
  2. SSLCertificateKeyFile "/etc/letsencrypt/live/dmesg.app/privkey.pem"
  3. DocumentRoot "/home/wwwroot/default"
  4. ServerName dmesg.app:443

自己看着改吧…… 我可懒得折腾这网站的 vhost 了

裸域自动跳转 www 二级域

首先要设置 @解析到你的 IP,然后在 nginx.conf 中,在 80 的 server 段下添加如下内容

  1. if ($host = 'shemissed.me' )
  2. {
  3. rewrite ^/(.*)$ https://www.shemissed.me/$1 permanent;
  4. }

WordPress 404

在 443 段下添加如下即可!

  1. location / {
  2. try_files $uri $uri/ /index.php;
  3. }

Typecho 404

在对应的 443 段添加如下信息(仅限于那些使用了 lnmp1.3 一键安装包的人哟,其他方式的不敢保证成功率。但是就是 php path info 的事情而已)

  1. include typecho.conf;
  2. include enable-php-pathinfo.conf;

写后谈

nginx 配置文件真是简单易懂啊…… 还好编辑!

当初我就为了个 WP Super Cache 选择了 Apache……

 


文章版权归原作者所有丨本站默认采用 CC-BY-NC-SA 4.0 协议进行授权 |
转载必须包含本声明,并以超链接形式注明原作者和本文原始地址:
https://dmesg.app/letsencrypt-nginx-subdomain.html
喜欢 (3)
分享:-)
关于作者:
If you have any further questions, feel free to contact me in English or Chinese.
发表我的评论
取消评论

                     

去你妹的实名制!

  • 昵称 (必填)
  • 邮箱 (必填,不要邮件提醒可以随便写)
  • 网址 (选填)
(13) 个小伙伴在吐槽
  1. 我用 nginx, 也用 wp super cache~
    落格博客 2017-07-27 16:16 回复
    • 咋还挖起这么老的文章了,是因为今天更新了几个 header 吗? 前段时间刚停 WP Super Cache,发现这玩意容易把静态页面的下雪和黑白缓存下来,结果就是在各种未登录的页面上可能出现各种奇葩的组合:-(
      Benny 小土豆 2017-07-27 16:23 回复
      • =。= 靠,没看日期。你刚刚给我发了个 pingback,是这篇文章的…………………………
        落格博客 2017-07-27 16:25 回复
        • 我引用了你的博文,是这个,所以我更新了就给你发 pingback 了??
          Benny 小土豆 2017-07-27 16:28
        • 那估计你引用的别人的链接都发了一遍…… 吧………………XD
          落格博客 2017-07-27 16:30
        • 看了一眼,我脑残了,只有你,啊哇咔咔~
          Benny 小土豆 2017-07-27 16:34
  2. 表示今天突然又有兴趣研究了
    桃花懂了 2016-09-09 10:26 回复
    • 你最近不是挺忙的嘛~
      Benny 小土豆 2016-09-09 11:52 回复
      • 对,非常忙,不过我今天也是工作的事,我要做个导航站
        桃花懂了 2016-09-09 14:19 回复
      • 做好了,erp.taohuadongle.com
        桃花懂了 2016-09-09 15:43 回复
  3. 表示正在用这家的 SSL,就是续期有点麻烦。。。
    EAimTY2016-05-14 10:48 回复
    • 配合 cron,解决~ :idea:
      Benny 小土豆 2016-05-14 11:23 回复
您直接访问了本站! 莫非您记住了我的域名. 厉害~ 我倍感荣幸啊 嘿嘿