之前配置HTTPS协议都是直接网上找例子照搬,最近配置公司服务器时发现分布式服务配置存在很多问题,于是写一下配置过程,记录一下
分布式系统中大部分会使用到nginx+tomcat实现服务部署及负载均衡,尤其时springboot流行起来后,直接一个jar包放到服务器运行,使用内置tomcat,今天主要就是从一下几个模块开讲。
nginx配置httpstomcat配置httpsspringboot配置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,后者是443http的连接很简单,是无状态的;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; }