如何在Windows下编译OpenSSL (Vs2005使用Vc8的cl编译器)
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms/do_ms
在解压目录下执行ms/do_ms命令
6、nmake -f ms/ntdll.mak
编译后
在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件
注 意:在运行第五步时,cl编译器会抱怨说./crypto/des/enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。
于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。
继续执行nmake -f ms/ntdll.mak
关于openssl的安装编译,网上太多转载的一摸一样的文章并且说得相当模糊。新手刚开始使用openssl,看得总是半懂不懂,出现很多错误。www.openssl.org上面也没有很具体的文档说明(或者我没看懂)。在5天摸爬滚打地以蜗牛的速度安装编译以及最后成功生成好客户端服务器公钥私钥证书文件之后,俺决定一定要写一篇巨详细巨完整的教程。实在受不了一些抽象的教程。看得莫名其妙。还是得自己好好研究才行。
首先,要在www.openssl.org这个网站上下载openssl的压缩包。这下就有好多版本得可以选择了。最新的是openssl-1.0.0-beta3.tar.gz。我下了三个版本的,除了最新版的,还有openssl-0.9.8k.tar.gz和openssl-0.9.8e.tar.gz。网上还有说openssl不适合windows的开发环境(很多教程是for linux的)。可能不同版本适应不同的操作系统吧,无法验证(仅仅猜测的)。我最后成功安装编译生成证书的版本是openssl-0.9.8e.tar.gz。
开始正题,下载下来后肯定得先解压。解压之后,接下来的事情就是要安装它了。这个时候需要下一个软件:
1,下载ActivePerl-5.8.0.806-MSWin32-x86并安装:http://www.sogoz.info/down.asp?id=3683&no=1
2,VS2005或者VC 6.0 或者VS2008。
安装步骤:(可以参照openssl目录下的install.win32文件(我用notepad打开的,看得太累,放弃了))
1,在程序里面选visual studio 2005 command prompt,cd openssl这个文件夹,例如:
F:/Program Files/Microsoft Visual Studio 8/VC>cd F:/Documents and Settings/PG338
17268/Desktop/openssl-0.9.8e/openssl-0.9.8e
然后输入命令:perl Configure VC-WIN32
2,ms/do_ms
3,如果跳到vs的bin目录下,执行vcvars32.bat以配置环境变量
4,再用cd命令打开openssl文件夹,执行nmake -f ms/ntdll.mak
如果编译成功,会在openssl的目录下生成一个out32dll文件夹。
生成证书:这下操作都在out32dll这个文件夹里面。在out32dll文件夹中找到一个可 执行程序 openssl.exe,双击 运行它。
1.首先要生成服务器端的私钥(key文件):
openssl genrsa -des3 -out server.key 1024
运行时会提示输入密码,此密码用于加密key文件(参数des3便是指加密算法),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令。还有,这里输入密码的时候是不显示任何东西的!!(刚开始我以为我键盘失灵了~~!囧~~)输入密码后还要确认一下,输两遍。
去除key文件口令的命令:
openssl rsa -in server.key -out server.key
2.openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交给CA签名后形成服务端自己的证书.
这个地方就会报错啦哈哈哈。
用俺简单地头脑来解释这个错误就是说openssl.cnf文件找不到。那这个文件在哪里呢?这是openssl的配置文件,在apps目录下,例如我的就是F:/Documents and Settings/PG33817268/Desktop/openssl-0.9.8e/openssl-0.9.8e/apps里面。找到它。复制,粘贴到out32dll这个文件夹里面去!!~~
好了,重新把这个命令运行一下,ok了,屏幕会提示一步一步输入个人信息。例如国家啊省啊城市啊单位啊个人名字啊邮件地址啊之类的。
3.对客户端也作同样的命令生成key及csr文件:
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr -config openssl.cnf
4.CSR文件必须有CA的签名才可形成证书.可将此文件发送到verisign等地方由它验证,要交一大笔钱,何不自己做CA呢.
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
5.用生成的CA的证书为刚才生成的server.csr,client.csr文件签名:
Openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
Openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
这个地方又会出错啦哈哈哈哈。(害死人的错,俺四天都是浪费在这个上面了)
error:
I am unable to access the ./demoCA/newcerts directory~~~
先声明下,这个demoCA文件夹是在apps这个文件夹的目录下。
搜了google很多天,网上广为流传的一种方法是:
for linux:
mkdir demoCA
mkdir demoCA/newcerts
mkdir demoCA/private
touch demoCA/index.txt
echo "01" >> demoCA/serial
for windows:照着上面那个命令自己手动建嘛···
但是为啥俺都建了,还是有这个错误呢???
仍然unable to access the ./demoCA/newcerts directory~~~
网上流传着还有一个做法:
是在apps文件夹中有个CA.pl文件然后 perl CA.pl -newca 一下,我试了,没什么反映!囧
我把demoCA这个文件夹从apps下面拷到out32dll下面,也没用。
------------------------------分割分割分割--------------------------------------------------------
到今天(2009年8月27号)上午,这个问题终于解决了!!~~~~解决办法:
修改openssl的配置文件openssl.cnf:
首先程序-附件-打开notepad,把openssl.cnf拖进去,就可以查看这个文件了。
修改这个地方:
[ CA_default ]
dir =//demoCA # Where everything is kept——————>这个地方修改目录为你的demoCA文件夹所在的地方,填入路径。比如我的就是:F://Documents and Settings//PG33817268//Desktop//openssl-0.9.8e//openssl-0.9.8e//out32dll //demoCA(注意路径要用双斜杠//或者单反斜杠/)
certs = $dir//certs # Where the issued certs are kept
crl_dir = $dir//crl # Where the issued crl are kept
database = $dir//index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir//newcerts # default place for new certs.
certificate = $dir//cacert.pem # The CA certificate
serial = $dir//serial # The current serial number
crlnumber = $dir//crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir//crl.pem # The current CRL
private_key = $dir//private//cakey.pem# The private key
RANDFILE = $dir//private//.rand #
运行第5步的命令,终于不再报错啦!!会有两个提示,都选y就好了。
最后查看out32dll这个文件,要用的文件就都在里面啦。