HTTPS-Linux服务器Nginx配置、Android客户端证书生成.
实现HTTPS通信:
Server端在WEB服务器Nginx 上配置Https连接,接收Https连接请求,实现Https协议。
安卓客户端加载可信证书,BKS格式证书。该证书从服务器端证书导出来。
(一) Linux服务器端配置步骤
#号表示命令引导符
1. 首先确保机器上安装了openssl和openssl-devel
#yum install openssl
#yum install openssl-devel
2. 然后就是自己颁发证书给自己
1) 切换到Nginx的配置文件目录
#cd/usr/local/nginx/conf
2) 生成RSA非对称密钥:包括公钥和私钥;参数中-des3是密钥文件的加密算法,这个生成过程中会要求操作人输入des3算法的密码,比如:123456
#openssl genrsa-des3 -out server.key 1024
3) 基于上面生成的密钥,生成“签名请求”文件,准备用于签名。生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.屏幕上将有提示,依照其指示一步一步输入要求的个人信息即可.
#openssl req-new -key server.key -out server.csr
4) 由于密钥文件是使用des3加密过的,所以为了使用方便,去掉加密,即生成的server_nopwd.key为去掉加密的密钥文件。
#openssl rsa -inserver.key -out server_nopwd.key
5) 生成证书,并签名:-days表示证书有效期,这里设置为3650天(10年),最后的输出文件为server.crt即服务器端证书。
#openssl x509-req -days 3650 -in server.csr -signkey server_nopwd.key -out server.crt
6) 配置Nginx
server {
listen 443;
sslon;
ssl_certificate /usr/local/nginx/conf/server.crt;
ssl_certificate_key /usr/local/nginx/conf/server_nopwd.key;
}
重启Nginx
ps:如果出现“[emerg] 10464#0: unknown directive “ssl” in/usr/local/nginx-0.6.32/conf/nginx.conf:74”则说明没有将ssl模块编译进nginx,在configure的时候加上“–with-http_ssl_module”即可^^
至此已经完成了https服务器搭建,但如何让浏览器信任自己颁发的证书呢?
今天终于研究捣鼓出来了,只要将之前生成的server.crt文件导入到系统的证书管理器就行了,具体方法:
控制面板 -> Internet选项 -> 内容 -> 发行者 -> 受信任的根证书颁发机构 -> 导入 -》选择server.crt
(二) 安卓客户端证书生成
使用JDK自带的keytool工具,把服务器端CRT格式的证书导出一个BKS格式的证书,由于JDK自带的不支持BKS,所以需要一个第三方Jar包支持:bcprov-ext-jdk15on-150.jar.
keytool -importcert -keystore client.bks -file server.crt -storetype BKS -providerclassorg.bouncycastle.jce.provider.BouncyCastleProvider -providerpath./bcprov-ext-jdk15on-150.jar -storepass 123456