Https 生成证书添加至SpringBoot配置

前言

HTTPS是HTTP的安全版本,旨在提供数据传输层安全性(TLS)。当你的应用不使用HTTP协议的时候,浏览器地址栏就会出现一个不安全的提示。HTTPS加密每个数据包以安全方式进行传输,并保护敏感数据免受窃听者或黑客的攻击。
。为了学习目的,可以使用自签名证书,比如:使用Java Keytool生成自签名证书。

一、keytool生成keystore

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

1. 生成 keystore 文件

打开CMD, 进入java/bin目录

D:\java\jdk\bin>keytool -genkeypair -alias test -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/test.keystore -storepass 123456

步骤如下图:
在这里插入图片描述

2. 查看 keystore 文件详细信息

keytool -list -v -keystore D:/test.keystore -storepass 123456

3. 从 keystore 中导出证书(公钥)

# keytool -export -alias 别名 -keystore keystore文件 -rfc -file 生成的证书名
keytool -export -alias test -keystore test.keystore -rfc -file test.cer
# .cer 转换成 .crt
openssl x509 -inform PEM -in test.cer -out test.crt

4.查看证书详情

# keytool -printcert -file 证书名
keytool -printcert -file test.cer

5.从 keystore 中导出私钥

特别需要注意的是,私钥是无法从证书库中导出的,因为那样非常不安全。如果你特别需要私钥或是私钥字符串,只能考虑用编程的方式从密钥库文件中去获取了。

由于 jdk 命令无法生成 key,所以需要用代码从 keystore 文件中读取私钥 base64 编码数据,然后格式化为一行64个字符

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import sun.misc.BASE64Encoder;

class SllKeyStore {
    private File keystoreFile;
    private String keyStoreType;
    private char[] password;
    private String alias;
    private File exportedFile;

    public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
        try {
            Key key = keystore.getKey(alias, password);
            if (key instanceof PrivateKey) {
                Certificate cert = keystore.getCertificate(alias);
                PublicKey publicKey = cert.getPublicKey();
                return new KeyPair(publicKey, (PrivateKey) key);
            }
        } catch (UnrecoverableKeyException e) {
        } catch (NoSuchAlgorithmException e) {
        } catch (KeyStoreException e) {
        }
        return null;
    }

    public void export() throws Exception {
        KeyStore keystore = KeyStore.getInstance(keyStoreType);
        BASE64Encoder encoder = new BASE64Encoder();
        keystore.load(new FileInputStream(keystoreFile), password);
        KeyPair keyPair = getPrivateKey(keystore, alias, password);
        PrivateKey privateKey = keyPair.getPrivate();
        String encoded = encoder.encode(privateKey.getEncoded());
        encoded = encoded.replaceAll("\n", "");

        //将密钥格式化为一行64个字符
        StringBuilder sb = new StringBuilder(encoded);
        int len = 64;
        while (len < sb.length()) {
            sb.insert(len, "\n");
            len += 65;
        }
        FileWriter fw = new FileWriter(exportedFile);
        fw.write("-----BEGIN RSA PRIVATE KEY-----\r\n");//私钥库文件必须以此开头,否则使用时会出错
        System.out.println(sb + "\n");

        fw.write(sb.toString());
        fw.write("\r\n-----END RSA PRIVATE KEY-----");//私钥库文件必须以此结尾
        fw.close();
    }


    public static void main(String args[]) throws Exception {
        SllKeyStore export = new SllKeyStore();

        // 指定自己的密钥库keystore文件
        export.keystoreFile = new File("D:\\test.keystore");//读取官钥库keystore文件
        export.keyStoreType = KeyStore.getDefaultType();

        // 指定密钥库密码
        String passwordString = "123456"; //密钥库口令
        export.password = passwordString.toCharArray();

        // 指定密钥库别名
        export.alias = "test";//密钥库别名

        // 指定要生成的私钥目录及文件名
        export.exportedFile = new File("D:\\test.key");//生成的私钥文件
        export.export();
    }
}


获得密钥: 在这里插入图片描述

6.转换密钥格式

# .key 转换成 .pem:
openssl rsa -in test.key -out test.pem

# .crt 转换成 .pem:
openssl x509 -in test.crt -out test.pem

# .cer 转换成 .crt
openssl x509 -inform PEM -in test.cer -out test.crt

二、springboot 配置 https

1.将生成的 keystore 文件放到项目的 classpath 目录下,在 application.yaml 配置文件中进行配置:

server:
  port: 8080

  #开启https,配置跟证书一一对应
  ssl:
  	#true表示开启HTTPS访问
    enabled: true
    #指定证书
    key-store: classpath:test.keystore
    #使用上面方法生成的格式为JKS
    key-store-type: JKS
    #默认为TLS,
    protocol: TLS
    #别名
    key-alias: test
    #私钥密码
    key-password: 123456
    #store文件密码
    key-store-password: 123456

三、Postman 发送 https 请求

Postman 不需要配置证书也可以访问 https 请求,不过对于自定义的证书,需要关闭 SSL 校验:
在这里插入图片描述


相关系列文章:
1.Https 生成证书添加至SpringBoot配置
2.Postman请求https接口配置
3.springboot如何配置,同时支持https和http


大家好,我是徐小慧
📢 博客主页:徐小慧_Blog
📢 欢迎 点赞 👍 | 收藏 ⭐ | 留言 📝 如有错误敬请指正!

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值