霜天部落 | 专注PHP研发,研究LAMP高性能架构部署与优化

windows+apache实现ssl的证书认证

本文介绍了如何在windows系统下实现apache ssl的过程,作者写的很详细,本博特发表于此,方便借鉴学习。

我写得非常详细,一步一步都说得很清楚。实际操作极为简单,要不了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:
找到#和#,把前面的’#‘号都去掉,否则启动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 filesopenvpneasy-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。

感谢原文作者,文章出处:windows+apache实现ssl的证书认证 http://www.cublog.cn/u/21717/showart_239046.html