https大致原理<br>
1. 公司自己生成<font color="#0076b3">公司公钥</font>和<font color="#0076b3">公司私钥</font>,然提交<font color="#0076b3">公司公钥</font>和<font color="#0076b3">网站信息</font>去ca机构申请证书
2. ca机构将公司提交的<font color="#0076b3">网站信息</font>通过hash(如MD5)算法生成<font color="#0076b3">摘要</font>再通过<font color="#0076b3">ca私钥</font>对摘要进行加密生成<font color="#0076b3">数字签名<br></font> 最终将<font color="#0076b3">公司公钥</font>+<font color="#0076b3">网站信息</font>+<font color="#0076b3">数字签名</font>整合在一起就是<font color="#0076b3">服务器证书</font>
3. 浏览器请求发出tcp三次握手成功后服务器会将<font color="#0076b3">服务器证书</font>发送给浏览器
4. 浏览器会对<font color="#0076b3">服务器证书</font>进行验证,不是符合条件会中断访问,并显示警告提示,主要验证三点<br>
1. 是否过期
2. 是否被吊销
3. 是否权威机构颁发的证书
在浏览器中有内置权威机构的根证书,这个证书里面包含<font color="#0076b3">ca公钥</font>(这个公钥能解密<font color="#0076b3">ca私钥</font>加密的内容)<br>验证是否权威证书步骤如下:<br> 1. 取出<font color="#0076b3">服务器证书</font>中的网站信息进行hash得到<font color="#0076b3">摘要1<br></font> 2. 取出<font color="#0076b3">服务器证书</font>中的<font color="#0076b3">数字签名</font>通过<font color="#0076b3">ca公钥</font>解密得到申请时的<font color="#0076b3">摘要2<br></font> 3. <font color="#0076b3">摘要1</font>和<font color="#0076b3">摘要2</font>相等说明是权威机构颁发的证书
5. 如果上一步符合条件则会产生一个随机字符串并用<font color="#0076b3">服务器证书</font>中的<font color="#0076b3">公司公钥</font>加密发送给服务器端<br>
6. 服务器再通过<font color="#0076b3">公司私钥</font>解密那个随机字符串,后续就用这个字符串对称加密与浏览器交互的数据
通过java的keytool工具生成自签名证书<br>
1. 生成服务器端密钥和证书仓库。(keytool工具在jdk的bin目录中,可把该工具考到其他目录进行生成操作,因为默认会在当前目录生成内容)<br> <font color="#0076b3">keytool -genkey -alias server_cert -keysize 2048 -keypass 123456 -keyalg RSA -validity 365 -dname "CN=localhost" -storepass 123456 -keystore server.jks</font><br>
2. 导出服务器端自签名证书<br> keytool -export -alias server_cert -keystore server.jks -storepass 123456 -file server.cer<br>
3. 生成客户端密钥和证书仓库<br> <font color="#0076b3">keytool -genkey -alias client_cert -keysize 2048 -keypass 123456 -keyalg RSA -validity 365 -dname "CN=localhost" -storepass 123456 -keystore client.jks</font><br>
4. 将服务器端证书导入到客户端授信证书仓库中,如果只需要单向认证,则到这一步就可以接受了,因为后面步骤是添加客户端证书到服务器端的信任证书仓库中<br> <font color="#0076b3">keytool -import -trustcacerts -alias securechat -file server.cer -storepass 123456 -keystore client.jks</font><br>
5.生成客户端自签名证书<br> <font color="#0076b3">keytool -export -alias client_cert -keystore client.jks -storepass 123456 -file client.cer</font><br>
6. 将客户端的自签名证书导入到服务器端的信任证书仓库中<br> <font color="#0076b3">keytool -import -trustcacerts -alias securechat -file client.cer -storepass 123456 -keystore server.jks</font>