• Tomcat的SSL证书配置以及Tomcat+Nginx实现SSL配置


     
    系统调用https接口时报错:javax.net.ssl.SSLException: Received fatal alert: protocol_version
    原因是由于https接口所在服务器上的https证书设置的TLS版本不兼容所致,所以说支持的TLS的版本越多兼容性越好。
     
    查看以及检测某个网站所支持的TLS版本
     
    #  nmap --script ssl-enum-ciphers -p 443  test.tech.com
     
    ------------------------------------------------------------------------------------------------------------------------------------------------
     
    在代理模式下,Tomcat 如何识别用户的直接请求(URL、IP、https还是http )?
    在透明代理下,如果不做任何配置Tomcat 认为所有的请求都是 Nginx 发出来的,这样会导致如下的错误结果:
    • request.getScheme()  //总是 http,而不是实际的http或https
    • request.isSecure()  //总是false(因为总是http)
    • request.getRemoteAddr()  //总是 nginx 请求的 IP,而不是用户的IP
    • request.getRequestURL()  //总是 nginx 请求的URL 而不是用户实际请求的 URL
    • response.sendRedirect( 相对url )  //总是重定向到 http 上 (因为认为当前是 http 请求)
     
    如果程序中把这些当实际用户请求做处理就有问题了。解决方法很简单,只需要分别配置一下 Nginx 和 Tomcat 就好了,而不用改程序。
    配置 Nginx 的转发选项:
     
    proxy_set_header  Host                     $host;
    proxy_set_header  X-Real-IP               $remote_addr;
    proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
     
    配置Tomcat server.xml 的 Engine 模块下配置一个 Value:

    <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For"
               protocolHeader="X-Forwarded-Proto" protocolHeaderHttpsValue="https"/>

     
    配置双方的 X-Forwarded-Proto 就是为了正确地识别实际用户发出的协议是 http 还是 https。X-Forwarded-For 是为了获得实际用户的 IP。
    这样以上5项测试就都变为正确的结果了,就像用户在直接访问 Tomcat 一样。

    ----------------------------------------------------------------------------------------------------

    一、转为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;
    }
  • 相关阅读:
    rman备份,恢复
    异步事件回调机制原理探索 (转)
    stock
    将知识变成你的技能点
    Tomcat的URL中文乱码解决以及传输优化
    李洪强iOS开发之-入门指南
    WebSocket 和 Socket 的区别
    李洪强iOS开发之-修改状态栏的字体的颜色
    关于UDID和UUID的区别
    李洪强iOS开发之
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/6149266.html
Copyright © 2020-2023  润新知