RSS
热门关键字:  cms  下载  模版  开源  dedecms
当前位置 :| 主页>站长学院>服务器>

原来win+apache实现ssl的证书认证如此简单

来源:ChinaUnix.net 作者:未知 时间:2006-09-13 点击:

windows+apache的情况下,实现ssl的证书认证
(win下用openssl做证书极为困难的问题彻底解决了)

我写得非常详细,一步一步都说得很清楚。实际操作极为简单,要不了5分钟,是我的字打得太多了.如果发现错误,遗漏请提出。

首先,到http://hunter.campbus.com/去下载和自己的apache版本相同的的Apache_xxx-xxxOpenssl_xxx-Win32.zip。解压缩后找到这5个文件mod_ssl.so(modules目录),ssl.conf,ssl.default.conf(conf目录,

其中default.conf作为备份),libeay32.dll, ssleay32.dll(这2个都在bin目录)。把它们全都复制到你自己的apahce下的对应目录。



###############################################################################

接下来,更改设置文件


对于httpd.conf和ssl.conf,如果你的服务器没有域名,那么servername就填ip好了。
比如:ServerName 10.10.10.10:80(httpd.conf)
ServerName 10.10.10.10:443(ssl.conf)

打开httpd.conf:
找到#LoadModule ssl_module modules/mod_ssl.so,去掉前面的‘#‘,这样就在启动时加载了ssl模块。

打开ssl.conf:
找到#<IfDefine SSL>和#</IfDefine>,把前面的’#‘号都去掉,否则启动apache时还要加参数,麻烦。
如下设置:
SSLMutex none                         (这个我是none,有人是default,具体怎么设可以研究一下)
SSLCertificateFile conf/server.crt    (服务器证书的位置,就是公钥吧?)
SSLCertificateKeyFile conf/server.key (服务器私钥的位置)
SSLCACertificateFile conf/ca.crt      (CA根证书的位置,进行客户端验证时需要。也是一个CA公钥吧?

我把它们都放在apache的conf目录下了)
DocumentRoot "xxxxx"                  (指向要ssl加密认证的文档目录,比如"f:/http")

SSLVerifyClient require               (去掉前面的‘#’号,进行客户端验证时需要)
SSLVerifyDepth  1                     (去掉前面的‘#’号,把10改为1,进行客户端验证时需要)



##############################################################################
现在,就要制作证书了


去openvpn.net下载并安装openvpn。
这是一个虚拟个人网络制作工具,他能完美的在win(linux,BSD也行)下制作根、服务器、客户端证书。
安装完毕后,开始-程序-附件-命令提示符,进到openvpn的easy-rsa目录,比如:
f:\program files\openvpn\easy-rsa>_
输入:
init-config 回车

会产生几个文件,切换出来,打开vars.bat文件,修改其中的KEY_COUNTRY(国家2位字母), KEY_PROVINCE(省2位字母), KEY_CITY(城市), KEY_ORG(组织),  KEY_EMAIL(电子邮箱)这几个参数,免的后面制证时

反复输入麻烦。保存退出,继续使用命令提示符。
依次输入以下两个命令,当然是分别回车喽:
vars
clean-all   (这两个是准备工作)




####################################################################################


1.
建立CA根证书


接着输入build-ca   回车(这个就是建立CA根证书啦)


然后显示:

ai:/usr/share/openvpn/easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:          国家名2位字母,默认的参数就是我们刚才修改过的。
State or Province Name (full name) [NA]:    省、州名2位字母
Locality Name (eg, city) [BISHKEK]:         城市名
Organization Name (eg, company) [OpenVPN-TEST]:     组织名
Organizational Unit Name (eg, section) []:           组织里的单位名
Common Name (eg, your name or your server's hostname) []:这个是关键,应该输入颁发根证书单位的域名

,不过因为是根证书,所以怎么填都无所谓。只有服务器证书才需要认真填。
Email Address [me@myhost.mydomain]: 电子邮箱

好了,CA根证书制作完成!在keys目录下,它的名字就叫ca.crt,CA的私钥是ca.key


#######################################################################


2.
现在制作服务器证书:
在命令提示符下,输入
build-key-server server   回车
你会看到和上面很相似的东西
但要注意这里的Common Name (eg, your name or your server's hostname) []:
这个才是真正的关键。这里应该输入服务器的域名比如www.xxx.com。
如果没有域名,就应该填ip,与httpd.conf和ssl.conf里的设置对应,
ServerName 10.10.10.10:80(httpd.conf)
ServerName 10.10.10.10:443(ssl.conf)

也就是说填:10.10.10.10

接下来看到 a challenge password []:填不填随便,我不填
an optional company name []: 填不填随便,我不填

sign the certificate? [y/n] 敲y回车。用CA根证书对服务器证书签字认证。
1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的server.crt(证书)和server.key(私钥)


#######################################################################


3.
现在制作客户端证书:

在命令提示符下,输入
build-key client1   回车
又是一通国家省市组织等等,comman name也是随便填的。
然后
a challenge password []:填不填随便,我不填
an optional company name []: 填不填随便,我不填

sign the certificate? [y/n] 敲y回车。用CA根证书对客户端证书签字认证。
1 out 1 certificate requests certified,commit? [y/n] 敲y回车,确认。

好了,建好了在keys目录下的client1.crt(客户端证书)和client1.key(私钥)

等等, .crt的客户端证书是不能使用的,必须把它转化为.pfx格式的文件!!

所以,还是在命令提示符下,输入
openssl 回车
看到openssl>
再输入
pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx
回车,
看到Enter export password:会要求你建立客户端证书的输出密码,我填hehe,
verifying-Enter export password再确认一遍hehe,好了!


########################################################################


把keys目录下的ca.crt和server.crt,server.key都复制到apache的conf目录下,(ssl.conf需要)
ca.key自己保留吧,找个合适的地方储存起来.


#########################################################################


客户端安装证书


打开internet explorer(IE),工具-internet选项-内容-证书,点选'个人'
再点击导入,把客户端证书client1.pfx导入到个人组里(别忘了扩展名是pfx)。
这里还要输入刚才建立的输出密码hehe才能倒入呢。

接着,点选'受信任的根证书颁发机构',点击导入,把CA根证书ca.crt导入到受信任的根证书颁发机构里。


#########################################################################

好啦,重新启动apache,打开IE,
在地址栏里输入https://10.10.10.10或者域名,弹出个窗口要选择个人的数字证书。
点选,然后确定。
如果服务器证书的common name填写正确的话,你就可以直接进入网站了,看到右下角的小锁头(可靠的SSL128位)。
如果服务器证书的common name填写不正确,就会弹出个‘安全警报’框,告诉你3条:
1.安全证书由信任的站点颁发
(如果说是由不信任的站点颁发,那就是你的ca根证书ca.crt没有导入到ie的受信任的根证书颁发机构里)

2.安全证书的日期有效 
(这个日期缺省是10年,可以在openvpn的easy-rsa目录下的openssl.cnf里调整修改,然后重新制作一整套证书(openssl.cnf看起来像拨

号网络的快捷方式,要用记事本,写字板打开修改))

3.“安全证书上的名称无效,或者与站点名称不匹配”
这就是服务器证书的common name填写不正确所致,不过这也没关系,有人好像愿意这样。我是不想看到这个警告框,烦人。

即使有安全警报,你仍能进入网站,看到右下角的小锁头(可靠的SSL128位)


#################################
最后,成功啦!用吧。

我自己把httpd.conf里的listen 80都加#注释了,servername改为10.10.10.10:443,只用https不用http,嗬嗬!!!

 xieweihua 回复于:2005-04-02 21:37:34
就这么容易。老夫也去试试

 ataman 回复于:2005-04-03 01:27:15
关于ssl.conf文件里的指令很多我也不明白,请指点。

 acg 回复于:2005-04-04 12:24:08
证书认证 ?这个是什么证书?

 ouland 回复于:2005-04-07 10:54:40
查了好多都不好用。试试先。

 superisaac 回复于:2005-05-07 21:37:05
good

 wangxgcn 回复于:2005-05-09 16:08:31
在“build-key client1”时出现了错误,见下:

"Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
找不到 C:\Program Files\OpenVPN\easy-rsa\keys\*.old"

请指教

 ataman 回复于:2005-05-09 20:43:44
this problem happens rarely....if happens..you need remake.just restart  the process ...
init-config....
vars....
clean....
and so on

there's a file named build-key-pkcs12...you can use it to make client certificate with extend filename '*.p12'....and no need input "build-key.....openssl.....pkcs12....."


1.你用的windows xp吗?或是别的版本?win9x下好像不行 


2.我讲的这个方法是先制做client1.crt,再这样转换为client1.pfx。其实不用这么麻烦。 
openvpn/easy-rsa下面就有一个可以直接做client1.p12客户证书的。(p12和pfx是等价的) 
build-key-pkcs12 client1 
也就是说不必输入以下 
build-key client1 
openssl
pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx 
这两句了。 

3.如果你已经出现过一次错误,最好重新来一遍。 
init-cong 
vars什么的。

 wangxgcn 回复于:2005-05-10 11:04:44
谢谢你:)
我的系统是Win2K;
试了一下直接的方法,还是提示我找不到*.old文件;
重来也。。。偶太笨了:(

 ataman 回复于:2005-05-10 20:25:07
似乎.old的这个问题无法避免,但只是偶尔出现。应该重新init-config,vars,clear-all,然后按照顺序一步步来就又可以了。我自己是在winxp-pro-sp2下使用的。如果出现错误,就必须重新开始,因为一些文件已经变化了。
再重新来多试几遍。不行就重启一下机器。
我也没有什么能解决的好方法,难道是操作系统的问题?

 webajie 回复于:2005-05-20 15:41:04
[quote:cc84359d01="wangxgcn"]failed to update database
TXT_DB error number 2
找不到 C:\Program Files\OpenVPN\easy-rsa\keys\*.old"

请指教[/quote:cc84359d01]


在cmd里复制

pkcs12 -export –in keys/client1.crt -inkey keys/client1.key -out keys/client1.pfx 

回车

 webajie 回复于:2005-05-20 15:43:58
我遇到一个问题,就是按照作者的步骤,将ca,服务器,客户的证书都制作好了,但却在IE里添加不进去证书。。。如果选择“受信任的证书颁发机构”则,虽然说导入成功,但却找不到,如不选择,自动导入,能成功,也可以在个人里找的到,但,打开,却有错误标识,,,郁闷。。。望指点

 ataman 回复于:2005-05-20 20:16:32
应该是‘受信任的根证书颁发机构’吧!导入CA根证书。
在‘个人’里面导入客户端证书。
服务器证书应该不用导。

 dato 回复于:2005-05-22 10:10:17
对于SSL这块不是很明白

http://www.shininglightpro.com/products/Win32OpenSSL.html

这个应该是最简单的生成方法

SSL.bat
openssl req -new -key www.key -out www.csr

openssl rsa -in www.key -out www.key
openssl x509 -in www.csr -out www.crt -req -signkey www.key -days 730

 ataman 回复于:2005-05-22 15:30:32
楼上的,你试过吗?如果能够成功的制作CA.SERVER.Client这3个证书,并且持client能登录服务器就行.请给出步骤.
winopenssl我试过,如果仅仅是输入几个命令.做不出有效的客户断证书.当然,对源码熟悉,知道怎么配置的人除外.

 dato 回复于:2005-05-22 15:36:18
SSL这块不清楚啊,只是在自己站点用用
类似网络银行的那种吗,太复杂了,个人站点用不上。大家可以研究研究,

 ghost8864 回复于:2005-05-30 12:58:30
build-key client1时始终不行 出现
Sign the certificate? [y/n]:y 
failed to update database 
TXT_DB error number 2 
找不到 C:\Program Files\OpenVPN\easy-rsa\keys\*.old" 
错误
就算自己建一个somename.old又会出现另一种错误 :em16: 

其实build-key-server server时就会出现这个错误
我自己在key文件夹下面建立了一个old.old的文件
使build-key-server server时能够成功
但build-key client1不管怎么样都不成功
还希望楼主能指导下 谢谢

 dato 回复于:2005-05-30 18:42:47
不是这样的 。

最好在生成前面的证书时,备份一下文件。

可能是由于什么特殊的原因导致文件出现变化 ,跟目录下有无那个.old文件无关

 ghost8864 回复于:2005-05-30 20:48:16
不知道为什么

我的始终不能加载SSL模块

443端口无法打开

郁闷诶

 ataman 回复于:2005-05-30 21:30:52
你的ssl.conf文件,listen xxx.xxx.xxx.xxx:443了吗?
还是用的缺省的listen 443?(这个无效)
 Listen directives: "Listen [::]:443" and "Listen 0.0.0.0:443"
也就是listen ip:443

 timwhoung 回复于:2005-06-07 13:38:50
制作client时出现找不到.old的原因一般是由于Common Name 所填与server的相同,相同CA下,common name可能是要求唯一的,换一个就可以。
我照楼主的方法做好了CA,SERVER,CLIENT三张证书,也配置成功,服务器端成功,但客户端不能通过验证(会出现选择证书验证,但选取后找不到该页面),不知道什么原因?
另外问一下:能通过网页在线输出客户端证书吗?也就是通过程序生成客户证书...

 ataman 回复于:2005-06-07 16:43:22
你选择了客户端证书以后,‘找不到页面’?地址是https://xxx.xxx.xxx.xxx吗?别的我也说不清了,重新做能否改变呢?假如不要客户端认证,能否登录页面?如能登,进行客户端认证却不能登录,恐怕还是证书有问题。
你说的方法肯定可以,不过需要有人对源码了解,且能自己编。大概用php就行。
更复杂的认证,需要数据库,每个人有不同的客户端证书,服务器他们的有权限,时间期限等等。服务器端还可以随时作废客户端等等。这都需要人去编程啊。源码主要是openssl的吧。

 timwhoung 回复于:2005-06-08 14:53:06
去掉SSLVerifyClient require是可以用https来访问的(也会出现小锁),
加上后,会出现选择数字证书框,选择事先导入的客户端证书,确定后出现“找不到服务器,无法显示网页”
估计也是证书问题,但就是不知道为什么会出现问题

 timwhoung 回复于:2005-06-08 16:38:47
终于搞明白了,原来是我的配置有问题:
把SSLCACertificateFile conf/ca.crt错改成SSLCertificateChainFile conf/ca.crt了
ataman ,你试过用PHP生成客户端证书吗?好像PHP有openssl模块的,但不知道如何用...

 ataman 回复于:2005-06-08 18:57:12
我对编程可是一窍不通。不过php: can do everything....所以,一定可以。
前提是,php熟悉,openssl源码熟悉。
咱们的这种方法,各种客户端证书实际上都是一样的,太简单。要复杂一些,就要靠能人了

 timwhoung 回复于:2005-06-09 09:24:22
呵,SSL很多都看不懂!
我的目的是通过自建CA,给客户发证,但要求每一个持证用户的证书只能用在一台机器上(也就是想不能重复安装,不能导出,只在第一次安装的机器中有效,或者在指定的机器上安装才有效),不知道有没有办法?

 ataman 回复于:2005-06-09 20:13:09
这个可就复杂了。需要专业编程人员了...

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
栏目列表