之前配置HTTPS协议都是直接网上找例子照搬,最近配置公司服务器时发现分布式服务配置存在很多问题,于是写一下配置过程,记录一下
分布式系统中大部分会使用到nginx+tomcat实现服务部署及负载均衡,尤其时springboot流行起来后,直接一个jar包放到服务器运行,使用内置tomcat,今天主要就是从一下几个模块开讲。
- nginx配置https
- tomcat配置https
- springboot配置https
首先我们需要了解一下
https和http的区别:
HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
主要区别:
- https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用,也可以自己生成,但不安全。
- http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议
- http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
- http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
了解了两者的不同,我们就开始今天的主要内容了
考虑到开发环境和部署环境的不同,我们分两步介绍nginx的https配置
1)windows服务器下搭建nginx的https
-
安装OpenSSL
OpenSSL下载地址
直接运行安装即可,配置环境变量:
新增环境变量
变量名:OPENSSL_HOME
变量值:C:\OpenSSL-Win64\bin;
修改Path变量结尾添加一条: %OPENSSL_HOME% -
安装Nginx(请自行百度,不再介绍)
nginx官网
进入到nginx目录下,双击nginx.exe文件即可启动服务器。
在浏览器地址栏输入http://localhost,如果可以成功访问到Nginx的欢迎界面,则说明安装成功 -
生成证书
首先在Nginx安装目录中创建ssl文件夹用于存放证书
执行cmd cd
到nginx/config/ssl目录
创建私钥:openssl genrsa -des3 -out buduhuisi.key 1024
两次输入密码,记住密码,后边会用到
创建csr证书:openssl req -new -key buduhuisi.key -out buduhuisi.csr
去除密码校验:复制buduhuisi.key并重命名为buduhuisi.key.org然后执行命令以去除口令:
openssl rsa -in buduhuisi.key.org -out buduhuisi.key
这里需要输入上边记录的密码了
生成crt证书:openssl x509 -req -days 365 -in buduhuisi.csr -signkey buduhuisi.key -out buduhuisi.crt
至此证书就生成完毕了
- 修改Nginx的nginx.conf配置文件
server {
listen 443 ssl; #直接放到端口后面可同时使用http和https
#ssl on; 开启https
server_name localhost;
ssl_certificate C://nginx//config//ssl//buduhuisi.crt;
ssl_certificate_key C://nginx//config//ssl//buduhuisi.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
2)liunx服务器下搭建nginx的https(我已安装nginx,所以直接添加模块)
- 安装nginx
可参考 nginx安装教程 - 监测nginx是否包含ssl模块
#跳转到nginx路径
cd /usr/local/nginx/sbin
#nginx 模块
./nginx -V
- 安装ssl模块
#切换到源码包
cd /usr/local/src/nginx-1.11.3
#重新配置nginx,加载ssl模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#重新编译,这里不需要make install,否则会覆盖安装
make
#备份原有安装的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#覆盖新的nginx
cp ./objs/nginx /usr/local/nginx/sbin/
#提示是否覆盖,输入Y
#重启nginx
./nginx
#查看模块信息
./nginx -V
- 生成证书
创建服务器证书密钥文件 server.key:openssl genrsa -des3 -out server.key 1024
输入密码,确认密码,自己随便定义,但是要记住,后面会用到
创建服务器证书的申请文件 server.csr:openssl req -new -key server.key -out server.csr
按要求填写信息
备份一份服务器密钥文件:cp server.key server.key.org
去除文件口令:openssl rsa -in server.key.org -out server.key
生成证书文件server.crt:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
- 修改配置文件
server{
#比起默认的80 使用了443 默认 是ssl方式 多出default之后的ssl
listen 443 default ssl; #default 可省略
#开启 如果把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
ssl on;
#证书(公钥.发送到客户端的)
ssl_certificate ssl/server.crt;
ssl_certificate_key ssl/server.key;
server_name www.daj.com;
location / {
proxy_redirect off;
proxy_pass https://www.tao.com/;
}
}
有时候我们的服务是nginx+tomcat的,所以我们需要开启tomcat对https的支持,当然也可以直接配置证书到tomcat开启服务的https
开启tomcat的https支持:
(1)Connector节点加入 redirectPort="443" proxyPort="443"
//结合实际业务
(2)加入新的Value节点
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="x-forwarded-for"
remoteIpProxiesHeader="x-forwarded-by"
protocolHeader="x-forwarded-proto"/>
至此nginx配置https完成
接下来我们来实现tomcat服务器的https配置
-
生成证书(使用jdk生成,免费)
(1)在jdk的安装目录\bin\keytool.exe下打开keytool.exe(2)执行命令:
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"
(3)按要求填写对应信息后执行完毕,到指定目录查找证书文件
-
修改tomcat服务器配置server.xml
定位到tomcat服务器的安装目录, 找到conf下的server.xml文件,修改端口配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="g:\tomcat.keystore"
keystorePass="123456" />
- 重启tomcat,访问
https://localhost:8443/
至此tomcat配置https完成
最后一块内容,修改springboot的内置服务器使用https
- 证书创建直接参考上述tomcat证书的生成流程
- 修改配置application.yml
server.port=8083
server.ssl.key-store=server.keystore //证书位置
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS
证书可以放在绝对路径也可以放到系统的根路径下
- 配置http访问自动转https访问(可以不做,同时支持http和https请求)
向spring容器中注入两个Bean,代码如下
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}