https 正变得愈发重要,因为谷歌不止一次明确地强调会对那些配置了 https 的网站给予更高的排名。
在今年更新的课程里面 VPS 建站部分,我教了大家怎么用 LNMP 1.4 安装包自带的 SSL 安装模块进行证书安装。在以前的课程中我们用的是 lnmp1.3 版本,是手动去利用 Let's Encrypt 安装脚本去安装 SSL 证书的。
在一些情景下,我们总会碰到需要购买付费 SSL 证书的情况,比如以下情况的任意一种:
- Let's Encrypt 的免费证书虽然用着也 OK,但你希望安装一个效期更久的证书不需要担心短期会过期。
- 当你有多个二级域名网站的时候,你希望能共用一个 SSL 证书。
那么这些情况下你就可能会需要付费的 SSL 证书。
比如 Let's Encrypt 的免费证书有效期一般为 90 天,每隔 90 天之前就要进行续期(当然上一篇文章里我已经给了自动续期的教程指南)。
Let's Encrypt 证书经历过几次更新升级,名称改成 certbot 了。免费的证书脚本总是不断升级改版,连带着我也要定期去学习和修改相应的续期设置,提高了我的学习成本和时间占用,麻烦。
再比如我的这个博客,除了 www 之外,还有 static,还有 go 等二级域名,我希望能有一个泛域名 (wildcard) 证书,即支持任意域名 (*.liaosam.com),使得主站和二级域名站都能共用。
当然,以前的 Let's Encrypt 免费证书也是能满足我的需求的。但是从 Let's Encrypt 到 Certbot,以前多个域名可以一起生成证书,但现在的 Certbot 好像总是有这样那样的问题。
2018.11 月更新,LNMP1.5 版本的安装包已支持泛域名(Wildcard)证书安装。
版本介绍:https://lnmp.org/notice/lnmp-v-15.html
想到免费的不便,想到我除了主站之外子站也要用 SSL,最后,简而言之:我想直接用一个付费的泛域名证书 (wildcard certificate) ,一了百了。
于是我找到了一个国外 SSL 证书的 Reseller 买了 Comodo 的 ssl 证书:"PositiveSSL Wildcard Certificate",三年的费用一共是一百多美金。当然如果你没有多个二级域名网站,买另外一种证书即可,会很便宜,一年几美金即可。
2020 年更新:现在 Comodo CA 分出来一个 Sectigo CA,证书名也多出来一个 Sectigo PositiveSSL Wildcard Certificate。
如果你也需要购买付费证书的话,那么可以按照本文当中的过程来购买和配置安装。
一、购买你需要的 SSL 证书
SSL 的厂家有很多,比如说比较知名的有 Symantec,Comodo,GeoTrust,RapidSSL,OpenSSL 等。如果直接从这些厂商买的话,价格会比较贵。国内的一些云服务商就卖得更贵了,如阿里云,一个泛域名证书一年最低端的也要 1200 元,而这个价格在国外的代理商那里则是可以用三四年的价格。所以一般我们会选择从国外的 Reseller 那里买。
我是从这个网站:https://cheapsslsecurity.com/ 买的。
一般情况下,如果你只是建一个英文网站,或者建一个自己的中文博客,不需要使用到二级子域名,那么用这个 $6.95/yr 的单域名的证书 Positive SSL Certificate 或 $26.24/yr 的 OV SSL Certificate 就可以了。
至于我买的证书为什么价格贵,这是因为适用于 Sub-Domains 的泛域名 SSL 证书的单价就是定的高一些。估计是因为厂商觉得你有很多 sub-domains,应该是大企业,因此价格就定高了。
不过没事,不到一千块,用三年,咱也可以接受,不差钱!我是用 PayPal 买的,有双币信用卡也可以。
一开始没有地方创建账号,你只管选择证书产品,在提交购物车支付之前需要填写一些基本信息如邮箱地址,姓名等等。等支付成功之后,会自动创建好账号并收到邮件通知的。
买的时候注意看,有可能还有一些额外的优惠。以上的价格可能商家会不定期调整,只供参考。
正常外贸企业类型网站,不会用到多个二级域名的。即使建多语种网站,用子目录或者 WordPress 的 Gtranslate 插件即可,所以只需要购买便宜的 Positive SSL Certificate 即可。
购买成功的通知邮件
购买付款成功之后,会收到来自于 CheapSSLSecurity 的订单确认邮件。
CheapSSLSecurity 发来的邮件里有如下提示:
CheapSSLSecurity 的主页上,你可能找不到登陆的入口。点击 My Account 可以登录,或者通过这个地址登陆:https://cheapsslsecurity.com/client/
或者,你随便点击一个产品,如:https://cheapsslsecurity.com/comodo/positivessl.html
在产品页面上方会有个 My Account。填写邮箱地址和密码即可登陆。
上面的截图里说的是什么?说的是要想使用 SSL 证书,就必须先要获得一个 CA 证书。获取 CA 证书要经历几个步骤,其中一个步骤是你必须先要获取一个 CSR(证书签发请求)。
二、生成证书前的配置页面
付款完成后,你会自动转到一个 Begin Now 的页面,或者你在你的后台控制面板(My Dashboard)或者 Incomplete Order 页面,也会看到你的订单状态。
会有一个 Generate Cert Now 的按钮,点击它。
来到生成证书的页面,这个页面有 5 个步骤选项(这个页面经常会有些改动,有些选项自己看着选择即可)。
Select Your Order Type* (选择订单类型)
这一步,我们是新购证书。默认是 New,不用改动。
Choose your Automated Authentication Option* (选择验证方式)
为了验证域名的所有权,需要你选择验证方式。我推荐图中 1,2,3 这三种。一般情况下,看你网站现在是哪种情况可以访问。比如你现在已经启用了 https,那么可以选择第 2 种 https。如果还没有启用 https,可以选择 http 的这种。
推荐用第 3 种方式,使用 DNS 验证,在域名解析记录那里添加一条 CNAME 的解析记录,这种方式最简单。图中的 email 的方式不推荐。如果你用的是第 1 或第 2 种方式,怎么验证文件,请见本文评论区里的答复。(如果是 Re-issue 证书,建议选择 Http/Https File-Based 方式)
选择了 DNS 的方式,继续第三步:
Input CSR (Certificate Signing Request)* (这一步是填入证书的签发请求码)
关于这一步,你可以按照它的提示访问这个网址,去自动生成 CSR 和 Private Key。https://cheapsslsecurity.com/ssltools/csr-generator.php
建议是用上面那个链接直接过去填写信息然后生成 CSR 以及下载 Private Key 的 txt 文本,这样方便一些。
当然,你也可以自己在服务器上生成 CSR 和 Private Key。方法如下:
自己服务器上生成 CSR 和 Private Key
在 Xshell 中连接了 VPS 之后,执行下面命令:
cd /usr/local/nginx/conf/ && mkdir ssl (如果已有 ssl 目录则无需再创建 ssl 目录)
然后执行:
cd ssl
然后执行:
openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out yourdomain.csr
请注意自行替换上面的 yourdomain 变成你的域名。
在生成 CSR 文件的时候,脚本会让你填写一些信息。如国家,省份,城市,公司名等等。
Organization Name 填公司名或个人名,Organization Unit Name 留空,
Common Name 写证书要使用的域名。看你购买的证书类型来写这里的域名:
- www.abcde.com(买的是一般 Positive SSL Certificate, 网站首页带 www,最常见)
- abcde.com(买的是一般 Positive SSL Certificate, 网站首页不带 www,用的是根域名)
- *.abcde.com(买的是 Positive Wildcard SSL Certificate,泛域名证书,覆盖多个二级域名)
Email Address 可以填写 QQ 邮箱地址。
A challenge password 可以填写你常用的密码(不太重要),An Optional company name 留空。回车。
OK,确定之后,就已经创建完成了。
用 XFTP 打开 /usr/local/nginx/conf/ssl ,可以看到里面有两个文件:private.key 和 yourdomain.csr
把 yourdomain.csr 文件下载到本地,用 notepad++打开,选中 -----BEGIN CERTIFICATE REQUEST----- 和 -----END CERTIFICATE REQUEST----- 中间的部分,这部分信息就是后面我们要用的。
复制这个 CSR 信息,填入 Input CSR 的表格里。
说明:建议还是直接用网页在线生成的方式创建 CSR 和私钥 Key,更方便也不容易出错。
三、验证网站域名所有权和 URL(Verify Your URL)
继续完成下面的选项。
第四项默认不动,第五项选择 Nginx Server(如果你的 VPS 用的是 LNMP 环境的话),我是选择 Nginx Server,然后 Continue。
如果一切顺利无误的话,会转到验证的步骤。Verify Your URL。就是验证你的网站域名所有权。
1)Confirm The Domain You Submitted(确认你提交的域名)
这里会显示证书要安装的具体域名,一般会是 https://www.abcde.com 的形式。如果你申请的是泛域名(wildcard)证书,这里应该是 https://*.abcde.com
2)Confirm Your Information(确认网站域名的信息)
没什么好说的,就是把你之前填写的内容再显示一遍。
3)Site Administrator Contact Information*(网站域名管理者的联系方式)
这一步如果域名管理者是你,你可以直接勾选
Technical Contact Information* 技术人员的联系方式,一样可以勾选快速填写。
Subscriber Agreement*(订阅协议)
勾选前面两项。关于询问是否是 e-commerce website,我们建企业网站或个人博客选择 NO。如果你建的是 B2C 类带商城购物车结算之类的,可以选择 Yes 看看。
点击 CONTINUE。
添加 CNAME 解析记录
完成上面的操作后,页面提示:
上面截图提供给我们一长串的 CNAME 域名。形式为二级域名:xxxxxxxxxxx.yoursite.com,这个是主机名,
把它指向值为 同样一长串二级域名的 yyyyyyyyyyyyyyyy.comodoca.com 网站。
这里,注意看截图。把此图里,你的域名前面的下划线标出的 CNAME 一串长二级域名部分 xxxxxxxxxxx 称为 A,把下面整个红色框住的 yyyyyyyyyyyyyyyy.comodoca.com 称为 B。
OK,我们去域名注册商那里添加一下 CNAME 域名解析记录吧。本文中域名注册商为 Namesilo。
去 Namesilo 去添加 CNAME 解析记录
具体操作为:在 Namesilo 登录状态下,点击顶部的 Manage My Domains,进入域名列表页。
看到你的域名,直接点击,进入域名操作页面 Domain Console:
点击 DNS Records(解析记录)右侧的 Update 链接,进入更新解析记录。
点击 Select the resource record type you want to creat 右边的 CNAME 链接,创建 CNAME 记录:
看图,点击 CNAME,在需要填写的记录栏处,HOSTNAME 里填写 A 那部分。
注意,别带根域名。填写成 xxxx.yourdomain.com 是错的,只填写 xxxx,即分配给你来验证的二级 CNAME 域名。
在 TARGET HOSTNAME 那里,填写 B 部分整个完整的一长串地址。
点击 SUBMIT,之后你会在下方的解析记录列表里发现多了一条 CNAME 记录,检查 CNAME 的 HOSTNAME 是否正确
然后点提交按钮。等待生效即可。一般 2 小时内即可生效。
OK。接下来完成这个解析的验证即可。你可以通过 https://cheapsslsecurity.com/ 后台的 My Dashboard 查看订单的具体状态。
然后就等待 CA 证书发放了。CA 证书的发放一般会通过电子邮件形式发到你的邮箱里。
四、收到 Cert 证书及相关证书的邮件
如果一切顺利,很快大概 12 小时内,你会收到一封来自 Comodo(或 Sectigo Certification Authority)的邮件,通知你 Certificates have been issued,附件有证书文件。
下载邮件中的证书文件附件,解压缩到本地,里面有四个文件,分别是:
- Root CA Certificate - AddTrustExternalCARoot.crt
- Intermediate CA Certificate - COMODORSAAddTrustCA.crt
- Intermediate CA Certificate - COMODORSADomainValidationSecureServerCA.crt
- Your PositiveSSL Wildcard Certificate - STAR_domain_com.crt (注意你们买的如果是 6.95 美金一年的 Positive SSL Certificate,这里就是 domain_com.crt )
五、证书及密钥文件上传 & 证书合并
把证书压缩包里的 4 个证书全部上传到 VPS 的 /usr/local/nginx/conf/ssl 内。
以及之前的密钥文件 domain.com.key 也上传到 /usr/local/nginx/conf/ssl 内。
接下来合并一个主证书(域名证书+中间证书):
cat STAR_domain_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt >> bundle.crt
注意顺序:primary domain 证书在前,然后中间证书从下层往上层的顺序排先后。
然后再合成一个 trusted.crt(使用根证书+中间证书)
cat AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt >> trusted.crt
六、生成 dhparam
确保当前所处于 ssl 文件夹下,
cd /usr/local/nginx/conf/ssl
[root@li~123 ssl]# 下执行下面的命令:
openssl dhparam -out dhparam.pem 2048
一般就用 2048,有些人用了更高的安全测试分也会用 4096。随便。安静等待创建生成,大概需要 10 - 20 分钟。
成功后,文件夹 /usr/local/nginx/conf/ssl 内会多出一个 dhparam.pem 文件。
七、配置 Nginx Vhost Conf 文件
修改网站的 conf 配置文件。位置:/usr/local/nginx/conf/vhost/ 下。
在 443 Server 段的具体配置如下 (注意修改 xyz.com 为你的域名):
listen 443 ssl http2; server_name www.xyz.com xyz.com; root /home/wwwroot/www.xyz.com; index index.html index.htm index.php default.html default.htm default.php; 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_certificate /usr/local/nginx/conf/ssl/bundle.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/domain.com.key; ssl_dhparam /usr/local/nginx/sslconf//dhparam.pem; ssl_prefer_server_ciphers on; keepalive_timeout 75; ssl_session_timeout 1d; ssl_session_cache shared:SSL:20m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; ## verify chain of trust of OCSP response using Root CA and Intermediate certs ssl_trusted_certificate /usr/local/nginx/conf/ssl/trusted.crt; resolver 8.8.8.8 8.8.4.4 valid=300s; include wordpress.conf; #error_page 404 /404.html; include enable-php.conf; .......
下面的配置就不贴了,主要就是上面那段紫色字体部分。
修改完毕后,保存,上传覆盖。
八、重启 Nginx 服务
service nginx restart
九、查看证书详情
在 Chrome 或者 Firefox 浏览器中访问你的网站,点击地址栏左边的小绿锁图标。弹出点击证书(有效)
OK!搞定!
十、其它 SSL 证书工具
CheapSSLSecurity.com 网站上,还提供了一些 SSL 证书相关的实用工具,如果有需要可以看一下这个页面:
https://cheapsslsecurity.com/ssltools/
OVER!
喜欢这篇文章的朋友们,不要吝惜你们的赞哦!
本站所有文章除注明“转载”的文章之外,均为原创。未经本站允许,请勿随意转载或用作任何商业用途,否则依法追究侵权者法律责任的权利。
该评论为私密评论
为了验证域名的所有权,需要你选择验证方式。我已经申请了其他免费的 SSL 证书,是不是该选择第 2 种 https 验证方式?接下去该怎么操作呢?我是用在群晖 nas 上的。谢谢
料大,您好!我是米课您的学生。您本文提到 vps 上生成 CSR 和 Private Key. 那么,虚拟主机如何生成呢?我的空间是‘Bluehost 中国’空间。谢谢您!
@Liaosam 网站已经建好了。那么虚拟主机 COMODO 的 SSL 如何安装呢?
之前已经添加过免费的 SSL,那么你要删除,不然会出现重复错误
[warn] duplicate value "TLSv1.1" in /usr/local/nginx/conf/vhost/www.xyz.com.conf
文件中会存在类似以下代码,并删除之后,添加料神帖子中的那段 SSL 代码。
ssl_certificate /etc/letsencrypt/live/www.xyz.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xyz.com/privkey.pem;
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;
# HSTS (ngx_http_headers_module is required) (31536000 seconds = 12 months)
# add_header Strict-Transport-Security "max-age=31536000" always;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
比如我购买的是 Comodo PositiveSSL Certificate,参考料神帖子,合成部分参照自己的下载的证书。
cat www_xyz_com.crt SectigoRSADomainValidationSecureServerCA.crt USERTrustRSAAddTrustCA.crt > signed_cert_plus_intermediates.crt
cat AddTrustExternalCARoot.crt USERTrustRSAAddTrustCA.crt SectigoRSADomainValidationSecureServerCA.crt > root_CA_cert_plus_intermediates.crt
再次感谢料神的好帖子。
安装了为什么不成功呢?443 到底该怎样呢?
@Liaosam 我一步一步按照你的步骤操作,443 文件几乎不用更改已经是你文章显示的(域名已经自动是我自己域名)。所以我疑惑 443 到底怎么弄呢,我的一直安装不成功。
请问料神大大,这个 ssl 证书,有手机版和小语种吗?
关于小语种,看你说你是怎么建小语种的。如果是用二级域名的方式,比如 es.abc.com, de.abc.com,那么肯定是选择 wildcard certificate,这种就是针对 *.abc.com 全包含的。但如果你用的是二级目录的形式来建立小语种版本的网站,那么就不需要选择 wildcard 这种泛域名证书了。
@Liaosam 该评论为私密评论
为啥,我这里过了 12 个小时还收不到邮件
军哥包 LNMP 1.5 已经添加了对通配符证书的支持。https://lnmp.org/faq/letsencrypt-wildcard-ssl.html
而且料大的 Linode 建站教程也建议使用 1.5 的包(含最新 PHP 版本)。毕竟现在 AVADA 后台已经建议升级 PHP7.2.
该评论为私密评论
用文件认证的方式稍微有点麻烦,你要创建 .well-known 文件夹和 PKI-validation 文件夹,然后再把文件放进去。创建 .well-known 文件夹要用命令。
在 xshell 已经成功连接的情况下,分别执行下面的两行命令:(把 http://www.xyz.com 换成你的)
cd /home/wwwroot/www.xyz.com && mkdir .well-known
cd .well-known && mkdir pki-validation
然后在 XFTP 里面把 那个 txt 文件上传到 pki-validation 文件夹下
@Liaosam 该评论为私密评论
该评论为私密评论
料大 在执行完 openssl dhparam -out dhparam.cert 2048 之后,只出现 dhparam.crt 文件,没有你写的.pem 的文件,而且我的网站 conf 文件的路径是/usr/local/nginx/conf/vhost 是不是有问题?打开以后也没有发现 443server 段的配置怎么办?
@sara openssl dhparam -out dhparam.cert 2048 这个地方应该是把 cert 改成 pem 才对
该评论为私密评论
@Liaosam 该评论为私密评论
也不是一定要用付费的证书的,看情况。
@Liaosam 该评论为私密评论
料大,以前免费的 ssl 证书怎么卸载呢。。。想装这个收费的是不是要把以前的卸载呢?
如果不清楚,启动 XFTP 的时候看一下 /root 下的下载的压缩包文件名。如果是 1.3 下安装的,先购买和配置再说。
如果想稳定地使用免费的 SSL 证书,那要等我有空研究看看 Certbot 的自动续期命令。如果要装付费的证书,应该不管 1.3 还是 1.4 都可以直接安装配置。
等搞完后,修改网站的 conf 配置文件,修改指向证书和 key 以及 dhparam.pem 的路径和文件名即可。
@Liaosam 1.3 的