利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx
- 文档编号:5352625
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:11
- 大小:22.21KB
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx
《利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx》由会员分享,可在线阅读,更多相关《利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx(11页珍藏版)》请在冰豆网上搜索。
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证
技术指导书
目录
1配置环境3
1.1Tomcat简介3
1.2SSL(ServerSocketLayer)简介3
1.3OpenSSL简介3
1.4所需软件包4
1.4.1Tomcat6.04
1.4.2给JDK加上BouncyCaslet库4
1.4.3Keytool命令详解5
1.5参考资料5
2建立自己的CA:
5
2.1初始化设置5
2.2构建根证书6
2.2.1生成根证书私钥6
2.2.2生成根证书请求6
2.2.3签发根证书(自签名方式)6
2.2.4根证书转换6
2.2.5导出CA的公钥证书6
2.2.6查看证书6
3为服务器生成证书7
3.1生成服务器私钥7
3.2生成服务器证书请求7
3.3签发服务器证书7
3.4服务器证书转换7
3.5查看证书7
4为Android客户端生成证书8
4.1生成客户私钥8
4.2生成客户证书请求8
4.3签发客户证书8
4.4客户证书转换8
4.5查看证书8
5双向认证配置:
9
5.1Android客户端需要使用的文件9
5.2服务端需要使用的文件9
5.3配置tomcat服务器9
5.4验证9
5.4.1启动tomcat9
5.4.2Android中验证9
5.4.3利用PhoneGap插件11
6经验总结12
1配置环境
1.1Tomcat简介
Tomcat是ApacheJakarta的子项目之一,作为一个优秀的开源web应用服务器,全面支持jsp1.2以及servlet2.3规范。
因其技术先进、性能稳定,而且免费,因而深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的web应用服务器。
1.2SSL(ServerSocketLayer)简介
在网络上信息在源-宿的传递过程中会经过其它的计算机。
一般情况下,中间的计算机不会监听路过的信息。
但在使用网上银行或者进行信用卡交易的时候有可能被监视,从而导致个人隐私的泄露。
由于Internet和Intranet体系结构的原因,总有某些人能够读取并替换用户发出的信息。
随着网上支付的不断发展,人们对信息安全的要求越来越高。
因此Netscape公司提出了SSL协议,旨在达到在开放网络(Internet)上安全保密地传输信息的目的,这种协议在WEB上获得了广泛的应用。
之后IETF(www.ietf.org)对SSL作了标准化,即RFC2246,并将其称为TLS(TransportLayerSecurity),从技术上讲,TLS1.0与SSL3.0的差别非常微小。
1.3OpenSSL简介
众多的密码算法、公钥基础设施标准以及SSL协议,或许这些有趣的功能会让你产生实现所有这些算法和标准的想法。
果真如此,在对你表示敬佩的同时,还是忍不住提醒你:
这是一个令人望而生畏的过程。
这个工作不再是简单的读懂几本密码学专著和协议文档那么简单,而是要理解所有这些算法、标准和协议文档的每一个细节,并用你可能很熟悉的C语言字符一个一个去实现这些定义和过程。
我们不知道你将需要多少时间来完成这项有趣而可怕的工作,但肯定不是一年两年的问题。
EricA.Young和TimJ.Hudson,自1995年开始编写后来具有巨大影响的OpenSSL软件包,更令我们高兴的是,这是一个没有太多限制的开放源代码的软件包,这使得我们可以利用这个软件包做很多事情。
1998年,OpenSSL项目组接管了OpenSSL的开发工作,并推出了OpenSSL的0.9.1版,到目前为止,OpenSSL的算法已经非常完善,对SSL2.0、SSL3.0以及TLS1.0都支持。
OpenSSL采用C语言作为开发语言,这使得OpenSSL具有优秀的跨平台性能,这对于广大技术人员来说是一件非常美妙的事情,可以在不同的平台使用同样熟悉的东西。
OpenSSL支持Linux、Windows、BSD、Mac、VMS等平台,这使得OpenSSL具有广泛的适用性。
不过,对于目前新成长起来的C++程序员,可能对于C语言的代码不是很习惯,但习惯C语言总比使用C++重新写一个跟OpenSSL相同功能的软件包轻松不少。
OpenSSL整个软件包大概可以分成三个主要的功能部分:
密码算法库、SSL协议库以及应用程序。
OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
对称加密算法
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种非对称加密算法,包括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.1Tomcat6.0
用途:
WebServer。
1.4.2给JDK加上BouncyCaslet库
1. 把bcprov-jdk16-146.jar放到jdk1.6.xx\jre\lib\ext目录下(在jdk1.7下也可以使用)
2. 给jdk1.6.xx\jre\lib\security目录中的java.security文件增加提供者:
security.provider.n=org.bouncycastle.jce.provider.BouncyCastleProvider
n为优先级数字,顺着原来的数字往下些,可调整顺序但不可隔空跳过数字。
1.4.3Keytool命令详解
英文:
中文:
1.5参考资料
Tomcat\SSL\Openssl的相关资料。
2建立自己的CA:
2.1初始化设置
建立CA根证书目录及相关初始化设置
d:
\>mkdirca
d:
\>cdca
d:
\ca>mkdircerts
d:
\ca>mkdircrl
d:
\ca>mkdirnewcerts
d:
\ca>mkdirprivate
d:
\ca>echo0>index.txt
ECHO处于打开状态。
d:
\ca>echo01>serial
d:
\ca>opensslrand-outprivate/.rand1000
Loading'screen'intorandomstate-done
2.2构建根证书
下述过程需要输入密码,一律输入ca1234
2.2.1生成根证书私钥
opensslgenrsa-aes256-outprivate/ca.key.pem2048
2.2.2生成根证书请求
opensslreq-new-keyprivate/ca.key.pem-outprivate/ca.csr-subj"/C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=wdmobileCA"
2.2.3签发根证书(自签名方式)
opensslx509-req-days10000-sha1-extensionsv3_ca-signkeyprivate/ca.key.pem-inprivate/ca.csr-outcerts/ca.cer-trustout
2.2.4根证书转换
opensslpkcs12-export-clcerts-incerts/ca.cer-inkeyprivate/ca.key.pem-outcerts/ca.p12
keytool-importkeystore-srckeystorecerts/ca.p12-srcstoretypePKCS12-deststoretypeBKS-destkeystorecerts/ca.bks
2.2.5导出CA的公钥证书
keytool-importcert-trustcacerts-aliasca-filecerts/ca.cer-keystorecerts/ca_public.bks-storetypebks
2.2.6查看证书
keytool-list-keystorecerts/ca.p12-storetypepkcs12-v-storepassca1234
keytool-list-keystorecerts/ca.bks-storetypebks-v-storepassca1234
keytool-list-keystorecerts/ca_public.bks-storetypebks-v-storepassca1234
3为服务器生成证书
下述过程需要输入密码,一律输入wa1234
3.1生成服务器私钥
opensslgenrsa-aes256-outprivate/server.key.pem2048
3.2生成服务器证书请求
opensslreq-new-keyprivate/server.key.pem-outprivate/server.csr-subj"/C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=10.0.73.57"
3.3签发服务器证书
opensslx509-req-days3650-sha1-extensionsv3_req-CAcerts/ca.cer-CAkeyprivate/ca.key.pem-CAserialca.srl-CAcreateserial-inprivate/server.csr-outcerts/server.cer-trustout
此处输入ca.key.pem的密码为ca1234。
3.4服务器证书转换
opensslpkcs12-export-clcerts-inkeyprivate/server.key.pem-incerts/server.cer-outcerts/server.p12
keytool-importkeystore-srckeystorecerts/server.p12-srcstoretypePKCS12-deststoretypeBKS-destkeystorecerts/server.bks
3.5查看证书
keytool-list-keystorecerts/server.p12-storetypepkcs12-v-storepasswa1234
keytool-list-keystorecerts/server.bks-storetypebks-v-storepasswa1234
4为Android客户端生成证书
下述过程需要输入密码,一律输入cl1234
4.1生成客户私钥
opensslgenrsa-des3-outprivate/client.key.pem2048
4.2生成客户证书请求
opensslreq-new-keyprivate/client.key.pem-outprivate/client.csr-subj"/C=cn/ST=bj/L=bj/O=wd/OU=wd/CN=wdmobile"
4.3签发客户证书
opensslx509-req-days3650-sha1-extensionsv3_req-CAcerts/ca.cer-CAkeyprivate/ca.key.pem-CAserialca.srl-CAcreateserial-inprivate/client.csr-outcerts/client.cer-trustout
此处输入ca.key.pem的密码为ca1234。
4.4客户证书转换
opensslpkcs12-export-incerts/client.cer-inkeyprivate/client.key.pem-outcerts/client.p12
生成Android可以使用的Bks格式密钥库:
keytool-importkeystore-srckeystorecerts/client.p12-srcstoretypePKCS12-deststoretypeBKS-destkeystorecerts/client.bks
4.5查看证书
keytool-list-keystorecerts/client.p12-storetypepkcs12-v-storepasscl1234
keytool-list-keystorecerts/client.bks-storetypebks-v-storepasscl1234
5双向认证配置:
5.1Android客户端需要使用的文件
client.bksca_public.bks
5.2服务端需要使用的文件
server.bksca_public.bks
5.3配置tomcat服务器
打开tomcat根目录下的/conf/server.xml,找到如下配置段,修改如下:
maxThreads="150"scheme="https"secure="true" clientAuth="true"sslProtocol="TLS"keystore="d: \ca\certs\server.bks"keystorePass="wa1234"keystoreType="BKS" truststoreFile="d: \ca\certs\ca_public.bks"truststorePass="ca1234"truststoreType="BKS"emptySessionPath="false"/> 5.4验证 5.4.1启动tomcat 修改tomcat6.0\bin\catalina.bat文件,如: setJAVA_OPTS=%JAVA_OPTS%%LOGGING_CONFIG%-D.debug=ssl中的红色部分。 然后启动tomcat可以查看SSL请求交互的详细日志信息。 5.4.2Android中验证 主要有3个步骤: 0.将ca.bks和client.bks放到res/raw目录下 1.双向认证初始化安全环境,2.请求待访问数据。 如下面的代码段: 1./** *双向认证初始化安全环境 *@paramresid_key *@parampassword_key *@paramresid *@parampassword *@throwsException */ privatevoidinitKey2(intresid_key,Stringpassword_key, intresid,Stringpassword)throwsException{ KeyStorekeyStore=KeyStore.getInstance(CLIENT_KEY_KEYSTORE); keyStore.load( MyApplication.getInstance().getContext() .getResources().openRawResource( resid_key),password_key.toCharArray()); KeyStoretrustStore=KeyStore.getInstance(CLIENT_TRUST_KEYSTORE); trustStore.load( MyApplication.getInstance().getContext() .getResources().openRawResource( resid),password.toCharArray()); SSLSocketFactorysocketFactory=newSSLSocketFactory(keyStore,password_key,trustStore); Schemesch=newScheme("https",socketFactory,8443); hc.getConnectionManager().getSchemeRegistry().register(sch); } /** *以POST方式请求数据 *@paramreqData请求数据 *@paramurl请求地址 *@return *@throwsException */ privateStringpostData(StringreqData,Stringurl)throwsException{ HttpPosthr=newHttpPost(url); hr.setEntity(newStringEntity(reqData)); HttpResponsehres=hc.execute(hr); returnEntityUtils.toString(hres.getEntity(),"utf-8"); } 2.try{ initKey2(R.raw.client,CLIENT_KEY_PASSWORD,R.raw.ca_public,CLIENT_TRUST_PASSWORD); result=postData(reqData,url); Log.i("postresult: ",result); }catch(Exceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } 5.4.3利用PhoneGap插件 5.4.3.1在res/xml/plugins.xml加入一行 5.4.3.2生成wdmobile.certs.js varWdCertsPlugin=function(){ }; //way: 0,无认证;1,单向认证;2,双向认证。 //reqData: 请求数据 //url: 访问地址 //success: 成功时的回调函数 //error: 失败时的回调函数 WdCertsPlugin.prototype.post=function(way,port,reqData,url,success,error){ Cordova.exec(success,error,"WdCertsPlugin","post",[way,port,reqData,url]); }; Cordova.addConstructor(function(){ Cordova.addPlugin("wdCertsPlugin",newWdCertsPlugin()); }); 5.4.3.3在WDCertsPlugin.java中添加代码段 StringreqData=data.getString(0); Stringurl=data.getString (1); JSONObjectfileInfo=newJSONObject(); //数据结果保存到json中 fileInfo.put("result",post(reqData,url)); result=newPluginResult(Status.OK,fileInfo); 5.4.3.4在页面调用 window.plugins.wdCertsPlugin.post("2","8443",strs,url2,function(data,textStatus){ varstrData=JSON.stringify(data); if($("resultCode",strData).text()=="0000"){ alert("https登录成功! "); wdMobileUi.mainui(); }else{ alert("https登录失败\r\n失败信息: "+$("resultCode",strData).text() +$("resultDesc",strData).text()); wdMobileUi.loginui(); } },function(xmlHttpRequest,textStatus,errorThrown){ alert("https网络异常或者远程服务器不可用! "+xmlHttpRequest.status); }); 6经验总结 经过大量的尝试,发现如果使用CA签名的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 Tomcat Openssl Android 环境 完成 CA 签名 双向 认证 技术 指导书