【无标题】

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

相关推荐
Devin~Y7 分钟前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
蜡台12 分钟前
IDEA 一些 使用配置和插件
java·ide·intellij-idea
磊 子37 分钟前
redis详解2
java·spring boot·redis
白露与泡影37 分钟前
Java面试题库及答案解析(2026版)
java·开发语言·面试
程序员阿明1 小时前
spring boot3 集成jjwt(java-jwt)版本的
java·spring boot·python
bbq粉刷匠1 小时前
Java--剖析synchronized
java·开发语言
ayt0071 小时前
Netty AbstractNioChannel源码深度剖析:NIO Channel的抽象实现
java·数据库·网络协议·安全·nio
Gofarlic_OMS1 小时前
装备制造企业Fluent许可证成本分点典型案例
java·大数据·开发语言·人工智能·自动化·制造
码王吴彦祖1 小时前
顶象 AC 纯算法迁移实战:从补环境到纯算的完整拆解
java·前端·算法
开心码农1号2 小时前
Java rabbitMQ如何发送、消费消息、全套可靠方案
java·rabbitmq·java-rabbitmq