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 获取证书的方法有很多种,比如 Certbotacme.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
2
acme.sh  --issue  --dns   -d mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

然后, acme.sh 会生成相应的解析记录显示出来,你只需要在你的域名管理面板中添加这条 txt 记录即可。

等待解析完成之后,重新生成证书:

1
2
acme.sh  --renew   -d mydomain.com \
--yes-I-know-dns-manual-mode-enough-go-ahead-please

注意第二次这里用的是 --renew

(3) 使用域名解析商提供的 API 自动添加 txt 记录完成验证

DNS 方式的真正强大之处在于可以使用域名解析商提供的 API 自动添加 txt 记录完成验证。

acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 Amazon, Aliyun 等数十种解析商的自动集成。

以阿里云 DNS API(Aliyun domain API)为例:

第一步:获取阿里云账户KeySecret并将其添加到环境变量中

1
2
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"

第二步:签发证书

1
acme.sh --issue --dns dns_ali -d example.com -d *.example.com

注:Ali_KeyAli_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
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file /path/to/certfile/in/apache/cert.pem \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd "service apache2 force-reload"
  • Nginx
1
2
3
4
acme.sh --install-cert -d example.com \
--key-file /path/to/keyfile/in/nginx/key.pem \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd "service nginx force-reload"

4、更新证书

目前证书在 60 天以后会自动更新,用户无需任何操作。

三、在服务器中配置证书

1、Nginx

首先进入到 Nginx 的安装目录,增加cert/文件夹,用acme.sh的复制命令把证书和密钥复制到cert/文件夹中,之后在nginx.conf文件中添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
listen 443;
server_name example.com; // 你的域名
ssl on;
index index.html index.htm;// 上面配置的文件夹里面的index.html
ssl_certificate cert/cert_name.pem;// 你的证书文件名称
ssl_certificate_key cert/cert_key.key;// 你的密钥文件名称
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
# 文件夹
root /var/www/example.com;
# 主页
index index.html index.htm;
}
}
server {
listen 80;
server_name example.com;// 你的域名
rewrite ^/(.*)$ https://example.com/$1 permanent; // 把http的域名请求转成https
}

说明:以上配置是对443端口和80端口进行监听,443端口要启用SSL,当用户访问80端口时要跳转到443端口。

配置完成后,检查一下nginx配置文件是否可用:

1
$ nginx -t // 检查nginx配置文件

配置正确后,重新加载配置文件使配置生效:

1
$ nginx -s reload // 使配置生效

至此,Nginx 的https访问就完成了,并且通过rewrite方式把所有http请求也转成了https请求,更加安全。

如需重启Nginx,用以下命令:

1
2
3
$ service nginx stop // 停止
$ service nginx start // 启动
$ service nginx restart // 重启

2、Tomcat

acme.sh生成的证书格式是PME格式,而Tomcat不支持该格式的证书,必须要将证书转换为JKS格式才可以使用,因此需要将PEM格式证书转换成JKS格式。

通常一个完整的证书链包含三个文件:

  1. cert.pem:用户证书文件
  2. cert.key:用户私钥文件
  3. ca.pem:CA根证书文件

首先切换到SSL证书所在的目录下,之后执行以下命令:

1
2
3
4
openssl pkcs12 -export -name myalias -in cert.pem -inkey key.pem -out cert.p12
Enter pass phrase for cert.key:
Enter Export Password:
Verifying - Enter Export Password:

注意:

  • 以上命令可以执行的前提条件是计算机中已安装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
2
3
4
5
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/path/keystore,jks"
keystorePass="yourPass"/>

注:其中keystoreFile为证书所在路径,keystorePass为将p12格式的证书转换为JKS格式的证书时设置的目标密钥库口令。

完成配置后重启 Tomcat 服务即可使用HTTPS方式访问。