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
引用:原帖由 "wangxgcn" 发表: failed to update database
TXT_DB error number 2
找不到 C:\Program Files\OpenVPN\easy-rsa\keys\*.old"
请指教
在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
这个可就复杂了。需要专业编程人员了...
sunsong 回复于:2006-02-26 15:02:04
步骤都这么做了,就是无法打开网页。
查看了error.log,有这么几行:
[Sun Feb 26 14:27:01 2006] [notice] Apache/2.0.55 (Win32) mod_ssl/2.0.55 OpenSSL/0.9.8a configured -- resuming normal operations
[Sun Feb 26 14:27:01 2006] [notice] Server built: Oct 9 2005 19:16:56
[Sun Feb 26 14:27:01 2006] [notice] Parent: Created child process 3668
[Sun Feb 26 14:27:02 2006] [warn] Init: Session Cache is not configured [hint: SSLSessionCache]
[Sun Feb 26 14:27:02 2006] [warn] Init: (192.168.0.103:443) You configured HTTP(80) on the standard HTTPS(443) port!
[Sun Feb 26 14:27:02 2006] [notice] Child 1280: Released the start mutex
[Sun Feb 26 14:27:02 2006] [warn] Init: (192.168.0.103:443) You configured HTTP(80) on the standard HTTPS(443) port!
[Sun Feb 26 14:27:02 2006] [notice] Child 3668: Child process is running
[Sun Feb 26 14:27:02 2006] [notice] Child 3668: Acquired the start mutex.
[Sun Feb 26 14:27:02 2006] [notice] Child 3668: Starting 250 worker threads.
[Sun Feb 26 14:27:03 2006] [notice] Child 1280: Waiting for 250 worker threads to exit.
[Sun Feb 26 14:27:03 2006] [notice] Child 1280: All worker threads have exited.
[Sun Feb 26 14:27:03 2006] [notice] Child 1280: Child process is exiting
llzqq 回复于:2006-02-26 15:45:34
本来就不复杂吗
bigleibigs 回复于:2007-01-12 18:14:50
我也是无法打开网页
xxd1019 回复于:2007-01-27 15:00:29
顶上去。 楼主辛苦可
black_fire 回复于:2007-06-26 12:13:20
我做了https服务, 生成了 client 和 CA 的证书,分别为ca.crt和client.pfx
在firefox 中将ca.crt和client.pfx导入, 双向认证成功
而在IE中, 同样导入,client.pfx导入到“个人”, ca.crt导入到 ""受信任的根证书颁发机构" 认证不成功. 查看证书时看到如下信息:
"因为证书路径中的证书颁发机构似乎没有颁发证书的权限或不能被用作终端实体证书,证书无效"
使用IE的情况下, 查看 httpd的 ssl日志 (ssl_request_log)时 根本没有分身任何信息
这是为什么呢?
|