1、测试Https请求的实验环境
服务器:Tomcat 7.0
JDK : 1.8
Android端:Android studio
2、证书的生成
到jdk的bin目录下运行以下命令:
①生成自签名CA:
keytool -genkey -v -alias ca -keyalg RSA -keystore D:\ca_cert_lib.jks -validity 3650
②生成服务器证书:
keytool -genkey -v -alias server -keyalg RSA -keystore D:\server_cert_lib.jks -validity 3650
注意证书名叫ca定义为自签名的CA证书,证书名叫server定义为服务器证书,它们分别保存在证书库路径为 D:\ca_cert_lib.jks 和 D:\server_cert_lib.jks 中。之所以要分自签名的CA证书和server服务器证书,是因为正常情况下我们的server服务器证书是需要向第三方CA申请的,第三方CA会用它的根证书给你生成一份公钥证书(这个过程叫做第三方CA给你签名),而此处就是要自导自演展示自签名的CA给server证书签名这个过程。
3、用自签名的CA给server签上CA的签名
在给server签名之前,查看一下当前证书库情况,它们的确都是各自给自己签名的:
keytool -list -v -keystore D:\ca_cert_lib.jks
keytool -list -v -keystore D:\server_cert_lib.jks
现在使用自签名CA给server签名:
①生成server的证书请求文件:keytool -certreq -alias server -keystore D:\server_cert_lib.jks > D:\server.csr
②使用自签名的CA对server的证书请求文件进行签名颁发服务器server.cer公钥证书:keytool -gencert -alias ca -keystore D:\ca_cert_lib.jks -infile D:\server.csr -outfile D:\server.cer
③生成自签名CA的公钥文件:keytool -export -alias ca -keystore D:\ca_cert_lib.jks -rfc -file D:\ca.cer
此时可以先查看以下ca.cer和server.cer公钥证书具体内容(注意ca.cer是自签名CA的公钥文件,其颁发者还是它自己,而server.cer是server服务器的公钥文件,其颁发者是自签名的CA,两者是有本质区别的。
输入以下命令:
keytool -printcert -rfc -file D:\ca.cer
keytool -printcert -rfc -file D:\server.cer
安装证书回复(将CA颁发的cer公钥证书安装到server服务器端证书库,前提条件是CA的cer公钥证书也需要先被安装)
①先安装CA的公钥证书(这步不可以少,否则下面的证书回复没法安装):
keytool -importcert -alias ca -keystore D:\server_cert_lib.jks -file D:\ca.cer
②安装server的公钥证书(被CA签名过的):
keytool -importcert -alias server -keystore D:\server_cert_lib.jks -file D:\server.cer
此时再查看下服务器server证书:keytool -list -v -keystore D:\server_cert_lib.jks -alias server
server证书变化挺大的:
4、由于是双向认证,所以同理,需要生成客户端证书库和证书:
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:\client_cert_lib.p12 -validity 90
注意证书名叫做client,保存的证书库路径为 D:\client_cert_lib.p12。
5、客户端和服务器端证书库和证书都生成好了后,将客户端证书导入到服务器端证书库中:(这个过程叫做让服务器端证书库信任指定的客户端证书,信任只需要信任其公钥证书就行了,即cer格式)
①先从p12格式的客户端证书库导出cer格式的client证书公钥:
keytool -export -alias client -keystore D:\client_cert_lib.p12 -storetype PKCS12 -rfc -file D:\client.cer
②将cer格式的client证书公钥导入到服务器端证书库里
keytool -import -alias client -v -file D:\client.cer -keystore D:\server_cert_lib.jks
③导入后检查一下服务端证书库当前包含的证书情况,看看有没有将客户端证书导入成功:
keytool -list -v -keystore D:\server_cert_lib.jks
6、做双向认证还需要同时将服务器端证书导入到客户端证书库里
①先从jks格式的服务器端证书库导出cer格式的服务器端公钥证书
keytool -keystore D:\server_cert_lib.jks -export -alias server -file D:\server.cer
②先将p12格式的客户端证书库转成bks格式的证书库,因为Android上只能用bks的证书库bcprov-jdk16-1.45.jar
keytool -importkeystore -srckeystore D:\client_cert_lib.p12 -srcstoretype pkcs12 -destkeystore D:\client_cert_lib.bks –deststoretype bk -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath D:\bcprov-jdk16-1.45.jar
到此证书制作完毕。
将服务器端公钥证书server.cer客户端证书库client_cert_lib.bks放入安卓assert目录。
7、tomcat的安装目录/conf/server.xml中配置和启用以下port 8443Connector
maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="D:\\server_cert_lib.jks" keystorePass="123456" truststoreFile="D:\\server_cert_lib.jks" truststorePass="123456" /> 注意配置完之后eclipse必须重新导入tomcat,否则不会生效。