Nginx配置springboot+vue项目http跳转https

java生成证书

添加依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.69</version></dependency>
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.BasicConstraints;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.asn1.x509.KeyUsage;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;import javax.security.auth.x500.X500Principal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Calendar;
import java.util.Date;/*** @Author: moses* @Date: 2023/7/4*/
public class HttpsUtil {//CN=名字与姓氏, OU=组织单位名称, O=组织名称, L=城市或区域名称, ST=省/市/自治区名称, C=双字母国家/地区代码public static final String NAME = "CN=moses, OU=glory2020.cn, O=glory2020, L=beijing, ST=beijing, C=CN";public static final String ALIAS = "king";public static final String PASSWORD = "!QAZ2wsx";public static void main(String[] args) throws Exception {GenerateNginxHttpsCertificate("ruoyi", "/Users/fanshaorong/Desktop/Program/ssl", "cert");}// yesterdaypublic static Date getStartDate() {Calendar startC = Calendar.getInstance();startC.add(Calendar.DAY_OF_YEAR, -1);Date startDate = startC.getTime();return startDate;}// one year from nowpublic static Date getEndDate() {Calendar endC = Calendar.getInstance();endC.add(Calendar.YEAR, 10);Date endDate = endC.getTime();return endDate;}public static void GenerateNginxHttpsCertificate(String hostname, String filePath, String filename) throws NoSuchAlgorithmException, IOException, InvalidKeySpecException, CertificateException, OperatorCreationException {// Generate key pairKeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");generator.initialize(4096);KeyPair keyPair = generator.generateKeyPair();// Create certificateX500Principal issuer = new X500Principal(NAME);X500Principal subject = new X500Principal(NAME);X500Name issuerName = new X500Name(issuer.getName());X500Name subjectName = new X500Name(subject.getName());// yesterdayDate startDate = getStartDate();// one year from nowDate endDate = getEndDate();X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(issuerName, new BigInteger(64, new SecureRandom()), startDate, endDate, subjectName, keyPair.getPublic());ASN1Encodable[] subjectAlternativeNames = new ASN1Encodable[]{new GeneralName(GeneralName.dNSName, hostname),//  new GeneralName(GeneralName.dNSName, "www.example.com"),// new GeneralName(GeneralName.iPAddress, "192.168.0.1")};byte[] sanExtensionValue = new DERSequence(subjectAlternativeNames).getEncoded(ASN1Encoding.DER);// String dns1 = "DNS:" + hostname;Extension dns = new Extension(Extension.subjectAlternativeName, false, sanExtensionValue);builder.addExtension(dns);// 添加基本约束扩展BasicConstraints basicConstraints = new BasicConstraints(true);builder.addExtension(Extension.basicConstraints, true, basicConstraints.getEncoded());builder.addExtension(Extension.keyUsage, true, new KeyUsage(KeyUsage.keyCertSign | KeyUsage.cRLSign));// 添加Subject Key Identifier扩展builder.addExtension(Extension.subjectKeyIdentifier, false, new JcaX509ExtensionUtils().createSubjectKeyIdentifier(keyPair.getPublic()));// SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(keyPair.getPublic().getEncoded());// 添加Authority Key Identifier扩展builder.addExtension(Extension.authorityKeyIdentifier, false, new JcaX509ExtensionUtils().createAuthorityKeyIdentifier(keyPair.getPublic()));ContentSigner signer = new JcaContentSignerBuilder("SHA256WithRSAEncryption").build(keyPair.getPrivate());X509Certificate certificate = new JcaX509CertificateConverter().getCertificate(builder.build(signer));saveCertToFile(filePath, filename, certificate, keyPair);}public static void saveCertToFile(String filePath, String filename, X509Certificate certificate, KeyPair keyPair) throws IOException, CertificateEncodingException, NoSuchAlgorithmException, InvalidKeySpecException {// Write key pair and certificate to filesFileOutputStream keyOut = new FileOutputStream(filePath + File.separator + filename + ".private.key");keyOut.write(keyPair.getPrivate().getEncoded());keyOut.close();FileOutputStream certOut = new FileOutputStream(filePath + File.separator + filename + ".crt");certOut.write(certificate.getEncoded());certOut.close();FileOutputStream out = new FileOutputStream(filePath + File.separator + filename + ".pem");JcaPEMWriter writer = new JcaPEMWriter(new java.io.OutputStreamWriter(out));writer.writeObject(certificate);writer.close();out.close();PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyPair.getPrivate().getEncoded());KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey key = keyFactory.generatePrivate(keySpec);FileOutputStream keyout = new FileOutputStream(filePath + File.separator + filename + ".key");JcaPEMWriter keywriter = new JcaPEMWriter(new java.io.OutputStreamWriter(keyout));keywriter.writeObject(key);keywriter.close();keyout.close();try {//创建一个空的keystoreKeyStore keyStore = null;keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);//将密钥对保存到keystore中char[] password = PASSWORD.toCharArray();X509Certificate[] chain = {certificate};keyStore.setKeyEntry(ALIAS, keyPair.getPrivate(), password, chain);//将keystore保存到文件try (FileOutputStream fos = new FileOutputStream(filePath + File.separator + filename + ".keystore")) {keyStore.store(fos, password);}} catch (KeyStoreException | CertificateException e) {e.printStackTrace();}}
}

复制keystore到springboot资源目录,修改application.yml配置

  ssl:key-store: classpath:cert.keystorekey-store-password: '!QAZ2wsx'key-store-type: JKSenabled: true

 启动项目

nginx配置

开启ssl

server {listen       443 ssl;server_name  localhost;ssl_certificate      /Users/fanshaorong/Desktop/Program/ssl/cert.pem;ssl_certificate_key  /Users/fanshaorong/Desktop/Program/ssl/cert.key;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;#location / {#    root   html;#    index  index.html index.htm;#}location / {root   /Users/fanshaorong/Desktop/Project/RuoYi-Vue3/ruoyi-ui;try_files $uri $uri/ /index.html;index  index.html index.htm;}location ~ /test-api {proxy_ssl_certificate     /Users/fanshaorong/Desktop/Program/ssl/cert.pem;proxy_ssl_certificate_key /Users/fanshaorong/Desktop/Program/ssl/cert.key;proxy_ssl_protocols       TLSv1 TLSV1.1 TLSv1.2;proxy_ssl_ciphers         ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;proxy_ssl_session_reuse  on;proxy_redirect off;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass https://localhost:9091;}}

 

server {listen       81;server_name localhost;return 301 https://$host$request_uri;#rewrite ^(.*)$  https://$host$1 permanent;	
}

 

重启nginx -s reload

访问localhost:81将跳转到https://localhost/login?redirect=/index

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Layout-静态模板结构搭建、字体图标引入、一级导航渲染、吸顶导航交互实现、Pinia优化重复请求【小兔鲜Vue3】

Layout-静态模板结构搭建 Layout模块静态模板搭建 LayoutNav.vue <script setup></script><template><nav class"app-topnav"><div class"container"><ul><template v-if"true"><li><a h…

Eclipse中有用的快捷键

Eclipse中有的快捷键自己记不清楚&#xff0c;但用起来又很方便&#xff0c;遇到了就放在这边备忘。 【CtrlO】快速定位某个类中的属性、方法 有时候&#xff0c;一个类中的属性、方法比较多&#xff0c;想用快捷键快速查找&#xff0c;提升效率。 举例&#xff1a;我想查找…

解决React18+ts项目导入模块的声明报错

路径配置 项目路径别名的配置 ts对指向src的目录提示是不支持的 所以需要手动配置符号指向 在vite.config.ts import path from path export default defineConfig({plugins:[react()],resolve:{alias:{"":path.resolve(__dirname, ./src)}} })但这时path模块引入会…

ubuntu git clone 失败

命令行报错如下&#xff1a; gitxxx.xx.com: Permission denied (publickey). fatal: 无法读取远程仓库。修改步骤&#xff1a; 1、.ssh权限配置问题 .ssh 文件夹权限 755 或 700 config 文件权限 644 id_rsa 文件权限 600 id_rsa.pub 文件权限 644 r&#xff1a;read 代表读…

基于pyqt和卷积网络CNN的中文汉字识别

直接上效果演示图&#xff1a; 通过点击按钮可以实现在画板上写汉字识别和加载图片识别两个功能。 视频演示和demo仓库地址在b站视频001期&#xff1a; 到此一游7758258的个人空间-到此一游7758258个人主页-哔哩哔哩视频 所有代码展示&#xff1a; 十分的简洁&#xff0c;主…

【Android Framework系列】第4章 PMS原理

1 PMS简介 PMS&#xff08;PackageManagerService&#xff09;是Android提供的包管理系统服务&#xff0c;它用来管理所有的包信息&#xff0c;包括应用安装、卸载、更新以及解析AndroidManifest.xml。通过解析每个安装应用的AndroidManifest.xml&#xff0c;将xml中的数据全部…

易基因: RRBS揭示基于DNA甲基化驱动基因的肾透明细胞癌预后模型的鉴定和验证|项目文章

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肾细胞癌&#xff08;RCC&#xff09;是最常见的肾癌亚型&#xff0c;每年超400万例新发病例&#xff0c;是泌尿系统恶性肿瘤导致的第二大死因。2%-70%的RCC为透明细胞RCC&#xff08;Cl…

HotSpot 垃圾收集器

HotSpot 垃圾收集器 HotSpot 虚拟机提供了多种垃圾收集器&#xff0c;每种收集器都有各自的特点&#xff0c;虽然我们要对各个收集器进行比较&#xff0c;但并非为了挑选出一个最好的收集器。我们选择的只是对具体应用最合适的收集器。 新生代垃圾收集器 Serial 垃圾收集器&am…

Spring Boot 整合 分布式搜索引擎 Elastic Search 实现 我附近的、酒店竞排

文章目录 ⛄引言一、我附近的酒店⛅需求分析⚡源码编写 二、酒店竞价排名⌚需求分析⏰修改搜索业务 ✅效果图⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中…

账号安全总结-业务安全测试实操(27)

电子邮件账号泄露事件 电子邮箱业务基于计算机和通信网的信息传递业务,利用电信号传递和存储信息,为用户传送电子信函、文件数字传真、图像和数字化语音等各类型的信息。电子邮件最大的特点是,人们可以在任何地方、任何时间收、发信件,解决了时空的限制,大大提高了工作效…

【Java用法】Java在Linux下获取当前程序路径以及在Windows下获取当前路径对比

Java在Linux下获取当前程序路径以及在Windows下获取当前路径对比 log.info("分隔符&#xff1a;File.separator[{}]", File.separator); log.info("用户主目录&#xff1a;user.home[{}]", System.getProperties().getProperty("user.home")); l…

MySQL中常用查看锁和事务的SQL语句

MySQL中常用查看锁和事务的SQL语句 当我们在使用MySQL数据库时&#xff0c;了解如何查看锁和事务的状态是非常重要的。这些信息可以帮助我们调试和优化数据库性能&#xff0c;以及解决并发访问的问题。在本博客中&#xff0c;我将介绍一些常用的MySQL查询语句&#xff0c;用于查…