1、4.3 签发客户证书 84.4 客户证书转换 84.5 查看证书 85 双向认证配置: 95.1 Android客户端需要使用的文件 95.2 服务端需要使用的文件 95.3 配置tomcat 服务器 95.4 验证 95.4.1 启动tomcat 95.4.2 Android中验证 95.4.3 利用PhoneGap插件 116 经验总结 121 配置环境1.1 Tomcat简介Tomcat是Apache Jakarta的子项目之一,作为一个优秀的开源web应用服务器,全面支持jsp1.2以及servlet2.3规范。因其技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分
2、软件开发商的认可,成为目前比较流行的web应用服务器。1.2 SSL(Server Socket Layer)简介在网络上信息在源-宿的传递过程中会经过其它的计算机。一般情况下,中间的计算机不会监听路过的信息。但在使用网上银行或者进行信用卡交易的时候有可能被监视,从而导致个人隐私的泄露。由于Internet和Intranet体系结构的原因,总有某些人能够读取并替换用户发出的信息。随着网上支付的不断发展,人们对信息安全的要求越来越高。因此Netscape公司提出了SSL协议,旨在达到在开放网络(Internet)上安全保密地传输信息的目的,这种协议在WEB上获得了广泛的应用。 之后IETF(ww
3、w.ietf.org)对SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),从技术上讲,TLS1.0与SSL3.0的差别非常微小。1.3 OpenSSL简介众多的密码算法、公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法。果真如此,在对你表示敬佩的同时,还是忍不住提醒你:这是一个令人望而生畏的过程。这个工作不再是简单的读懂几本密码学专著和协议文档那么简单,而是要理解所有这些算法、标准和协议文档的每一个细节,并用你可能很熟悉的C语言字符一个一个去实现这些定义和过程。我们不知道你将需要多少时间来完成这项有
4、趣而可怕的工作,但肯定不是一年两年的问题。 Eric A. Young和Tim J. Hudson,自1995年开始编写后来具有巨大影响的OpenSSL软件包,更令我们高兴的是,这是一个没有太多限制的开放源代码的软件包,这使得我们可以利用这个软件包做很多事情。1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台
5、使用同样熟悉的东西。OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。不过,对于目前新成长起来的C+程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C+重新写一个跟OpenSSL相同功能的软件包轻松不少。OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。 作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供
6、测试或其它目的使用。对称加密算法OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。非对称加密算法OpenSSL一共实现了4种非对称
7、加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。信息摘要算法OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。1.4 所需软件包1.4.1 Tomcat 6.0用途:Web Server。1.4.2 给JDK加上Bounc
8、yCaslet库1. 把bcprov-jdk16-146.jar放到jdk1.6.xxjrelibext目录下(在jdk1.7下也可以使用)2. 给jdk1.6.xxjrelibsecurity目录中的java.security文件增加提供者:security.provider.n=org.bouncycastle.jce.provider.BouncyCastleProvidern为优先级数字,顺着原来的数字往下些,可调整顺序但不可隔空跳过数字。1.4.3 Keytool命令详解英文:中文:1.5 参考资料TomcatSSLOpenssl的相关资料。2.1 初始化设置建立CA根证书目录及相关
9、初始化设置d:mkdir cacd cacamkdir certsmkdir crlmkdir newcertsmkdir privateecho 0index.txtECHO 处于打开状态。echo 01serialopenssl rand -out private/.rand 1000Loading screen into random state - done2.2 构建根证书下述过程需要输入密码,一律输入ca12342.2.1 生成根证书私钥openssl genrsa -aes256 -out private/ca.key.pem 20482.2.2 生成根证书请求openssl r
10、eq -new -key private/ca.key.pem -out private/ca.csr -subj /C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=wdmobileCA2.2.3 签发根证书(自签名方式)openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer -trustout2.2.4 根证书转换openssl pkcs12 -export -clcerts -in certs/ca
11、.cer -inkey private/ca.key.pem -out certs/ca.p12keytool -importkeystore -srckeystore certs/ca.p12 -srcstoretype PKCS12 -deststoretype BKS -destkeystore certs/ca.bks2.2.5 导出CA的公钥证书keytool -importcert -trustcacerts -alias ca -file certs/ca.cer -keystore certs/ca_public.bks -storetype bks2.2.6 查看证书keyt
12、ool -list -keystore certs/ca.p12 -storetype pkcs12 -v -storepass ca1234keytool -list -keystore certs/ca.bks -storetype bks -v -storepass ca1234keytool -list -keystore certs/ca_public.bks -storetype bks -v -storepass ca12343 为服务器生成证书下述过程需要输入密码,一律输入wa12343.1 生成服务器私钥openssl genrsa -aes256 -out private/
13、server.key.pem 20483.2 生成服务器证书请求openssl req -new -key private/server.key.pem -out private/server.csr -subj /C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=10.0.73.573.3 签发服务器证书openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private
14、/server.csr -out certs/server.cer -trustout此处输入ca.key.pem的密码为ca1234。3.4 服务器证书转换openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12keytool -importkeystore -srckeystore certs/server.p12 -srcstoretype PKCS12 -deststoretype BKS -destkeystore certs/ser
15、ver.bks3.5 查看证书keytool -list -keystore certs/server.p12 -storetype pkcs12 -v -storepass wa1234keytool -list -keystore certs/server.bks -storetype bks -v -storepass wa12344 为Android客户端生成证书下述过程需要输入密码,一律输入cl12344.1 生成客户私钥openssl genrsa -des3 -out private/client.key.pem 20484.2 生成客户证书请求openssl req -new
16、-key private/client.key.pem -out private/client.csr -subj /C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=wdmobile4.3 签发客户证书 openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/client.csr -out certs/client.cer -trustout4.4 客户证书
17、转换openssl pkcs12 -export -in certs/client.cer -inkey private/client.key.pem -out certs/client.p12生成Android可以使用的Bks格式密钥库:keytool -importkeystore -srckeystore certs/client.p12 -srcstoretype PKCS12 -deststoretype BKS -destkeystore certs/client.bks4.5 查看证书keytool -list -keystore certs/client.p12 -storet
18、ype pkcs12 -v -storepass cl1234keytool -list -keystore certs/client.bks -storetype bks -v -storepass cl12345.1 Android客户端需要使用的文件client.bks ca_public.bks5.2 服务端需要使用的文件server.bks ca_public.bks5.3 配置tomcat 服务器打开tomcat 根目录下的 /conf/server.xml ,找到如下配置段,修改如下: 5.4 验证5.4.1 启动tomcat修改tomcat6.0bincatalina.bat文
19、件,如:set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -D.debug=ssl 中的红色部分。然后启动tomcat可以查看SSL请求交互的详细日志信息。5.4.2 Android中验证主要有3个步骤:0.将ca.bks和client.bks放到res/raw目录下1. 双向认证初始化安全环境,2.请求待访问数据。如下面的代码段:1. /* * 双向认证初始化安全环境 * param resid_key * param password_key * param resid * param password * throws Exception */ pri
20、vate void initKey2(int resid_key,String password_key, int resid,String password) throws Exception KeyStore keyStore = KeyStore.getInstance(CLIENT_KEY_KEYSTORE); keyStore.load( MyApplication.getInstance().getContext() .getResources().openRawResource( resid_key), password_key.toCharArray(); KeyStore t
21、rustStore = KeyStore.getInstance(CLIENT_TRUST_KEYSTORE); trustStore.load( resid), password.toCharArray(); SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,password_key,trustStore); Scheme sch = new Scheme(, socketFactory, 8443); hc.getConnectionManager().getSchemeRegistry().register(sc
22、h); /* * 以POST方式请求数据 * param reqData 请求数据 * param url 请求地址 * return private String postData(String reqData,String url) throws Exception HttpPost hr = new HttpPost(url); hr.setEntity(new StringEntity(reqData); HttpResponse hres = hc.execute(hr); return EntityUtils.toString(hres.getEntity(),utf-8); 2.
23、 try initKey2(R.raw.client,CLIENT_KEY_PASSWORD,R.raw.ca_public,CLIENT_TRUST_PASSWORD); result = postData(reqData,url); Log.i(post result: , result); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); 5.4.3 利用PhoneGap插件5.4.3.1 在res/xml/plugins.xml加入一行5.4.3.2 生成wdmobile.certs.j
24、svar WdCertsPlugin = function() ;/way:0,无认证;1,单向认证;2,双向认证。/reqData:请求数据/url:访问地址/success:成功时的回调函数/error:失败时的回调函数WdCertsPlugin.prototype.post = function(way,port,reqData,url, success, error) Cordova.exec(success, error, , post, way,port,reqData,url );Cordova.addConstructor(function() Cordova.addPlugi
25、n(wdCertsPlugin, new WdCertsPlugin(););5.4.3.3 在WDCertsPlugin.java中添加代码段 String reqData = data.getString(0); String url = data.getString(1); JSONObject fileInfo = new JSONObject(); /数据结果保存到json中 fileInfo.put(result, post (reqData,url); result = new PluginResult(Status.OK, fileInfo);5.4.3.4 在页面调用 win
26、dow.plugins.wdCertsPlugin.post(2,strs,url2, function(data, textStatus) var strData = JSON.stringify(data); if ($(resultCode, strData).text() = 0000) alert(https登录成功! wdMobileUi.mainui(); else https登录失败rn失败信息:+$(, strData).text() + $(resultDesc, strData).text(); wdMobileUi.loginui(); , function(xmlHttpRequest, textStatus, errorThrown) alert(https网络异常或者远程服务器不可用! + xmlHttpRequest.status); ) ;6 经验总结经过大量的尝试,发现如果使用CA签名的
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1