从零开始构建支持TLS1.2的Web服务器Linux版(三)创建安装免费的HTTPS证书
2017-07-31 21:24
681 查看
博文目录
声明
Lets Encrypt 免费好用的 HTTPS 证书
申请工具
创建帐号
创建 CSR 文件
配置验证服务
获取网站证书
配置自动更新
参考文献
申请 Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。
ACME 全称是 Automated Certificate Management Environment,直译过来是自动化证书管理环境的意思,Let’s Encrypt 的证书签发过程使用的就是 ACME 协议。有关 ACME 协议的更多资料可以在这个仓库找到。
创建 RSA 私钥(兼容性好):
创建 ECC 私钥(部分老旧操作系统、浏览器不支持。优点是证书体积小):
有关 ECC 证书的更多介绍,请点击这里。
有了私钥文件,就可以生成 CSR 文件了。在 CSR 中推荐至少把域名带
执行这一步时,如果提示找不到
这里,我的
Nginx的配置方案 请参考 Let’s Encrypt,免费好用的 HTTPS 证书
新建一个目录,用以存放认证文件,
定位到
声明
Lets Encrypt 免费好用的 HTTPS 证书
申请工具
创建帐号
创建 CSR 文件
配置验证服务
获取网站证书
配置自动更新
参考文献
声明
本文的大部分操作参考Jerry Qu的Let’s Encrypt,免费好用的 HTTPS 证书,不过原文配置的HTTP服务是Nginx,本文是Tomcat9,如果你使用的也是Nginx,请移步Let’s Encrypt,免费好用的 HTTPS 证书,如果大家在使用时,发现什么问题,也欢迎在评论区一起讨论。Let’s Encrypt, 免费好用的 HTTPS 证书
免费、自动化、开放的证书签发服务。它由 ISRG(Internet Security Research Group,互联网安全研究小组)提供服务,而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let’s Encrypt 得到了 Mozilla、Cisco、Akamai、Electronic Frontier Foundation 和 Chrome 等众多公司和机构的支持,发展十分迅猛。申请 Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。
申请工具
Jerry Qu 没有使用官方的工具来申请,而是使用了acme-tiny 这个更为小巧的开源工具,我对HTTPS的申请不是很熟,这次是第一次申请,决定先按Jerry Qu的方式做一遍,同时记录下自己遇到的问题。ACME 全称是 Automated Certificate Management Environment,直译过来是自动化证书管理环境的意思,Let’s Encrypt 的证书签发过程使用的就是 ACME 协议。有关 ACME 协议的更多资料可以在这个仓库找到。
创建帐号
首先创建一个目录,例如/usr/ssl,用来存放各种临时文件和最后的证书文件。进入这个目录,创建一个 RSA 私钥用于 Let’s Encrypt 识别你的身份:
[root@VM_195_229_centos usr]# mkdir ssl [root@VM_195_229_centos usr]# cd ssl [root@VM_195_229_centos ssl]# openssl genrsa 4096 > account.key Generating RSA private key, 4096 bit long modulus ................................................................++ ..........................................................................++ e is 65537 (0x10001) [root@VM_195_229_centos ssl]# ls -l total 4 -rw-r--r-- 1 root root 3243 Jul 31 20:08 account.key
创建 CSR 文件
接着就可以生成 CSR(Certificate Signing Request,证书签名请求)文件了。在这之前,还需要创建域名私钥(一定不要使用上面的账户私钥),根据证书不同类型,域名私钥也可以选择 RSA 和 ECC 两种不同类型。以下两种方式请根据实际情况二选一。创建 RSA 私钥(兼容性好):
openssl genrsa 4096 > domain.key
创建 ECC 私钥(部分老旧操作系统、浏览器不支持。优点是证书体积小):
#secp256r1 openssl ecparam -genkey -name secp256r1 | openssl ec -out domain.key #secp384r1 openssl ecparam -genkey -name secp384r1 | openssl ec -out domain.key
有关 ECC 证书的更多介绍,请点击这里。
有了私钥文件,就可以生成 CSR 文件了。在 CSR 中推荐至少把域名带
www和不带
www的两种情况都加进去,其它子域可以根据需要添加(目前一张证书最多可以包含 100 个域名):
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
执行这一步时,如果提示找不到
/etc/ssl/openssl.cnf文件,请看看
/usr/local/openssl/ssl/openssl.cnf是否存在。如果还是不行,也可以使用交互方式创建 CSR(需要注意 Common Name 必须为你的域名):
openssl req -new -sha256 -key domain.key -out domain.csr
这里,我的
openssl.cnf目录是
/etc/pki/tls/openssl.cnf,先暂时使用这个文件,而没有采用交互式生成,生成CSR文件暂时没有问题,接着往下走。
配置验证服务
我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往admin@yoursite.com发验证邮件,而 Let’s Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。
Nginx的配置方案 请参考 Let’s Encrypt,免费好用的 HTTPS 证书
新建一个目录,用以存放认证文件,
/usr/ssl/challenges目录:
[root@VM_195_229_centos ssl]# mkdir /usr/ssl/challenges
定位到
Tomcat的安装目录,找到
conf/server.xml,找到以下被注释的配置信息:
<!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 This connector uses the NIO implementation. The default SSLImplementation will depend on the presence of the APR/native library and the useOpenSSL attribute of the AprLifecycleListener. Either JSSE or OpenSSL style configuration may be used regardless of the SSLImplementation selected. JSSE style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="conf/localhost-rsa.jks" type="RSA" /> </SSLHostConfig> </Connector> --> <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2 This connector uses the APR/native implementation which always uses OpenSSL for TLS. Either JSSE or OpenSSL style configuration may be used. OpenSSL style configuration is used below. --> <!-- <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true" > <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /> <SSLHostConfig> <Certificate certificateKeyFile="conf/localhost-rsa-key.pem" certificateFile="conf/localhost-rsa-cert.pem" certificateChainFile="conf/localhost-rsa-chain.pem" type="RSA" /> </SSLHostConfig> </Connector> -->
获取网站证书
先把 acme-tiny 脚本保存到之前的/usr/ssl目录:
[root@VM_195_229_centos ssl]# wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py[/code]
指定账户私钥、CSR 以及验证目录,执行脚本:[root@VM_195_229_centos ssl]# python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt
如果一切正常,当前目录下就会生成一个signed.crt,这就是申请好的证书文件。
如果你把域名 DNS 解析放在国内,这一步很可能会遇到类似这样的错误:ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg[/code]
这是因为你的域名很可能在国外无法解析,可以找台国外 VPS 验证下。我的域名最近从 DNSPod 换到了阿里云解析,最后又换到了 CloudXNS,就是因为最近前两家在国外都很不稳定。如果你也遇到了类似情况,可以暂时使用国外的 DNS 解析服务商,例如 dns.he.net。如果还是搞不定,也可以试试「Neilpang/le」这个工具的 DNS Mode。
搞定网站证书后,还要下载 Let’s Encrypt 的中间证书。我在之前的文章中讲过,配置 HTTPS 证书时既不要漏掉中间证书,也不要忘记包含根证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起:wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem
为了后续能顺利启用 OCSP Stapling,我们再把根证书和中间证书合在一起:wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem cat intermediate.pem root.pem > full_chained.pem
最终,修改 Nginx 中有关证书的配置并 reload 服务即可:配置自动更新
Let’s Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。例如我就创建了一个renew_cert.sh并通过chmod a+x renew_cert.sh赋予执行权限。文件内容如下:#!/bin/bash
cd /home/xxx/www/ssl/
python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/xxx/www/challenges/ > signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem cat signed.crt intermediate.pem > chained.pem
service nginx reload
crontab 中使用绝对路径比较保险,crontab -e加入以下内容:0 0 1 * * /home/xxx/shell/renew_cert.sh >/dev/null 2>&1
这样以后证书每个月都会自动更新,一劳永逸。实际上,Let’s Encrypt 官方将证书有效期定为 90 天一方面是为了更安全,更重要的是鼓励用户采用自动化部署方案。参考文献
Let’s Encrypt,免费好用的 HTTPS 证书
HTTPS 常见部署问题及解决方案
3.SSL/TLS Configuration HOW-TO【Tomcat 官网】
相关文章推荐
- 从零开始构建支持TLS1.2的Web服务器Linux版(六)选装-Redis(src安装方式)
- 从零开始构建支持TLS1.2的Web服务器Linux版(五)选装-MySql(yum安装方式)
- 从零开始构建支持TLS1.2的Web服务器Linux版(四)配置FTP环境
- 从零开始构建支持TLS1.2的Web服务器Linux版(二) 配置Tomcat环境
- 从零开始构建支持TLS1.2的Web服务器Linux版(一) 配置JAVA环境
- nginx https配置详解,linxu环境nginx下http升级到https——linux安装web服务器17
- 推荐两款支持在linux下运行ASP.NET网站的国产免费WEB服务器软件
- linux构建动态WEB服务器安装篇
- 免费HTTPS证书不是梦!在Ubuntu(Linux)的VPS上使用Let's Encrypt为一堆域名申请并安装HTTPS证书
- Ubuntu Linux服务器搭建SSL/TLS(https)(在StartSSL可以得到免费证书)
- 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等
- 高性能web服务器(热死你)Resin Linux的安装、配置、部署,性能远超Nginx支持Java、PHP等
- linux环境apache配置https详解,apache配置ssl证书EV, OV, DV——linux安装web服务器19
- 打开项目时提示如下错误:Visual Studio .NET 无法创建应用程序 。问题很可能是因为本地 Web 服务器上没有安装所需的组件
- 求助:web服务器未安装证书,无法对其进行配置......如何解决?
- Linux上架设支持JSP+PHP的Web服务器
- HttpWebRequest加载证书请求远端https服务器时 : 基础连接已经关闭: 无法与远程服务器建立信任关系
- 在LINUX下用Apache构建WEB服务器
- Visual Studio .NET 无法创建应用程序 。问题很可能是因为本地 Web 服务器上没有安装所需的组件 ----转载
- linux构建动态WEB服务器配置篇