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。

到了这一步,我们其实已经成功了。到时候就可以在对应的文件下找这个文件了:

java生成ssl证书 jdk生成https证书_https

这个文件已经满足配置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生成ssl证书 jdk生成https证书_jdk_02

三:使用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文件

java生成ssl证书 jdk生成https证书_jdk_03

四:使用openssl工具获取不加密的密钥(可以用来配置nginx)

执行如下命令:

rsa -in F:/test/https/cat.key -out F:/test/https/cat.key.unsecure

执行流程图如下:

java生成ssl证书 jdk生成https证书_https_04

获取到对应的文件:

java生成ssl证书 jdk生成https证书_https_05

上述为一次开发过程所需的证书。后续会有详细讲解及相关应用插件的操作指导