HTTPS 是由 HTTP+ SSL/TLS构成。所以在我个人的理解中。HTTP转HTTPS 的配置不应该在软件的业务代码中体现出来,而是应该在配置文件中统一配置。比如在tomcat、nginx中配置HTTPS。
废话不多说,先从基础来。作为开发人员,我们讲究的高效低成本,所以为开发环境申请正式的域名以及ssl证书这是不合理,当然有钱任性也可以。但是作为专研技术的我们,还是从技术上解决问题。
开发环境:win10、jdk1.8、
一:生成基础keystore
开发命令介绍:win+r 进入命令操作界面
keytool
-genkey
-alias tomcat(别名) 可以是cat、dog等自己喜欢的,但是一般设为配套的应用名称
-keypass 123456(别名密码)
-keyalg RSA(生证书的算法名称,RSA是一种非对称加密算法)
-keysize 1024(密钥长度,证书大小)
-validity 365(证书有效期,天单位)
-keystore W:/tomcat.keystore(指定生成证书的位置和证书名称)
-storepass 123456(获取keystore信息的密码)
- storetype (指定密钥仓库类型)
生成keystore文件
## 在cmd命令界面输入:keytool -genkey -alias cat -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore F:/test/https/cat.keystore -storepass 123456
## 会出现如下的情况:
您的名字与姓氏是什么?
[Unknown]: cat
您的组织单位名称是什么?
[Unknown]: cat
您的组织名称是什么?
[Unknown]: cat
您所在的城市或区域名称是什么?
[Unknown]: nj
您所在的省/市/自治区名称是什么?
[Unknown]: js
该单位的双字母国家/地区代码是什么?
[Unknown]: cn
CN=cat, OU=cat, O=cat, L=nj, ST=js, C=cn是否正确?
[否]: y //输入 y 然后回车键
Warning: //警告可以不用理会
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore F:/test/https/cat.keystore -destkeystore F:/test/https/cat.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
到了这一步,我们其实已经成功了。到时候就可以在对应的文件下找这个文件了:
这个文件已经满足配置tomcat这个容器了。但是要配置nginx还不够,需要通过这个“cat.keystore”生成证书cer和其他密钥文件。
二:利用keystore导出证书
执行这句话:
keytool -export -alias cat -keystore F:/test/https/cat.keystore -storepass 123456 -rfc -file F:/test/https/cat.cer
获取:
三:使用java代码获取密钥,并将其解密
Java代码,将上述keystore处理后会输出一堆字符串,然后将这个字符串保存为cat.txt,然后修改为cat.key文件;
package demo;
import sun.misc.BASE64Encoder;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.*;
import java.security.cert.CertificateException;
public class NginxHttpsKeyFile {
private static KeyStore getKeyStore(String path,String pwd) throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException {
FileInputStream fis=new FileInputStream(path);
KeyStore ks=KeyStore.getInstance("JKS");
ks.load(fis,pwd.toCharArray());
return ks;
}
public static void main(String[] args) throws CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException, UnrecoverableKeyException {
BASE64Encoder encoder=new BASE64Encoder();
KeyStore ks=getKeyStore("F:\\test\\https\\cat.keystore","123456");
PrivateKey pk= (PrivateKey) ks.getKey("cat","123456".toCharArray());
String encode=encoder.encode(pk.getEncoded());
System.out.println("-----BEGIN RSA PRIVATE KEY-----\n"+encode+"\n-----END RSA PRIVATE KEY-----");
}
}
执行后,获取如下字符串,
-----BEGIN RSA PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIsnqDTDHqf612VAWP6kQz2x0oMg
/CGo4ZoKBzPwmDefrXZRzRb6nNJzZU15Q8nQ8Kf9DKTIvpotNexey9XH6i4pQSZcTAKWf3YV3GpO
iK2sahVJmZv/ZW07qvL6AgVmVoYjq7rc0A0IHV3kWvQrOFM3b24LuDwpFX/qar+PFjWpAgMBAAEC
gYAK3FaBf7UV0TscePA5N6LT3twaRenHysGI3z1+rUmEFd9Y+7txDrBMsJr4d/11c+xEgDiLZ+uQ
ZvTtdNyd29OIFtAypaMIwtdE6Qocv4DHou8si7g2gkuotCiLmHxm16FniKP+U/v0V5XyzD8VgaOy
RsZRGVIKcrDgmFS1jGqcgQJBAON1qz9UwdyVbN10lD9HIG9Waj3rYzsZ4r+RMLVmFeCjUc/F8L1u
ghvOXV3fptdDxSp7PwdGQ5UNhY2qmu1yrZECQQCcnYNUVfm2jzWyxiON9BGupa/OO4xffP1Bh+3C
SC/7zZJq1/pFTc6ct2KC4lClH9nzf9OL0gbBaMIY0aqOT9qZAkB9Yt0uwStIzLpBbcVXCH9xwKI6
VerSppdfYMsIBCllNsKflY767dMdPuorGGHhYoNqwpvhB7Ozk8ueZ4CWClRxAkBZz4HWRQ9T/z/d
6v3Mk5/oNR9h9ogC4hwhDh/r/5V0omhKWNwuDfZjrE4TnFB+wIsttanMTn6NPtO/g8x4m5ZRAkEA
oDKWeHvDtRXvgSFO7DIR0qvl2k4nq3xqrpvMl+p2ynOyMEAfaheiIV/V3dYbY0+hDl7/zzEC20Qr
T5eS+/l2+g==
-----END RSA PRIVATE KEY-----
另存cat.key文件
四:使用openssl工具获取不加密的密钥(可以用来配置nginx)
执行如下命令:
rsa -in F:/test/https/cat.key -out F:/test/https/cat.key.unsecure
执行流程图如下:
获取到对应的文件:
上述为一次开发过程所需的证书。后续会有详细讲解及相关应用插件的操作指导