Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91996
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1007
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-20 14:50
文章分类

全部博文(81)

文章存档

2014年(21)

2013年(60)

我的朋友

分类: Java

2013-12-25 13:30:37

  第一节 基础知识

  最近要做一个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][/url]

  ActivePerl版本5.8.8.822 [url]

  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][/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 (sdudd1225

  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:

阅读(739) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~