Tomcat配置https自签名证书,解决IOS7.1以上plist方式安装应用无法连接问题

##场景
企业应用管理系统,通过管理系统上传IOS应用安装文件(ipa文件),并生成plist文件,实现App的发布;管理系统的iPhone客户端通过请求生成好的plist文件便可安装IOS应用。

##问题
在开发完成后,iPhone客户端只要让Safari浏览器这样访问plist文件,系统便会提示安装应用,但iPhone客户端提示无法连接。

1
itms-services://?action=download-manifest&url=https://192.168.1.113/foo/xxx/iphone.plist

##思路
我们知道在IOS 7.1以上,plist文件的下载地址必须是HTTPS的,所以作为一个Java后台程序猿,自然在网上随便搜了一个证书生成命令,配置好了Tomcat的SSL,便认为一切应该顺利通过。

plist文件的HTTPS访问地址:

1
https://192.168.1.113/foo/xxx/iphone.plist

经过确认,plist文件格式正确无误。其实,提示无法连接,这显然跟HTTPS有关。

验证HTTPS是否正确配置

如何验证呢?找一个HTTPS配置好并确定可用的服务器,把plist文件放上去不就行了,立马就想到了七牛云存储,谁知道选好文件,提示我“不支持该文件类型,请升级为标准用户”。

然后我就想到了用代码托管网站试试: git.oschina.net

没有的话,注册一个账号,创建一个公开项目,然后在线添加plist文件把文件内容粘贴进来(点 + 添加文件),提交保存,最后打开查看,入下图,点击“原始数据”按钮,可获得该文件的访问链接。
点击“原始数据”按钮,可获得该文件的访问链接

好了,用iPhone的Safari浏览器以安装方式的URL打开,Bingo !!! 终于提示是否安装了,这意味着我本地开发配置的HTTPS是有问题的。

(悄悄的说一句,其实我先尝试了coding.net,安装方式访问plist,仍然提示无法连接,想试的童鞋可以再试试看行不行。)

正确生成证书

HTTPS的问题在哪?除了证书,我想不到别的。

一番搜索,我决定用openSSL来生成证书试试:

  1. 如果你用的是Windows系统,上网搜一下“openssl for windows”;
  2. 找到各版本下载列表后,看自己操作系统是32位还是64位下载对应的版本;
  3. 如果没有安装Visual C++ 2008 Redistributables的情况下安装openSSL会有警告的;
  4. 不确定的情况下,就先执行openSSL的安装看有没有警告吧。

这些都难不到我们的,安装完了就开始生成证书

先创建文件夹准备存放证书,这里比如是C:\ca\

运行cmd,先切到openSSL安装目录地下的bin目录:

1
cd C:\OpenSSL-Win64\bin

创建根证书

1、 创建制作根证书的私钥文件myCA.key

1
openssl genrsa -out c:\ca\myCA.key 2048

2、创建根证书myCA.cer,机构名称为My Custom CA

1
openssl req -new -x509 -key C:\ca\myCA.key -out C:\ca\myCA.cer -days 730 –subj /CN="My CustomCA"

####创建自签名SSL证书(叶证书)
1、创建一个私钥server.key

1
openssl genrsa -out C:\ca\server.key 2048

2、创建CSR,服务器ip地址如:192.168.1.113,输出文件为server.req

1
openssl req -new -out C:\ca\server.req -key C:\ca\server.key -subj /CN=192.168.1.113

3、用CSR去创建SSL证书,有效期为100年,输出文件为server.cer,序号文件为server.serial(撤销证书时使用)

1
openssl x509 -req -in C:\ca\server.req -out C:\ca\server.cer -CAkey C:\ca\myCA.key -CA C:\ca\myCA.cer -days 36500 -CAcreateserial -CAserial C:\ca\server.serial

4、将.key 和.cer 文件导出为.p12 证书,需要输入两次证书密码。这里我们假设密码为123456。输出文件名为server.p12

1
openssl pkcs12 -export -in C:\ca\server.cer -inkey C:\ca\server.key -out C:\ca\server.p12 -name "server"

5、用keytool将.p12 文件导入到java keystore 中,这里srcstorepass后面的123456为server.p12的密码,deststorepass后的12356为keystore的密码。

1
keytool -importkeystore -v -srckeystore C:\ca\server.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore C:\ca\server.keystore -deststoretype jks -deststorepass 123456

####使用SSL证书
打开Tomcat安装目录,修改conf目录下的server.xml

1
2
3
4
5
<Connector SSLEnabled="true" protocol="org.apache.coyote.http11.Http11Protocol"
scheme="https" secure="true" sslProtocol="TLS"
keystoreFile="C:/ca/server.keystore" keystorePass="123456"
maxThreads="150" port="443" clientAuth="false"
/>

这里设置了HTTPS访问端口为443(默认端口,可不输入),启动Tomcat,访问看是否可用

1
https://192.168.1.113/foo/

####iPhone安装证书
将我们生成的C:\ca\myCA.cer放到Tomcat部署的应用中,供iPhone访问下载

1
https://192.168.1.113/foo/myCA.cer

当然,这里可以不用HTTPS的方式访问下载也可以

iPhone打开Safari浏览器访问下载地址,安装好证书,就可以再试试访问plist安装了:

1
itms-services://?action=download-manifest&url=https://192.168.1.113/foo/xxx/iphone.plist

提示是否安装就说明成功了。