背景:ios7.1以后,公司企业app无法下载,提示证书无效。记录解决方法,备忘。
iOS7.1发布后,对于iOS企业版内部分发方式上,苹果有了一个较大的调整,原来通过http方式安装应用不再有效,会提示“无法安装应用程序,因为“xxx”的证书无效”。苹果为了提高安全性,要求使用https的方式安装应用,
例如原来连接:
itms-services:///?action=download-manifest&url=http://www.3meb.com:80/ebms2/pkg/down/type/plist/bundleId/com.mmm.sor
现在必须是:
itms-services:///?action=download-manifest&url=https://www.3meb.com:80/ebms2/pkg/down/type/plist/bundleId/com.mmm.sor
要使用https方式的话,服务器必须安装安全证书,目前主要的解决方案:
A、 购买第三方CA认证(需要申请、付费高、审核耗时长)
B、 使用自签名证书,并在手机端安装根证书(使用JDK自带的keytool和OpenSSL可实现,内部推广方便)
C、 将app的plist描述文件放到支持https的第三方云或网盘,ipa安装文件放公司内部网站,用户通过访问第三方网站下载plist文件,用户手机端会根据plist中指定的ipa路径自动安装程序。(第三方云或网盘的稳定性与安全性不佳)
2、 目前暂时采用B方案,操作方式如下:
服务器端:
1、 安装JDK1.6,配置环境变量(过程略)
2、 部署jboss(略)
3、 安装OpenSSL,配置环境变量,(因安装OpenSSL需要perl和VS环境来编译,操作繁琐,本人使用mac os x系统自带的OpenSSL生成CA、认证)。
4、 生成证书:
生成keystone,(注册时填写名字与姓氏要与服务器ip或域名相同)
C:\Users\A53WSZZ>keytool -genkey -v -alias testjboss -keyalg RSA -keystore testj
boss.keystore -validity 3650
输入keystore密码:
再次输入新密码:
您的名字与姓氏是什么?
[Unknown]: 169.8.247.70
您的组织单位名称是什么?
[Unknown]: 3m
您的组织名称是什么?
[Unknown]: it
您所在的城市或区域名称是什么?
[Unknown]: sh
您所在的州或省份名称是什么?
[Unknown]: shanghai
该单位的两字母国家代码是什么
[Unknown]: cn
CN=169.8.247.70, OU=3m, O=it, L=sh, ST=shanghai, C=cn 正确吗?
[否]: y
正在为以下对象生成 1,024 位 RSA 密钥对和自签名证书 (SHA1withRSA)(有效期为 3,650
天):
CN=169.8.247.70, OU=3m, O=it, L=sh, ST=shanghai, C=cn
输入<testjboss>的主密码
(如果和 keystore 密码相同,按回车):
[正在存储 testjboss.keystore]
注:testjboss是别名,3650是从现在开始的有效天数
准备生成CA的key
openssl genrsa –out myCA.key 2048
生成CA
openssl req –x509 –new –key myCA.key –out myCA.cer –days 3650 –subj /CN=“169.8.247.51”
准备从CA请求认证的请求文件
keytool –certreq –alias testjboss –keystore testjboss.keystore –file server.csr
从CA请求认证
openssl x509 –req –in server.csr –out server.cer –CAkey myCA.key -CA myCA.cer –days 3650 –CAcreateserial –CAserial serial
导入CA根证书到keystore
Keytool –import –trustcacerts –keystore testjboss.keystore –alias root –file myCA.cer
导入认证证书到keystore
Keytool –import –keystore testjboss.keystore –alias jboss –file server.cer
注:(Keytool在windows生成,openssl在mac系统生成)证书等文件生成时未指定路径,默认生成在当前系统账号文件夹下,如:C:\Users\A53WS\
证书生成完毕后,在服务器端安装根证书myCA.cer和server.cer(双击安装,选择证书存储:受信任的第三方颁发机构)
5、 修改jboss配置文件(tomcat类似)
将上面生成的testjboss.keystore文件拷贝到\jboss-5.1.0.GA\server\default\conf目录下,
修改\jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\server.xml文件,打开jboss自带的SSL配置,设置keystoreFile和keystorepass(此密码为keystore生成时输入的密码)
<!-- SSL/TLS Connector configuration using the admin devl guide keystore -->
<Connector protocol="HTTP/1.1" SSLEnabled="true"
port="8443" address="169.8.247.70"
scheme="https" secure="true" clientAuth="false"
keystoreFile="${jboss.server.home.dir}/conf/testjboss.keystore"
keystorePass="a53wszz" sslProtocol = "TLS" />
用户手机端:
通过邮件附件等形式将根证书myCA.cer分发到手机端,点击证书安装,系统会跳转到‘安装描述文件’页面,点击安装,安装成功后会显示为 可信 ,表示证书安装成功。此时可通过Safari浏览器访问网址并下载app。
(注意:不要在浏览器safari中选择接受自签名证书。在Safari浏览器中第一次打开网址时,系统会弹出提示:1、继续(or接受),2、查看证书信息,3、取消。 如果在Safari中选择‘接受’将导致Safari把该站点添加到SSL例外队列中,导致该证书无法安装位ios可信任的证书,且该例外无法删除。---来自网络,未测试)
补充:
打开C:\jboss-5.1.0.GA\server\default\deployers\jbossweb.deployer\web.xml文件,加上:
<security-constraint> <web-resource-collection> <web-resource-name>SSLHtmlAdaptor</web-resource-name> <description> An example security config that only allows users with the role JBossAdmin to access the HTML JMX console web application </description> <url-pattern>/</url-pattern> </web-resource-collection> <user-data-constraint> <description>Protection should be CONFIDENTIAL</description> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>开启jboss的SSL功能。
注:加在此处是对jboss下所有的项目生效,若想只对某个项目生效,则只对指定项目的web.xml文件中加入上述配置信息即可;