Tomcat的SSL证书配置以及Tomcat+Nginx实现SSL配置
- request.getScheme() //总是 http,而不是实际的http或https
- request.isSecure() //总是false(因为总是http)
- request.getRemoteAddr() //总是 nginx 请求的 IP,而不是用户的IP
- request.getRequestURL() //总是 nginx 请求的URL 而不是用户实际请求的 URL
- response.sendRedirect( 相对url ) //总是重定向到 http 上 (因为认为当前是 http 请求)
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For"
protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>
----------------------------------------------------------------------------------------------------
一、转为PFX
openssl pkcs12 -export -in 【服务器证书】 -inkey 【私钥】 -out server.pfx -certfile 【证书链】
例
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx -certfile DigiCertCA.crt
设置密码为:123456
二、转PFX为jks
keytool -importkeystore -v -srckeystore 【pfx文件】 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore 【jks文件】 -deststoretype jks -deststorepass 123456
例
keytool -importkeystore -v -srckeystore server.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore server.jks -deststoretype jks -deststorepass 123456
三、tomcat配置
修改配置文件
打开 server.xml 文件找到如下段落即为配置您的服务器证书所相关的配置。
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" 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"
keystoreFile="conf\[keystore_name]" keystorePass="password"
clientAuth="false" sslProtocol="TLS" />
注意:记得将<!--和-->这对符号删除,否则该段落配置将被屏蔽。
修改完毕保存退出后, 您可以尝试启动 Tomcat 服务, 测试是否可以正常通过 https 方式访问您的域名。 测试成功后请务必妥善备份您的密钥库 (keystore)
---------------------------------------------------------------------------------------------------------
把jks上传到java容器在的服务器上,路径只要不是webapps下就可以,然后到conf目录下server.xml里配置
<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLSv1+TLSv1.1+TLSv1.2" SSLCipherSuite="ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4" keystoreFile="/data/ifengsite/java/_.ihouse.ifeng.com.jks" keystorePass="wjoyxt" />
这个connector元素默认被注释掉的,打开注释后添加一些属性,如:
keystoreFile指向刚才的jks文件
keystorePass值为jks密码,就是证书的密码。
Port是端口
SSLEnable是开启ssl的意思。
保存修改后重启容器即可。
Java容器中的http自动跳转https的安全配置
1、到conf目录下的web.xml,在</welcome-file-list>后面,也就是倒数第二段里,加上这样一段
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
这步目的是让非ssl的connector跳转到ssl的connector去。所以还要配置一步。
2、到server.xml去修改
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="443" />
redirectPort改成ssl的connector的端口443
重启后便会生效。
----------------------------------------------------------------------------------------
Nginx+Tomcat配置SSL:
Tomcat本身不需要配置SSL,只需要在Nginx进行反向代理配置即可
Nginx.conf配置示例:
upstream mobileserver { server 10.0.10.45:8888 max_fails=3 fail_timeout=60 weight=1; server 10.0.10.46:8888 max_fails=3 fail_timeout=60 weight=1; } server { listen 443 ssl; access_log /data/logs/nginx/world_access.log; server_name world.ihouse.ifeng.com; location / { proxy_pass http://mobileserver/; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; } location ~* \.(html|shtml|htm|inc|log)$ { expires 1m; } location ~* \.(css|js)$ { expires 1m; } location ~* ^.+\.(jpg|jpeg|gif|swf|mpeg|mpg|mov|flv|asf|wmv|avi|ico)$ { expires 15d; } ssl on; ssl_certificate /data/ifengsite/htdocs/_.house.com.crt; ssl_certificate_key /data/ifengsite/htdocs/_.house.com.key; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:HIGH:!aNULL:!MD5:!ADH:!DH; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; }