赞
踩
今天项目中需要配置https协议,同时支持http和https两种协议,使用的tomcat服务器,并使用nginx做了转发。
网上关于配置tomcat的https协议文章有很多,在此整理一下。
一、配置tomcat支持https协议
需要两步:生成安全证书和配置tomcat。
1.首先,生成安全证书
Java环境:因为SUN公司提供了制作证书的工具keytool。
在JDK 1.4以后的版本中都包含了这一工具,它的位置为<JAVA_HOME>\bin\keytool.exe。
使用cmd命令行,切换目录至tomcat安装目录下的bin文件夹,使用命令进行创建。
创建证书的命令:
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "f:\tomcat.keystore"
参数的意思如下:
这里密码我输的是tomcat,名字与姓氏为域名,其它的根据具体情况输入
以上命令将生产一对非对称密钥和自我签名的证书f:\tomcat.keystore.
将证书保存到你要存放的地方,我的保存在D:\Tools\Web\ssl\tomcat.keystore
注意:“名字与姓氏”应该是域名,输成了姓名,和真正运行的时候域名不符,会出问题
有些公司会希望使用自己的安全证书,这些证书一般都是crt、pem证书,但是tomcat使用的是keystore后缀名证书,这就需要使用工具进行转换,转换工具可网上自行搜索,很多资料。
2.修改tomcat配置文件定位到tomcat的安装目录,找到conf下的server.xml文件,找到如下已经被注释的代码:
<!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"/> -->去掉注释,修改为:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="D:\Tools\Web\ssl\tomcat.keystore" keystorePass="tomcat"/>
这里,密码和证书的位置根据个人的具体环境而设置,属性参数如下所述:
属性 | 描述 |
clientAuth | 如果设为true,表示Tomcat要求所有的SSL客户出示安全证书,对SSL客户进行身份验证 |
keystoreFile | 指定keystore文件的存放位置,可以指定绝对路径,也可以指定相对于<CATALINA_HOME>(Tomcat安装目录)环境变量 的相对路径。如果此项没有设定,默认情况下,Tomcat将从当前操作系统用户的用户目录下读取名为“.keystore”的文件。 |
keystorePass | 指定keystore的密码,如果此项没有设定,在默认情况下,Tomcat将使用“changeit”作为默认密码。 |
sslProtocol | 指定套接字(Socket)使用的加密/解密协议,默认值为TLS,用户不应该修改这个默认值。 |
ciphers | 指定套接字可用的用于加密的密码清单,多个密码间以逗号(,)分隔。如果此项没有设定,在默认情况下,套接字可以使用任意一个可用的密码。 |
到这里,https协议就配置好了,你可以使用https://localhost:8443/ 来访问你的本地项目,验证是否配置成功。
若可以正常访问,你可以再次使用http://localhost:8080/ 来访问你的本地项目,验证原先的http是否可以正常访问。
二、配置nginx
如果你的项目没有使用nginx,请无视以下内容。
我们项目是用java开发的,所以以下内容我以java举例。
在未配置tomcat支持https协议之前,运维只是配置了nginx的http和https请求都转发到tomcat的http协议8080端口,这就导致http请求正常,但是https请求的也是tomcat的http协议8080端口。具体到项目中时,最直观的体现就是浏览器地址明明是https请求,但是jsp页面所有静态资源都没有加载到,比如css、JS。这是因为你在jsp页面使用request.getScheme()获取的访问协议是http。使用https访问项目时,禁止加载http资源。
现在tomcat经过第一步的配置已经同时支持http和https协议,使用nginx转发时,就需要:
1.http通过nginx访问到tomcat时还是http请求8080端口;
2.https通过nginx访问到tomcat时还是https请求8443端口;
配置ngnix,你需要配置两套upstream节点,一套给http使用,另一套给https使用,如下:
upstream http_stream{ server 1.1.1.1:8080; server 1.1.1.2:8080; } upstream https_stream{ server 1.1.1.1:8443; server 1.1.1.2:8443; }接着配置两套server,如下:
大体就是上面这个意思,两个server分别监听两个端口,并将基于当前端口的请求转到当前配置的访问协议。
server { listen 8080; server_name localhost; location / { proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_pass http://域名/项目; } } server { listen 8443; server_name localhost; location / { proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_pass https://域名/项目; } }到此,nginx基本配置好了,在浏览器中分别使用http和https访问域名项目,来查看是否能够访问。
为了少走弯路,还是决定自己在此记录一下,转了一下别人的东西,再加上自己项目中的些许经验,希望能帮到同行吧。
转载地址 http://ln-ydc.iteye.com/blog/1330674
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。