JAVA原生Https Server安全设置

针对使用Java原生库com.sun.net.httpserver.HttpsServer搭建HTTPS服务时出现的安全问题,如弱DH参数、不安全的协商及SSLv3支持等,本文详细介绍了具体的解决方案,包括更新密钥库、限制加密套件及协议版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中遇到的问题,在网上搜寻了好久终于解决了,资料很少,所以记录下来以供其他人查阅。
因为项目需要提供https请求服务,然而部门内又没有web方向的开发人员,领导又懒得去找其他部门帮忙,所以无奈把这个任务交给了我这样懂一点点java的人来做。
我大学虽然学的是java、jsp,但是说实话几年过去了,这些个知识早就还给老师了,哪里还记得怎么用,所以临时抱佛脚,发现以前一个项目里面用java原生的https server开发的东西,所以拿来借鉴一下,结果漏洞扫描扫描到了多个漏洞,多是关于SSL3.0的问题,网上大部分是tomcat的解决方案,奈何我大java还没有办法了么,最终还是解决了。
我使用com.sun.net.httpserver.HttpsServer来实现https server的服务,网上例子有很多,我就不再复述了。
在修改前,使用sslscan工具扫描结果是这样的:
这里写图片描述
这里面存在多个漏洞:

  1. SSL/TLS服务器瞬时Diffie-Hellman公共密钥过弱
  2. 支持SSLInsecureRenegotiation
  3. 支持SSLv3

解决方法(java版本1.7.0_67):

  1. SSL/TLS服务器瞬时Diffie-Hellman公共密钥过弱
    这个问题主要是由于java使用的加密套件不安全,以及密钥库位数太低导致的,容易被破解,所以从这两个方向来解决这个问题:
    • 解决密钥库位数太低:使用java工具重新生成秘钥库,生成时选择RSA加密,且秘钥长度设置2048位;
    • 解决加密套件不安全的问题:限制https服务支持的加密套件,选用非DHE的,这里有一些推荐
      public static final String[] CIPHER_ARRAY = {"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256","TLS_RSA_WITH_AES_128_CBC_SHA256",
      "TLS_RSA_WITH_AES_128_CBC_SHA","TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"};
  2. 支持SSLInsecureRenegotiation
    这个问题使用系统参数修正即可,这个方法是网上找到的,但是没有扫描工具来验证,仅供参考
    System.setProperty("sun.security.ssl.allowUnsafeRenegotiation","false");
    System.setProperty("sun.security.ssl.allowLegacyHelloMessages","false");
  3. 支持SSLv3
    这个问题跟密码套件一样,限制服务端支持的协议即可,参考:
    public static final String[] PROTOCOL_ARRAY = { "TLSv1", "TLSv1.1", "TLSv1.2"};

下面重点来了,如何设置密码套件和支持的协议呢,目前唯一可以使用的方法:

final HttpsConfigurator configurator = new HttpsConfigurator(sslContext) {
            @Override
            public void configure(HttpsParameters params) {
                final SSLContext context = this.getSSLContext();
                SSLParameters cntp = context.getDefaultSSLParameters();//获取当前配置参数

                cntp.setCipherSuites(CIPHER_ARRAY);//修改配置限制支持的加密套件
                cntp.setProtocols(PROTOCOL_ARRAY);//修改配置限制支持的协议
                cntp.setNeedClientAuth(true);
                cntp.setWantClientAuth(true);
                params.setSSLParameters(cntp);//修改配置
            }
        };
        https.setHttpsConfigurator(configurator);
        https.start();

这个方法是每次请求到达服务器后回调的一个方法,只有在这个里面修改,才能生效,之前有帖子说在外面用getEngine()方法设置,我试了根本不起作用,外面只能获取,不能设置,只有在这个回调中才能修改。
修改后的扫描结果:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值