文章参考:
[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]
[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得集成环境
最近要做一个SSL的应用,先后了解了两个命令,一个是keytool,一个是openssl。keytool是JDK得集成环境
。只要安装了JDK,基本上都会有(^_^,除非你安装太老的!),我用的1.5。 在安装openssl的时候,花了半天时间
。
用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这
用SSL进行双向身份验证意思就是在客户机连接服务器时,链接双方都要对彼此的数字证书进行验证,保证这
是经过授权的才能够连接(我们链接一般的SSL时采用的是单向验证,客户机只验证服务器的证书,服务器不验证客户
机的证书。而连接网上银行时使用的U盾就是用来存储进行双向验证所需要的客户端证书的)。
JDK工具KEYTOOL
-genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥
-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 ....
-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 文件名
-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
命令:
生成证书
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-
一、下载:
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,没有的话手动添加。测
二、安装:
编译器VC6机器上一直有,不是这次特意安装的。貌似只要是c++编译器就差不多。
1.安装VC和ActivePerl,先后顺序无所谓,安装时注意勾选添加环境变量的选项。
2.检查VC6的环境变量,path需要包含C:\Program Files\Microsoft Visual Studio\VC98\bin,没有的话手动添加。测
试是否有vc环境最
简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报:“'cl' 不是内部或外部命令,也
简单的测试方法是在执行install.bat前先在cmd下执行下cl,没有vc环境的话会报:“'cl' 不是内部或外部命令,也
不是可运行的程序
”。
另外,还有一种办法:可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个
”。
另外,还有一种办法:可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个
文件。因为不同版
本的vc这个文件所在位置不同所以我就不说明它的位置了。
3.解压Openssl,解压后会发现openssl-0.9.8i目录下面有很多文件,更改文件夹名称为openssl,并剪切到c:\openssl
其中的一个文件是INSTALL.W32用记事本或者其他文本编辑器打开,这个文件是介绍Win32平台的安装方法,我下面的批
本的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就可以了。
的批处理安装即可。
在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的安装目录下可以搜索到这个文件。因为不同版本
1.安装时间比较长,请耐心等待
2.每个步骤间使用了pause暂停,便于观察。每步完成后按任意键继续,注意有没有报错。
3.可以手工调用vc目录下设置环境变量的批处理vcvars32.bat,在VC的安装目录下可以搜索到这个文件。因为不同版本
的vc这个文件所在
位置不同所以我就不说明它的位置了。测试是否有vc环境最简单的测试方法是在执行install.bat前先在cmd下执行下cl
位置不同所以我就不说明它的位置了。测试是否有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 建议使用
会报
'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 =
因为我使用非常简单的功能所以我没有修改它,需要的朋友可以尝试修改它。
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,
最后的输出都在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中
编程初步:
1、打开VC-Tools-Options-Directores,在Include files中增加【openssl-0.9.8】\inc32目录;在Libray files中
增加【openssl-0.9.8】\out32dll
2、源程序中包含以下三个头文件并加入LIB:
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")
3、 参考源码开始编程:[url]http://www.kennethballard.com/Download/intro-openssl.zip[/url]
2、源程序中包含以下三个头文件并加入LIB:
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/bio.h>
#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
运行该指令后系统提示输入 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私有密钥的关键
# 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
任意建立一个文件夹,比如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!
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:
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:
转载于:https://blog.51cto.com/xuchenguang/149883