配置tomcat同时支持http和https协议

今天项目中需要配置https协议,同时支持http和https两种协议,使用的tomcat服务器,并使用nginx做了转发。

网上关于配置tomcat的https协议文章有很多,在此整理一下。

一、配置tomcat支持https协议

需要两步:生成安全证书和配置tomcat。

1.首先,生成安全证书

Java环境:因为SUN公司提供了制作证书的工具keytool。

在JDK 1.4以后的版本中都包含了这一工具,它的位置为\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文件,找到如下已经被注释的代码:

去掉注释,修改为:


这里,密码和证书的位置根据个人的具体环境而设置,属性参数如下所述:

属性 描述
clientAuth 如果设为true,表示Tomcat要求所有的SSL客户出示安全证书,对SSL客户进行身份验证
keystoreFile 指定keystore文件的存放位置,可以指定绝对路径,也可以指定相对于(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 {
        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://域名/项目;
        }
}
大体就是上面这个意思,两个server分别监听两个端口,并将基于当前端口的请求转到当前配置的访问协议。

到此,nginx基本配置好了,在浏览器中分别使用http和https访问域名项目,来查看是否能够访问。


为了少走弯路,还是决定自己在此记录一下,转了一下别人的东西,再加上自己项目中的些许经验,希望能帮到同行吧。

转载地址 http://ln-ydc.iteye.com/blog/1330674

你可能感兴趣的:(java)