最近处理问题需要本地搭建https的请求,所以查了很多资料,把自己理解写下来
CA证书 是把 网站的公钥,网站域名,等等信息 的签名进行非对称加密,又权威的机构进行认证颁发。非对称加密有公私钥,公钥加密,只能私钥解密。网站保密自己的私钥,公钥放在CA证书发给用户
https 请求客户端验证根证书获得公钥,然后把一串字符串通过公钥加密传给服务器,服务解密获取字符串,字符串用于加盐,双方约定加密方式进行对称加密传输报文(这是简单说法,感兴趣自己查资料或者抓报文自己研究)
springboot配置https
开始本地证书,网上有两种方式keytool和openssl,openssl需要自己搭环境,本人用java,所以用JDK自带的keytool
ctrl+R cmd进入控制台,如果配置了jdk环境变量直接输入keytool,没有按照就cd 进入jdk的bin目录如图
开始用-genkeypair命定生成密钥对 ,不会可以使用keytool -genkeypair -help,中文提示
keytool -genkeypair -alias asso -keyalg RSA -keysize 2048 -keypass 123456 -validity 3650 -keystore C:\opt\asso.jks
有中文提示,这个生成密钥对,放在 -keystore 是密钥库
回车需要输入省市公司等信息,输入完毕确认 y 就可以了
把你刚刚生成文件放到项目下,然后加入配置
server.ssl.key-store=classpath:asso.jks server.ssl.key-alias=asso server.ssl.key-store-password=123456 server.ssl.key-password=123456
springboot 本地https配置完毕
nginx配置https
nginx需要把刚刚的密钥对 用keytool 转换下crt格式:
keytool -exportcert -alias asso -keystore C:\opt\asso.jks -storepass 123456 -rfc -file C:\opt\
asso.crt
用java代码base64的方式打印出私钥
public static PrivateKey getPrivateKey() { try { BASE64Encoder encoder = new BASE64Encoder(); KeyStore ks = getKeyStore("C:\\opt\\asso.jks", "123456"); PrivateKey key = (PrivateKey) ks.getKey("asso", "123456".toCharArray()); String encoded = encoder.encode(key.getEncoded()); System.out.println("-----BEGIN RSA PRIVATE KEY-----"); System.out.println(encoded); System.out.println("-----END RSA PRIVATE KEY-----"); return key; } catch (Exception e) { return null; } } public static KeyStore getKeyStore(String keyStorePath, String password) throws Exception { FileInputStream is = new FileInputStream(keyStorePath); KeyStore ks = KeyStore.getInstance("JKS"); ks.load(is, password.toCharArray()); is.close(); return ks; } public static void main(String[] args) { getPrivateKey(); }
自己建一个文件夹保存私钥
修改ngnix的 *.conf文件server配置,启动
2.可以使用keytool打印出key私钥
keytool -printcert -file C:\opt\asso.crt -rfc