【无标题】

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

相关推荐
青衫码上行2 小时前
【Java Web学习 | 第三篇】CSS(2) - 元素显示模式
java·前端·学习
小王不爱笑1323 小时前
Maven 进阶与私服架构
java·架构·maven
重整旗鼓~3 小时前
32.图片上传功能
java·redis
菜鸡儿齐3 小时前
ThreadLocal介绍
java·开发语言
lcu1113 小时前
Java 学习25:break 和 continue 语句
java
Icoolkj3 小时前
手机物理内存云共享—技术挑战与突破路径分析
java·服务器·智能手机
Hello.Reader3 小时前
Flink DataStream API 基础构件DataStream × Partitioning × ProcessFunction
java·大数据·flink
今日说"法"3 小时前
Rust 内存泄漏的检测与防范:超越安全的实践指南
java·安全·rust
欠你一个bug3 小时前
Java设计模式应用--装饰器模式
java·设计模式·装饰器模式