众所周知,HTTPS通道相对于HTTP通道是比较安全的,HTTPS使用的是RSA非对称128位加密,如果是安全交易类甚至会使用RSA 1024位加密算法,想要突破基于HTTPS协议的网站,你就首先必须突破这个HTTTPS协议,因此,对于高安全交易类的应用等常采用它。
HTTPS是SSL的一种,那么它是如何进行加密传输数据的呢,就是建立一个“信任关系”,先建立起信任关系,然后再开始数据传输,在加密的世界中“建立信任”就需要用到至少2张证书,即ROOTCA, SERVER CA,把这个信任建立的过程称为“Hands Shakes”,握手协议。
既然构建HTTPS通道,必须要有ROOTCA和SERVERCA,而且这张服务器证书是需要由客户端信任的“ROOT”级机构所签发出来的。ROOTCA是全球的根,这个“树”的根是全球任何IE、FireFox、Safari里的证书库里都有这个RootCA的,因为它们是权威,所以全球的电子证书拿它们做“根”.
在实际开发环境中,我们使用Openssl自己来模拟这个ROOTCA,然后用自己模拟出来的ROOTCA去签我们服务器的证书,这个过程就被称为“自签”。一般生成证书由以下几个步骤构成:
A、自签ROOTCA的过程:
1. 生成密钥
a、生成密钥:openssl genrsa -des3 -out ca.key 1024
b、去除ca口令密码:openssl rsa -in ca.key -out ca.key
2. 用密钥产生请求,同时进行“自签”Sign
openssl req -new -x509 -key ca.key -out ca.crt
3导入CA到internet浏览器中
B、生成SERVERCA并用ROOTCA签名的过程
1. 生成一对不对称密钥,即公钥public key和私钥 private key
a、生成密钥:openssl genrsa -des3 -out server.key 1024
b、去除口令密码:openssl rsa -in server.key -out server.key
2. 用密钥产生请求,同时把我的请求交给ROOT机构
openssl req -new -key server.key -out server.csr
3. ROOT机构对我提交的请求进行“签名”Sign
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
生成证书后,就可以将证书部署到web服务器,比如Apache服务器,通过https协议访问相应的应用了。
------------------------------------------------------------------------------------------------------------------------------------------------------------
当Apache HttpServer已经走https协议了,如果你也用到了App Server即tomcat/weblogic/was,因为我们的架构是Web Server + App Server,因此,我们的App Server也必须走https协议。如果只是Web Server走https协议,而App Server没有走https协议,这就叫“假https架构”,是一种极其偷赖和不负责任的做法。概念同产生Apache的HttpServer的证书一样,只是这边的信任域有点不一样。Web的信任域就是你的IE里的内容里的证书里的“根级信任域”,App Server的信任域是打不开也不能访问这块地方的,而且App Server的信任域格式也不是crt文件,而是.jks(javakey store的简称)。
现在使用%JAVA_HOME%\bin目录下的keytool工具来产生证书
1、 生成JKS密钥对,密码使用6个a,alias代表“别名”,CN代表Common Name,必须与主机名完全一致,错了不要怪我自己负责。
keytool -genkey -alias jubaoX509 -keyalg RSA -keysize 1024 -dname "CN=jubao001 , OU=insurance-dart, O=Cognizant, L=SH, S=SH, C=CN" -keypass aaaaaa -keystore jubao.jks -storepass aaaaaa
2、 生成JSK的CSR
keytool -certreq -alias jubaoX509 -sigalg "MD5withRSA" -file jubao.csr -keypass aaaaaa -keystore jubao.jks -storepass aaaaaa
3、使用openssl结合ca.crt与ca.key为jsk的csr来签名认证并产生jks格式的crt
openssl x509 -req -in jubao.csr -out jubao.crt -CA ca.crt -CAkey ca.key -days 3650 -CAcreateserial -sha1 -trustout -CA ca.crt -CAkey ca.key -days 3650 -CAserial ca.srl -sha1 -trustout
4、生成符合x509格式的jks文件
a 将Root CA导入jks信任域
keytool -import -alias rootca -trustcacerts -file ca.crt -keystore jubao.jks -storepass aaaaaa
b 补链:keytool -import -alias shnlap93X509 -file shnlap93.crt -keystore jubao.jks -storepass aaaaaa
生成jubao.jks,那么在tomcat的https协议通道配置中加入secure="true" SSLEnabled="true" clientAuth="false" sslProtocol="TLS" keystoreFile="d:/tomcat/conf/jubao.jks" keystorePass="aaaaaa"。。就可以使用安全的https协议了
测试:如果你是在Apache上启用了https而没有在tomcat上启用https协议,那么我们在tomcat中布署一个servlet,含一条打印语句: System.out.println(“”+request.getScheme()),那么它将打印出来http。反之则是https。
ps:pem格式自签
一、根证书
Openssl genrsa -out ca/cakey.pem 512
Openssl req -new -out ca/careq.csr -key ca/cakey.pem
Openssl x509 -req -in ca/careq.csr -out /ca/cacert.pem -signkey ca/cakey.pem -days 3650
Keytool -import -v -trustcacerts -storepass 111111 -alias caRoot -file ca/cacert.pem -keystore d:\re
二.服务器证书
Keytool -genkey -alias caServer -validity 3650 -keyalg RSA -keysize 512 -keystore server/server.jks
Keytool -certreq -alias caServer -file server/server.csr -keypass 111111 -keystore server/server.jks -storepass 111111
Openssl x509 -req -in server/server.csr -out server/servercert.pem -CA ca/cacert.pem -Cakey ca/cakey.pem -days 3650
Keytool -import -v -trustcacerts -storepass 111111 -alias caRoot-file ca/cacert.pem -keystore server/server.jks
Keytool -import -v -alias cas_server -file server/sercercert.pem -storepass 111111 -keystore server/server.jks