在本地局域网搭建 Https 服务

Https

利用局域网环境搭建 https 服务,模拟系统上线正式环境,提前发现可能存在的问题,确保项目平稳上线。

一、环境准备

  • 服务器系统:CentOS 6 (Red Hat Enterprise Linux Server release 6.3 (Santiago))
  • web 服务器: Nginx、Tomcat9
  • Java 环境:Java 8

二、Https 服务搭建

2.1 https 证书获取

获取 https 证书主要有两种方式,第一种,使用工具生成 ssl 证书,例如:openssl 工具、 JDK 自带的 keytool 工具;第二种,在线向第三方机构申请的免费或付费的 SSL 证书,例如:阿里云 SSL 证书服务百度云 SSL 证书服务华为云 SSL 证书管理 SCM腾讯云 SSL 证书服务等。本次采用第一种方式,使用工具生成 ssl 证书。之前写《基于 TrueLicense 实现 web 应用的 License 验证》时,有详细讲到使用 keytool 生成 ssl 证书文件。

2.2 使用 Tomcat 配置 Https

2.2.1 生成 ssl 证书

1
2
# 为服务器生成证书  目录下面生成tomcat.keystore的文件
keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore tomcat.keystore -storepass 123456

2.2.2 配置 Tomcat 的 Https 服务

将生成的 tomcat.keystore 密钥库文件拷贝到 Tomcat 服务器的 conf 目录下。修改 Tomcat 配置 server.xml,注释掉 http 连接器,释放 https 连接器,启用 https,并配置证书路径及密码:

1
2
3
4
5
6
7
8
9
10

<!-- <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> -->

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="conf/tomcat.keystore"
type="RSA" certificateKeystorePassword="123456" />
</SSLHostConfig>
</Connector>

启动 Tomcat,访问 8443 端口验证服务。

2.3 使用 Tomcat+Nginx 配置 https

2.3.1 keytool 生成证书

1
2
3
4
5
6
7
8
# 生成密钥对
keytool -genkeypair -alias server -keyalg RSA -keysize 2048 -validity 3650 -keypass 123456 -storepass 123456 -keystore server.keystore
# 查看详情
keytool -list -keystore -storepass 123456 server.keystore
# 把jks证书转换为p12格式证书
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcstoretype JKS -deststoretype PKCS12
# 导出 cer证书
keytool -exportcert -file server.cer -alias server -keystore server.keystore -storepass 123456

安装 openssl,将 cer 格式证书转 pem 格式。windows 下载链接

1
2
3
4
# 将cer格式证书转pem格式
openssl x509 -inform der -in server.cer -out server.pem
# 提取私钥
openssl pkcs12 -nocerts -nodes -in server.p12 -out server.key

2.3.2 openssl 生成证书

1
2
3
4
5
6
7
8
9
10
# 生成私钥文件
openssl genrsa -des3 -out server.key 1024
# 为了不需要在每次重启nginx的时候都输入密码,删掉密码
mv server.key servertemp.key
openssl rsa -in servertemp.key -out server.key
rm servertemp.key
# 私钥文件生成csr证书文件
openssl req -new -key server.key -out server.csr
# 生成crt证书文件
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

2.3.3 配置 nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 443 ssl;
server_name baidu.com;
keepalive_timeout 70;

ssl_certificate /home/server.crt;
ssl_certificate_key /home/server.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
}
}

重启 nginx

1
/usr/local/nginx/sbin/nginx -s reload

Nginx 的安装和配置可参考《Nginx 的安装和配置》。