HTTPS是HTTP的安全版本,旨在提供数据传输层安全性(TLS)。当你的应用不使用HTTP协议的时候,浏览器地址栏就会出现一个不安全的提示。HTTPS加密每个数据包以安全方式进行传输,并保护敏感数据免受窃听者或黑客的攻击。
。为了学习目的,可以使用自签名证书,比如:使用Java Keytool生成自签名证书。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
打开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
keytool -list -v -keystore D:/test.keystore -storepass 123456
# 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
# keytool -printcert -file 证书名
keytool -printcert -file test.cer
特别需要注意的是,私钥是无法从证书库中导出的,因为那样非常不安全。如果你特别需要私钥或是私钥字符串,只能考虑用编程的方式从密钥库文件中去获取了。
由于 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();
}
}
# .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
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 请求,不过对于自定义的证书,需要关闭 SSL 校验:
相关系列文章:
1.Https 生成证书添加至SpringBoot配置
2.Postman请求https接口配置
3.springboot如何配置,同时支持https和http
大家好,我是徐小慧
博客主页:徐小慧_Blog
欢迎 点赞 | 收藏 ⭐ | 留言 如有错误敬请指正!