SSL(Secure Socket Layer)由Netscape公司于1994年创建,它旨在通过Web创建安全的Internet通信。它是一种标准协议,用于加密浏览器和服务器之间的通信。它允许通过Internet安全轻松地传输账号密码、银行卡、手机号等私密信息。SSL证书就是遵守SSL协议,由受信任的CA(Certificate Authority)机构颁发的数字证书。它有很多种类和品牌,不同种类的SSL证书有不同功能。
一、如何获取SSL证书
1、购买证书
SSL证书分为以下三种类型:
- 域名型DV:信任等级普通,只需验证网站的真实性便可颁发证书保护网站
- 企业型OV:信任等级强,须要验证企业的身份,审核严格,安全性更高
- 增强型EV:信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高
如果是个人站点和应用,一般推荐申请域名型SSL证书即可;如果是中小型企业站点或电子商务站点和应用,一般推荐申请企业型SSL证书;如果是大型企业和政府机构站点或大型金融平台,一般推荐申请增强型SSL证书。
此外,SSL证书还可分为单域名证书、多域名证书、泛域名证书。不同类型的证书的价格也有所不同,可根据自己的实际需求购买证书。
2、免费获取SSL证书
除了花钱购买证书,还可以通过Let’s Encrypt获取免费的SSL证书,要注意的是 Let’s Encrypt 只支持域名型SSL证书,一般用于个人网站/博客、非盈利项目、开源项目,若需申请企业型或增强型SSL证书仍需购买证书。
从 Let’s Encrypt 获取证书的方法有很多种,比如 Certbot、acme.sh等使用 ACME 协议的软件就可用来获取 Let’s Encrypt 证书,个人推荐使用acme.sh来生成证书。
二、使用acme生成证书
acme.sh 实现了ACME 协议, 可以从 Let’s Encrypt 生成免费的证书,下面我们将介绍如何通过acme生成SSL证书。
1、安装acme
1 | curl https://get.acme.sh | sh |
2、生成证书
(1) HTTP方式
HTTP 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证,然后就可以生成证书了。
1 | acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/ |
只需要指定域名, 并指定域名所在的网站根目录,acme.sh
会全自动的生成验证文件, 并放到网站的根目录,然后自动完成验证,最后会删除验证文件。
更高级的用法请参考: How-to-issue-a-cert
(2) 手动DNS方式
这种方式的好处是, 你不需要任何服务器,不需要任何公网 IP,只需要 DNS 的解析记录即可完成验证。坏处是,如果不同时配置 Automatic DNS API,使用这种方式acme.sh
将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
1 | acme.sh --issue --dns -d mydomain.com \ |
然后, acme.sh
会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 txt 记录即可。
等待解析完成之后,重新生成证书:
1 | acme.sh --renew -d mydomain.com \ |
注意第二次这里用的是 --renew
(3) 使用域名解析商提供的 API 自动添加 txt 记录完成验证
DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 txt 记录完成验证。
acme.sh
目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 Amazon, Aliyun 等数十种解析商的自动集成。
以阿里云 DNS API(Aliyun domain API)为例:
第一步:获取阿里云账户Key
和Secret
并将其添加到环境变量中
1 | export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje" |
第二步:签发证书
1 | acme.sh --issue --dns dns_ali -d example.com -d *.example.com |
注:Ali_Key
和Ali_Secret
将保存在~/.acme.sh/account.conf
中并将在需要时重用。
若需获取更多厂商的DNS API信息,请参考:https://github.com/acmesh-official/acme.sh/wiki/dnsapi
3、复制/安装证书
前面证书生成以后,接下来需要把证书 copy 到真正需要用它的地方。
注意,默认生成的证书都放在安装目录下: ~/.acme.sh/
, 请不要直接使用此目录下的文件,例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件。这里面的文件都是内部使用,而且目录结构可能会变化。
正确的使用方法是使用 --install-cert
命令,并指定目标位置,然后证书文件会被复制到相应的位置,例如:
- Apache
1 | acme.sh --install-cert -d example.com \ |
- Nginx
1 | acme.sh --install-cert -d example.com \ |
4、更新证书
目前证书在 60 天以后会自动更新,用户无需任何操作。
三、在服务器中配置证书
1、Nginx
首先进入到 Nginx 的安装目录,增加cert/
文件夹,用acme.sh
的复制命令把证书和密钥复制到cert/
文件夹中,之后在nginx.conf
文件中添加以下内容:
1 | server { |
说明:以上配置是对443端口和80端口进行监听,443端口要启用SSL,当用户访问80端口时要跳转到443端口。
配置完成后,检查一下nginx配置文件是否可用:
1 | nginx -t // 检查nginx配置文件 |
配置正确后,重新加载配置文件使配置生效:
1 | nginx -s reload // 使配置生效 |
至此,Nginx 的https
访问就完成了,并且通过rewrite
方式把所有http
请求也转成了https
请求,更加安全。
如需重启Nginx,用以下命令:
1 | service nginx stop // 停止 |
2、Tomcat
acme.sh
生成的证书格式是PME
格式,而Tomcat不支持该格式的证书,必须要将证书转换为JKS
格式才可以使用,因此需要将PEM格式证书转换成JKS格式。
通常一个完整的证书链包含三个文件:
- cert.pem:用户证书文件
- cert.key:用户私钥文件
- ca.pem:CA根证书文件
首先切换到SSL证书所在的目录下,之后执行以下命令:
1 | openssl pkcs12 -export -name myalias -in cert.pem -inkey key.pem -out cert.p12 |
注意:
- 以上命令可以执行的前提条件是计算机中已安装OpenSSL
-name
参数表示别名,-in
参数表示公钥证书的文件名,-inkey
参数表示私钥证书的文件名,-out
表示输出p12
格式证书的文件名
之后将p12
格式的证书转换为JKS
格式的证书
1 | keytool -importkeystore -srckeystore cert.p12 -srcstoretype PKCS12 -destkeystore keystore.jks |
接下来keytool
将提示输入目标密钥库口令、再次输入目标密钥库口令、输入源密钥库口令(即在将PEM格式证书转换为p12格式时输入的密码),提示成功后便完成了JKS
格式证书的生成。
在制作完JKS
格式的证书之后打开 Tomcat 根目录下conf/server.xml
,修改以下内容:
1 | <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" |
注:其中keystoreFile
为证书所在路径,keystorePass
为将p12
格式的证书转换为JKS
格式的证书时设置的目标密钥库口令。
完成配置后重启 Tomcat 服务即可使用HTTPS
方式访问。