近期的工作中遇到了数据传输加密的需求,就是在数据传输安全层面都要求使用https协议,因此为Web站点安装SSL证书就成了必须,以下就过程记录。
1.需求及选型
需求有两条:
- 支持内网IP地址
我们很多项目都是在内部局域网运行,没有公网IP,更没有域名,因此必须能支持内网IP地址。
- 免费
相当一部分SSL证书需要付费购买,虽然一般不是很贵,成本也需要稍稍考虑一下。免费的SSL证书也有不少地方可以申请,但是能支持内网IP地址的好像没有。
基于这两条考虑,考虑使用开源组件OpenSSL创建自签名SSL证书。自己发给自己的证书,可不就想怎么改就怎么改。
2.OpenSSL创建自签名证书过程
2.1安装或更新OpenSSL组件
CentOS操作系统是自带OpenSSL组件,可以选择直接使用或者更新后使用。
查看OpenSSL版本
openssl version
获取最新版本OpenSSL
wget https://www.openssl.org/sources/openssl-1.1.1k.tar.gz
解压后进行编译安装配置,升级到最新版本
tar -zxvf openssl-1.1.1k.tar.gz #解压
cd openssl-1.1.1k #打开目录
./config --prefix=/usr/local/openssl
make && make install
mv /usr/bin/openssl /usr/bin/openssl.bak
ln -sf /usr/local/openssl/bin/openssl /usr/bin/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
可以查看OpenSSL提供的命令
2.2 创建证书配置文件
创建一个后缀为cnf的配置文件,名称随便起,但是要记得,后面会用到。
[req]
distinguished_name = req_distinguished_name #与下方[req_distinguished_name]一致
encrypt_key = no
req_extensions = req_ext #与下方[req_ext]一致
[req_distinguished_name]
countryName = CN
countryName_default = US
stateOrProvinceName = JiangSu
stateOrProvinceName_default = JiangSu
localityName = NanJing
localityName_default = NanJing
organizationalUnitName = Work
organizationalUnitName_default = Work
commonName = www.默认域名或IP.com
commonName_max = 64
[req_ext]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names #与下方[alt_names]一致
[alt_names]
DNS.1 = www.域名1.com
DNS.2 = *.域名2.com
DNS.3 = 域名3
IP.1 = 192.168.199.86
IP.2 = 192.168.199.1
IP.3 = 127.0.0.1
其中req_distinguished_name项内是证书的基本信息,alt_names是可以使用证书的域名和IP地址,可以填写多个。
注意:req_distinguished_name、req_ext、alt_names这几个要前后对应
2.3 创建自签名SSL证书
总体过程是先创建一个私钥,然后通过私钥创建一系列证书。
下面是在CentOS中的执行示例
生成ca证书
#输出私钥ca.key,使用rsa算法、2048位
openssl genrsa -out ca.key 2048
#根据私钥ca.key生成ca.csr,使用配置文件san.cnf,扩展项为req_ext
openssl req -new -key ca.key -out ca.csr -config san.cnf -extensions req_ext
#签发证书ca.crt
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -extfile san.cnf -extensions req_ext
生成client证书
#输出私钥client.key,使用rsa算法、2048位
openssl genrsa -out client.key 2048
#根据私钥client.key生成client.csr,使用配置文件san.cnf,扩展项为req_ext
openssl req -new -key client.key -out client.csr -config san.cnf -extensions req_ext
#签发证书client.crt
openssl x509 -req -sha256 -extfile req_ext -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt
通过命令行可以查看密钥的内容
#查看ca.key内容,文本形式,不输出
openssl rsa -in ca.key -text -noout
最后生成的是这么一堆文件
后缀为crt的就是我们需要的证书文件。
3安装SSL证书
3.1 Nginx站点安装SSL证书
找到站点所在的Niginx服务器,打开配置文件nginx.conf
# HTTPS server
#
server {
listen 8008 ssl; #世界的端口号
server_name #需要访问的域名,这里也不用加https;
ssl on; #启用SSL
ssl_certificate /usr/local/nginx/ssl/ssl.pem; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写
ssl_certificate_key /usr/local/nginx/ssl/ssl.key; #这里是ssl key文件存放的绝对路径,根据自己的文件名称和路径来写
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://需要访问的域名:8080/;
}
}
之后重启Niginx即可生效。
如果你的服务器安装了宝塔bt运维工具,为站点安装SSL证书的过程就更方便了,完全的图形化操作过程。
打开站点配置>SSL>其他证书,分别将私钥ca.key与证书ca.crt中内容拷贝到文本框中,保存即可。
3.2 Windows操作系统安装证书
双击证书ca.crt,弹出提示框,开始证书安装。
选择证书安装,进入证书导入向导界面,选择存储位置为“本地计算机”。
继续下一步,将证书安装至“受信任的根证书颁发机构”。
4.后续处理
SSL证书创建完、安装完并不是就结束了,开发人员的工作还没结束呢。
目前我们采用的是前后端分离的开发方式,SSL证书一般加在前端站点上。但是使用https的站点会禁用http请求,这就要求所有的请求都必须是https协议的,也就是前端的调用、后端的接口提供都需要在代码中改成https形式。