现在手机应用越来越多的融入到我们的日常生活中,在手机给我们的生活带来便利的同时,信息泄露也越来越成为一个重大的安全隐患。尤其是进行网络数据传输时,数据很有可能被中间人盗取,篡改,如何保证数据传输过程中的完整性,保密性已经成为不可逃避的话题。不对称加密进行数据传输的方式,就可以简单,方便的解决上述问题。在此,我就以一个android手机客户端程序通过https调用c#端开发的WebSerivce为例简单说一下实现流程。
开发环境:VS2008,adt-bundle-windows
运行环境:DotNetFramework2.0
IIS7android4.4
证书生成
证书生成使用工具makecert.exe。我机器中在如下路径中找到C:\ProgramFiles\MicrosoftSDKs\Windows\v6.0A\Bin,需要注意的一点是,makecert工具注明证书创建工具生成仅用于测试目的的X.509证书。
makecert-r-n"CN=www.weixianmanbu.com"-b01/01/2015-e01/01/2050-svmyCert.pvkmyCert.cer-len2048
解释一下参数的意义:
-r创建自签署证书。
-n按照X.500标准制定证书名称。格式为"CN=此处为证书名称"我在此将我的IP地址作为证书名称,此名称在我的android程序中并不会起到什么太特殊的作用,但我可以部署在IIS后将证书导入到浏览器中,这个名称就是认证证书是否是签发给该网站的依据了。
-b指定有效期的开始时间。
-e指定有效期的结束时间。
-sv指定主题的.pvk私钥文件。
-len指定生成的密钥长度(以位为单位)。
在执行makecert命令时,会弹出如图1所示的窗口,在此只需要点击“无”即可。此时,在文件夹中生成了两个文件,分别为私钥文件myCert.pvk和公钥文件myCert.cer。
接下来需要通过生成的cer证书创建发行者证书(.spc)文件。
cert2spcmyCert.cermyCert.spc
命令执行完成后,会生成发行者证书文件myCert.spc.。通过pvk2pfx.exe将发行者证书和私钥文件生成pfx文件,用来生成装载在IIS中的pfx文件。
pvk2pfx
-pvk
myCert.pvk
-spc
myCert.spc
-pfx
myCert.pfx
-f
通过在VS2008中新建WebService项目WebServiceForAndroid,增加一个简单的方法。
[WebMethod]
publicstringgetProduct(stringproductName){
return"产品名称:"+productName;
}
传入一个字符串参数产品名称,返回一个字符串“产品名称:”+传入的产品名称文字。
服务器IIS中安装证书
打开IIS7,选择服务器节点,在功能视图中选择“服务器证书”,如图2所示。
在“服务器证书”下,选择“导入”,在弹出的窗口中选择对应的pfx证书文件路径如图3所示,点击确定后证书被加入了。
接下来在网站WebSiteForAndroid中设置HTTPS协议。对网站点击右键,选择“编辑绑定…”,在弹出“编辑绑定”的窗口中点击“添加”按钮,弹出“添加网站绑定”窗体。
“类型”下拉框中选择“https”,在“端口”中填入端口号,在“SSL证书(S)”下拉框中选择刚添加的证书,如图4所示。点击“确定”按钮后,证书添加成功。
在此,我通过浏览器来测试一下效果,但此步骤只是用来测试证书是否正确安装,不管是否执行都不会影响Android端。
浏览器端安装公钥证书
双击“myCert.cer”,在弹出窗体中点击“安装证书(I)…”按钮,在弹出窗体中,在“证书存储”页中选择“将所有的证书放入下列存储(P)”项目,在“证书存储”输入框下点击浏览,在弹出框中选择“受信任的跟证书颁发机构”项目后点击“确定”,点击“下一步”后点击“完成”就成功导入到“受信任的跟证书颁发机构”。
接下来还要重复上述操作,在“证书存储”输入框下点击浏览,在弹出框中选择“受信任的发布者”。在通过makecert生成证书时,有参数“CN=www.weixianmanbu.com”,则浏览器会验证域名必须为www.weixianmanbu.com,否则会报错,如图5所示。
在hosts文件中添加:127.0.0.1 www.weixianmanbu.com,然后输入URL,结果如图6所示。
至此,我们已经成功生成可用的证书文件,并且可以成功安装到服务器的IIS上了。
下面我们使用keytool.exe生成Android可以使用的证书公钥文件,此文件可以在jre的bin文件夹下找到。
将bcprov-jdk15on-146.jar复制到keytool.exe所在目录,执行如下命令:
keytool
-importcert
-v
-trustcacerts
-aliasmyCert-filed:\cert\myCert.cer
-keystore
d:\cert\myCert.bks
-storetypeBKS
-providerclass
org.bouncycastle.jce.provider.BouncyCastleProvider
-storepass123456
-providerpath./bcprov-jdk15on-146.jar
命令执行完成后,会在d:\cert\目录下生成myCert.bks文件。下面我们来进行Android端的相应开发。
将刚刚生成的myCert.bks文件重命名为“mycert.bks”后复制到Android项目的/res/raw文件夹内。注意这里的重命名步骤,因为文件名只能是a-z0-9和“_”、“.”,否则会报错误:
res\raw\myCert.bks:
Invalidfilename:mustcontainonly[a-z0-9_.]。
在Android端开发中,我使用了ksoap2进行SOAP协议的封包解包操作。由于代码比较长,请参见项目AndWebService,在容易出问题的地方我写了注释。
运行的结果如图7所示。
(完)