【无标题】

Java同时支持https和http访问

背景

目前,项目原来是使用http访问的,后面因安全要求,需要改成https,但是因为存在对外的接口,所以需要同时支持https和http。

yml配置

原来的端口默认是http的端口,如果在server下面添加https:port配置,会导致整体只支持https,所以需要额外的去配置,key-store属性是证书所在位置,我是直接将resources下面,你也可以用file配置。

复制代码
#http端口
server:
  port: 9993
  servlet:
    context-path: /zjf
    encoding:
      charset: UTF-8
file:
  encoding: UTF-8
logging:
  level:
    com.travelsky.mapper: debug
mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
debug: true

# HTTPS 端口
app:
  https:
    port: 8443
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: "marukozjf@310"
    key-store-type: PKCS12
    key-alias: tomcat
    enabled-protocols: TLSv1.2,TLSv1.3
    ciphers: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

证书生成命令

keystore

证书生成位置

storepass(存储密码)

这是用于保护整个密钥库(keystore)的密码。密钥库是一个文件,它可以包含多个密钥对(每个密钥对都有一个别名)。storepass是访问这个密钥库文件的密码。也就是说,当你想要打开密钥库文件(例如,查看里面的证书或密钥)时,需要提供这个密码。

keypass(密钥密码)

这是用于保护密钥库中特定私钥的密码。每个密钥对(由别名标识)都可以有自己的密钥密码。当你想要使用某个私钥(例如,在SSL连接中用于身份验证)时,需要提供这个密钥的密码。

复制代码
keytool -genkeypair -alias tomcat -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore "D:/maruko/keystore.p12" -validity 3650 -storepass "maruko@2025" -keypass "maruko@2025" -dname "CN=localhost, OU=Development, O=Company, L=City, ST=State, C=US" -ext "SAN=DNS:localhost,IP:127.0.0.1"

配置类

bash 复制代码
import org.apache.catalina.connector.Connector;
import org.apache.coyote.http11.Http11NioProtocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

/**
 *
 * @author maruko
 * @version JDK 8
 * @name HttpHttpsConfig
 * @date 2025/10/30
 * @description
 */
@Configuration
public class HttpHttpsConfig {

    @Value("${app.https.port}")
    private int httpsPort;

    @Value("${app.ssl.key-store-password}")
    private String password;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addAdditionalTomcatConnectors(createSslConnector());
        return factory;
    }

    private Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();

        connector.setScheme("https");
        connector.setSecure(true);
        connector.setPort(httpsPort);

        protocol.setSSLEnabled(true);
        protocol.setKeystoreFile(getKeystoreFilePath());
        protocol.setKeystorePass(password);
        protocol.setKeystoreType("PKCS12");
        protocol.setKeyAlias("tomcat");

        return connector;
    }

    private String getKeystoreFilePath() {
        try {
            return new ClassPathResource("keystore.p12").getFile().getAbsolutePath();
        } catch (Exception e) {
            throw new RuntimeException("无法找到 keystore 文件", e);
        }
    }
}

nginx配置

bash 复制代码
    # 自签名证书配置(开发环境)
	listen       443 ssl;  # 启用 SSL
    ssl_certificate /opt/app/nginx/ssl/dcs.crt;
    ssl_certificate_key /opt/app/nginx/ssl/dcs.key;

linux生成证书

bash 复制代码
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /opt/app/nginx/ssl/dcs.key -out /opt/app/nginx/ssl/dcs.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=TravelSky/OU=Development/CN=localhost"

设置权限

sudo chmod 600 /opt/app/nginx/ssl/dcs.key

sudo chmod 644 /opt/app/nginx/ssl/dcs.crt

校验conf

sudo /opt/app/nginx/sbin/nginx

重启nginx

sudo /opt/app/nginx/sbin/nginx -s reload

相关推荐
许彰午13 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
YaBingSec13 小时前
玄机网络安全靶场:Apache HTTPD 解析漏洞(CVE-2017-15715)WP
java·笔记·安全·web安全·php·apache
书源丶14 小时前
三十二、Java集合(一)——Collection与List全家桶
java·windows·list
AI人工智能+电脑小能手14 小时前
【大白话说Java面试题】【Java基础篇】第21题:HashMap和Hashtable的区别是什么
java·开发语言·面试·哈希算法·散列表·hash table
慕容卡卡14 小时前
Claude 使用神器(web页面)--CloudCLI UI
java·开发语言·前端·人工智能·ui·spring cloud
Sylvia-girl14 小时前
C++内存如何管理?
java·jvm·c++
极创信息14 小时前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
_日拱一卒14 小时前
LeetCode:146LRU缓存
java·开发语言
StockTV14 小时前
韩国股票实时数据 KOSPI(主板)和 KOSDAQ(创业板)的实时行情、K 线及指数数据
java·开发语言·算法·php
Java成神之路-14 小时前
面试题:SpringMVC执行流程(视图版+前后端分离版)
java·springmvc