现在的位置: 首页 > 综合 > 正文

SSL双向认证学习笔记

2013年10月06日 ⁄ 综合 ⁄ 共 7226字 ⁄ 字号 评论关闭

文章参考: [url]http://blog.csdn.net/sunyujia/archive/2008/10/03/3014667.aspx[/url] [url]http://blog.csdn.net/nataka/archive/2005/09/03/470539.aspx[/url] [url]http://bbs.cfan.com.cn/thread-743287-1-1.html[/url]              第一节 基础知识 最近要做一个SSL的应用,先后了解了两个命令,一个是keytool,一个是openssl。keytool是JDK得集成环境。只要安装了JDK,基本上都会有(^_^,除非你安装太老的!),我用的1.5。 在安装openssl的时候,花了半天时间。 用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的)。 JDK工具KEYTOOL -genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书 -alias 产生别名 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中 -keyalg 指定密钥的算法 -validity 指定创建的证书有效期多少天 -keysize 指定密钥长度 -storepass 指定密钥库的密码 -keypass 指定别名条目的密码 -dname 指定证书拥有者信息例如: "CN=firstName,OU=org,O=bj,L=bj,ST=gd,C=cn" -list 显示密钥库中的证书信息 keytool -list -v -keystore 别名 -storepass .... -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件 keytool -export -alias 别名 -file 文件名.crt -file 参数指定导出到文件的文件名 -delete 删除密钥库中某条目 keytool -delete -alias 别名 -keystore sage -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 别名 -keypass .... -new .... -storepass ... -keystore 别名 -import 将已签名数字证书导入密钥库 keytool -import -alias 别名 -keystore 证书名-file 文件名 (可以加.crt 后缀) 命令: 生成证书 keytool -genkey -keystore 文件名(可包含路径) -keyalg rsa -alias 别名 -validity 有效期 查看证书 keytool -list -v -keystore 路径 把证书导出到文件 keytool -export -alias 别名 -keystore 证书名 -rfc -file 文件名(可包含路径) 修改密码 keytool -keypasswd -alias 别名 -keypass 旧密码 -new 新密码 导出证书到新的TrustStore keytool -import -alias 别名 -file 文件名 -keystore truststore 此处省略3000字,待补^_^              第二节 安装一、下载: Openssl版本0.9.8i 地址:[url]http://www.openssl.org/source/openssl-0.9.8i.tar.gz[/url] ActivePerl版本5.8.8.822 [url]http://downloads.activestate.com/ActivePerl/Windows/5.8/ActivePerl- 5.8.8.822-MSWin32-x86-280952.msi[/url] 二、安装:编译器VC6机器上一直有,不是这次特意安装的。貌似只要是c++编译器就差不多。 1.安装VC和ActivePerl,先后顺序无所谓,安装时注意勾选添加环境变量的选项。 2.检查VC6的环境变量,path需要包含C:/Program Files/Microsoft Visual Studio/VC98/bin,没有的话手动添加。测试是否有vc环境最简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报:“'cl' 不是内部或外部命令,也不是可运行的程序 ”。另外,还有一种办法:可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本的vc这个文件所在位置不同所以我就不说明它的位置了。 3.解压Openssl,解压后会发现openssl-0.9.8i目录下面有很多文件,更改文件夹名称为openssl,并剪切到c:/openssl 其中的一个文件是INSTALL.W32用记事本或者其他文本编辑器打开,这个文件是介绍Win32平台的安装方法,我下面的批处理也是根据这个文件写的,大家最好依据这文件的描述安装,英文不好的,可以对照我的批处理来看,如果大家安装的版本和我相同,那么直接使用下面的批处理安装即可。在INSTALL.W32相同目录下新建一个批处理install.bat,内容如下 @rem --prefix 指定安装目录 perl Configure VC-WIN32 --prefix=C:/openssl pause call ms/do_ms pause nmake -f ms/ntdll.mak pause nmake -f ms/ntdll.mak test pause nmake -f ms/ntdll.mak install pause 进入到c:/openssl目录,执行批处理install.bat就可以了。三、注意事项: 1.安装时间比较长,请耐心等待 2.每个步骤间使用了pause暂停,便于观察。每步完成后按任意键继续,注意有没有报错。 3.可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本的vc这个文件所在位置不同所以我就不说明它的位置了。测试是否有vc环境最简单的测试方法是在执行install.bat前先在cmd下执行下cl ,没有vc环境的话会报 'cl' 不是内部或外部命令,也不是可运行的程序 4.提示%OSVERSION% is not defined 这个错误的时候可以忽略它没关系 5.网上搜索到安装前修改OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,否则cl编译器会报./crypto/des/enc_read.c文件的read是The POSIX name for this item is deprecated 建议使用 _read。因为我使用非常简单的功能所以我没有修改它,需要的朋友可以尝试修改它。 6.最终编译结束会在指定安装目录下产生子目录和文件夹: Makefile.bak MINFO inc32 out32dll tmp32dll bin libopenssl.cnf 7.环境变量path中加入“C:/openssl/bin”,编辑"C:/openssl/openssl.cnf"文件,修改CA_default节中的policy = policy_match为policy = policy_anything并把它拷贝到C:/openssl/ssl。运行cmd,在任意目录下运行openssl,不出错误提示为准。四、VC编程可参考:最后的输出都在out32dll目录下:包括可执行文件、两个dll和两个lib文件: libeay32.dll, libeay32.lib, ssleay32.dll, ssleay32.lib 编程初步: 1、打开VC-Tools-Options-Directores,在Include files中增加【openssl-0.9.8】/inc32目录;在Libray files中增加【openssl-0.9.8】/out32dll 2、源程序中包含以下三个头文件并加入LIB: #include #include #include #pragma comment(lib, "libeay32.lib") #pragma comment(lib, "ssleay32.lib") 3、 参考源码开始编程:[url]http://www.kennethballard.com/Download/intro-openssl.zip[/url] 第三节 使用OpenSSL生产证书链一、准备知识,仅作为练习: 1、首先为CA创建一个RSA 私用密钥: OpenSSL genrsa -des3 -out ca.key 1024 该指令中genras表示生成RSA私有密钥文件。 -des3表示用DES3加密该文件。 -out ca.key表示生成文件ca.key。 1024是我们的RSA key的长度。生成server.key的时候会要你输入一个密码,这个密钥用来保护你的ca.key文件,这样即使人家偷走你的ca.key文件,也打不开,拿不到你的私有密钥。运行该指令后系统提示输入 PEM pass phrase,也就是ca.key文件的加密密码,这里设为12345678 2、可用下列命令查看: # OpenSSL rsa -noout -text -in ca.key 该指令中rsa表示对RSA私有密钥的处理。 -noout表示不打印出key的编码版本信息。 -text表示打印出私有密钥的各个组成部分。 -in ca.key 表示对ca.key文件的处理 对RSA算法进行可以知道,RSA的私有密钥其实就是三个数字,其中两个是质数prime numbers。产生RSA私有密钥的关键就是产生这两个质数。还有一些其他的参数,引导着整个私有密钥产生的过程。二、建立批处理:任意建立一个文件夹,比如D:/test;用记事本建立一个批处理,内容: @echo off :OpenSSL配置文件路径(如果出现“The organizationName field needed to be the same in the”之类的错误,请编辑此文件,修改CA_default节中的policy = policy_match为policy = policy_anything set CONFIG="C:/openssl/ssl/openssl.cnf" :服务器证书库密码 set PWD_SERVER_KS=serverks :服务器证书密码 set PWD_SERVER_KEY=serverkey :客户端证书库密码 set PWD_CLIENT_KS=clientks :客户端证书密码 set PWD_CLIENT_KEY=clientkey :有效期(天) set VALIDITY=365 :服务器证书名 set SERVER_CERT_NAME=logon_server_private_key :客户端证书名 set CLIENT_CERT_NAME=ipclient_private_key :服务器证书库文件名 set SERVER_KEYSTORE_NAME=server.keystore :客户端证书库文件名 set CLIENT_KEYSTORE_NAME=client.keystore if not exist DemoCA ( mkdir DemoCA mkdir DemoCA/certs mkdir DemoCA/newcerts echo CAFEBABE>DemoCA/serial copy nul DemoCA/index.txt ) if not exist ca.key ( echo Generating a ca root key file... openssl req -new -x509 -keyout ca.key -out ca.crt -config %CONFIG% ) else ( echo ca.key already exists... ) if not exist server.keystore ( echo Generating server's private key... keytool -genkey -alias %SERVER_CERT_NAME% -validity %VALIDITY% -keyalg RSA -keysize 1024 -keystore %SERVER_KEYSTORE_NAME% -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% ) else ( echo server.keystore already exits... ) if not exist client.keystore ( echo Generating client's private key... keytool -genkey -alias %CLIENT_CERT_NAME% -validity %VALIDITY% -keyalg RSA -keysize 1024 -keystore %CLIENT_KEYSTORE_NAME% -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% ) else ( echo client.keystore already exits... ) echo ========Finished key generation========= if not exist %SERVER_CERT_NAME%.csr ( echo Generating server's singature request file... keytool -certreq -alias %SERVER_CERT_NAME% -sigalg MD5withRSA -file %SERVER_CERT_NAME%.csr -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystore %SERVER_KEYSTORE_NAME% ) else ( echo %SERVER_CERT_NAME%.csr already exits... ) if not exist %CLIENT_CERT_NAME%.csr ( echo Generating client's singature request file... keytool -certreq -alias %CLIENT_CERT_NAME% -sigalg MD5withRSA -file %CLIENT_CERT_NAME%.csr -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% -keystore %CLIENT_KEYSTORE_NAME% ) else ( echo %CLIENT_CERT_NAME%.csr already exits... ) if not exist %SERVER_CERT_NAME%.crt ( openssl ca -in %SERVER_CERT_NAME%.csr -out %SERVER_CERT_NAME%.crt -cert ca.crt -keyfile ca.key -notext -config %CONFIG% ) else ( echo %SERVER_CERT_NAME%.crt already exits... ) if not exist %CLIENT_CERT_NAME%.crt ( openssl ca -in %CLIENT_CERT_NAME%.csr -out %CLIENT_CERT_NAME%.crt -cert ca.crt -keyfile ca.key -notext -config %CONFIG% ) else ( echo %CLIENT_CERT_NAME%.crt already exits... ) echo =========Finished ca root signaturing========== echo Importing ca root certs into keystore... keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass %PWD_SERVER_KS% -keystore %SERVER_KEYSTORE_NAME% keytool -import -v -trustcacerts -alias ca_root -file ca.crt -storepass %PWD_CLIENT_KS% -keystore %CLIENT_KEYSTORE_NAME% echo Importing signatured keys... keytool -import -v -alias %SERVER_CERT_NAME% -file %SERVER_CERT_NAME%.crt -keypass %PWD_SERVER_KEY% -storepass %PWD_SERVER_KS% -keystore %SERVER_KEYSTORE_NAME% keytool -import -v -alias %CLIENT_CERT_NAME% -file %CLIENT_CERT_NAME%.crt -keypass %PWD_CLIENT_KEY% -storepass %PWD_CLIENT_KS% -keystore %CLIENT_KEYSTORE_NAME% echo All done! 三、运行批处理: 1、Name:名,填写CN 2、State or Province Name:省州名,填写ShanDong 3、Locality Name:城市名,填写YT 4、Organization Name:组织名,xcg 5、Organization Unit Name:单位名,xcg 6、Common Name:xcg 7、Email Address:

抱歉!评论已关闭.