利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx

上传人:b****3 文档编号:5352625 上传时间:2022-12-15 格式:DOCX 页数:11 大小:22.21KB
下载 相关 举报
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx_第1页
第1页 / 共11页
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx_第2页
第2页 / 共11页
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx_第3页
第3页 / 共11页
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx_第4页
第4页 / 共11页
利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx

《利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx》由会员分享,可在线阅读,更多相关《利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx(11页珍藏版)》请在冰豆网上搜索。

利用Tomcat+Openssl在Android环境下完成CA签名的双向认证技术指导书.docx

利用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签名的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1