【无标题】

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

相关推荐
WayneJoon.H5 小时前
Java反序列化 CC7链分析
java·安全·网络安全·cc链·反序列化
liu_bees6 小时前
Jenkins 中修改 admin 账号密码的正确位置与方法
java·运维·tomcat·jenkins
明洞日记6 小时前
【设计模式手册011】享元模式 - 共享细粒度对象的高效之道
java·设计模式·享元模式
G皮T6 小时前
【Java】Java 运行时数据区域(一):名词概念
java·jvm·runtime·运行时·运行时数据区域
z***y8626 小时前
Java数据挖掘开发
java·开发语言·数据挖掘
鱼锦0.06 小时前
基于spring+vue把图片文件上传至阿里云oss容器并回显
java·vue.js·spring
從南走到北6 小时前
JAVA国际版同城跑腿源码快递代取帮买帮送同城服务源码支持Android+IOS+H5
android·java·ios·微信小程序
q***09807 小时前
Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
java·spring boot·后端
q***14647 小时前
oracle 12c查看执行过的sql及当前正在执行的sql
java·sql·oracle
好好研究7 小时前
SpringMVC框架 - 获取请求参数常用的注解
java·spring·mvc