您的位置:首页 > 运维架构 > Apache

Windows2000 下apache+OpenSSL+ModSSL+获取证书

2007-08-21 21:51 381 查看
本文介绍了在Windows2000平台下安装Apahce,并配置SSL,和使用CGI的方式获取用户证书的方法,在其他平台下安装使用方法相似,请自行变通。
这里我们用到的各种安装包的版本:
apache :ache_1.3.27-win32-src
modssl :mod_ssl-2.8.14-1.3.27
openssl :openssl-0.9.7exe
perl :ActivePerl-5.6.1.638-MSWin32-x86
VC :VC6
l 注意:本文所列举的Apache支持apahce1.3,apache2以上版本配置方法变更,apahce2以上版本将ssl已经结合进去了,配置方法相对简单的多,在这里不予介绍了。

1 OpenSSL的安装

1.1 所需资源

1.1.1 下载OpenSSL 

到OpenSSL的官方主页(http://www.openssl.org)去下载,并解压到C:/apache/openssl-0.9.7

1.1.2 下载perl

http://aspn.activestate.com/

1.2 编译

l 设置环境变量
c:/> cd d:/program files/Microsoft visual studio/vc98/bin
c:/> d:
c:/> VCVARS32.BAT
l 安装perl
在系统环境变量中设置好perl所在路径如c:/Perl/bin/;
l 编译openssl
cd C:/apache/openssl-0.9.7
perl Configure VC-WIN32
ms/do_ms
nmake /f ms/ntdll.mak

1.3 安装OpenSSl

copy out32dll/libeay32.dll C:/WINNT/system32
copy out32dll/ssleay32.dll C:/WINNT/system32
md C:/apache/openssl
md C:/apache/openssl/bin
md C:/apache/openssl/lib
md C:/apache/openssl/include
md C:/apache/openssl/include/openssl
copy /b inc32/openssl/* C:/apache/openssl/include/openssl
copy /b out32dll/ssleay32.lib C:/apache/openssl/lib
copy /b out32dll/libeay32.lib C:/apache/openssl/lib
copy /b out32dll/ssleay32.dll C:/apache/openssl/bin
copy /b out32dll/libeay32.dll C:/apache/openssl/bin
copy /b out32dll/openssl.exe C:/apache/openssl/bin
将OpenSSL安装到C:/apache/openssl路径下

2 Apache与mod_ssl的安装 

2.1 所需资源

2.1.1 下载awk.exe

到http://cm.bell-labs.com/cm/cs/awkbook/index.html下载awk95.exe,另存为awk.exe,
设置好路径(拷到你的编译目录或者System32下,或其它能找到的地方),以便VC++可以找到。

2.1.2 APACHE下载 

http://www.apache.org下载,并解压到C:/apache/apache_1.3.27

2.1.3 mod_ssl的下载

http://www.modssl.org下载,并解压到C:/apache/mod_ssl-2.8.14-1.3.27

2.2 配置MOD_SSL

cd C:/apache/mod_ssl-2.8.14-1.3.27
perl configure.bat --with-apache=C:/apache/apache_1.3.27 --with-ssl=C:/apache/openssl
注意 这一步不要将mod_ssl的源代码和apache的源代码放在一个目录下,目录也尽量不要带空格。

2.3 编译apache

cd C:/apache/apache_1.3.27/src
nmake /f Makefile.win

2.4 安装apache

nmake /f Makefile.win installr INSTDIR=C:/apache/apache
apache程序就被安装到C:/apache/apache中

2.5 制作通信证书

从CA中签发一个文件形式(pfx)然后用工具out32dll(参见附件)将文件导成两个。一个存为.key
一个存为.cer,并获取到根证书,如果是多级根证,将多个根证文件拷贝到一个文件中保存为.cer

2.6 配置httpd.conf

l 加入模块加载指令
LoadModule ssl_module modules/mod_ssl.so
l 加入AddModule指令与LoadModule对应
AddModule mod_ssl.c
l 加入要侦听的端口
Listen 80
Listen 443
l 加入日志部分
<IfModule mod_ssl.c>
SSLPassPhraseDialog builtin
SSLSessionCache dbm:C:/apache/apache/logs/ssl_scache
SSLSessionCacheTimeout 300
#SSLMutex file:C:/apache/apache/logs/ssl_mutex
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
SSLLog C:/apache/apache/logs/ssl_engine_log
SSLLogLevel info
</IfModule>
l 最后加入虚拟主机,在虚拟主机中配置公钥私钥路径
NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1:443>
#页面路径
DocumentRoot C:/apache/apache/htdocs
#域名
ServerName www.ivy.com.cn
#错误日志
ErrorLog C:/apache/apache/logs/error_log
#打开SSL引擎
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
#公钥证书路径
SSLCertificateFile C:/apache/apache/conf/server.cer
#私钥文件路径
SSLCertificateKeyFile C:/apache/apache/conf/server.key
#根证书路径
SSLCACertificateFile C:/apache/apache/conf/ca.cer
#请求客户端证书
SSLVerifyClient require
#加入证书环境变量,以便于获取证书
SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars +StrictRequire
<Files ~ "/.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</Files>
#打开CGI使用
<Directory "C:/apache/apache/cgi-bin">
Options +ExecCGI
</Directory>
#设置CGI使用后缀
AddHandler cgi-script .cgi
SetEnvIf User-Agent ".*MSIE.*" /
nokeepalive ssl-unclean-shutdown /
downgrade-1.0 force-response-1.0

CustomLog C:/apache/apache/logs/ssl_request_log /
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x /"%r/" %b"
</VirtualHost>
保存

2.7 启动Apache

运行C:/apache/apache/ Apache.exe

3 CGI程序编写

3.1 编写CGI程序

打开文本编辑器编辑下面的程序并保存为getCert.c
include <stdlib.h>
#include <stdio.h>

void main()
{
char* szCert = NULL;
//客户端证书的环境变量
szCert = getenv("SSL_CLIENT_CERT");

printf("Content-type: text/html/n/n");
printf("<html>/n");
printf("<body>/n");
//CheckCert.jsp要改成实际jsp的连接
printf("<form name=/"form1/" action=/"/CheckCert.jsp/" method=post>/n");
//实际使用中可以把这句注释掉把下面一句打开即把文本框隐藏
printf("<input name=/"clientcert/" value=/"%s/">/n",(szCert == NULL)?"":szCert);
//printf("<input type=hidden name=/"clientcert/" value=/"%s/">/n",(szCert == NULL)?"":szCert);
//实际使用中下面一句要注释掉以便于自动跳转
printf("<input type=submit value=/"转到/">/n");

printf("</form>/n");
printf("<script languate=/"javascript/">/n");
实际使用中下面这句要放开以便于自动跳转
//printf("form1.submit();/n");

printf("</script>/n");
return;
}

3.2 编译CGI程序

l Windows平台中用
cl –o 应用名.cgi getCert.c 编译
l 其他平台用
gcc –o 应用名.cgi getCert.c 编译
编译后产生<应用名.cgi>的文件,将此文件复制到C:/apache/apache/cgi-bin
例如cl –o getCert.cgi getCert.c,编译后生成getCert.cgi

4 完成测试

客户端浏览器中装入与通信证书同一CA签发的客户证书
访问“https://IP:SSl端口/cgi-bin/应用名.cgi”如
“https://127.0.0.1:443/cgi-bin/getCert.cgi”
将弹出选择用户证书对话框,选择用户证书后进入CGI页面,页面上将显示用户证书的公钥证书编码,至此Apache配置完成

5 结合应用

将Apahc与java的Web服务器链接
将CGI的.C程序改成在实际使用的方式,隐藏证书编码并设置好页面路径和自动跳转
用编译CGI的方式重新编译并重新放置CGI程序
编写jsp网页程序获取客户公钥证书,并解析证书主题例子如下
<%@ page contentType="text/html; charset=GB2312" %>
<%@ page import="java.io.*"%>

<%@ page import="java.security.*"%>
<%@ page import="java.security.cert.CertificateFactory"%>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>

<BODY bgColor=lightgreen>
<form name="Checkcert" method="post" >
<%

//获取客户端证书

String Certcert =request.getParameter("clientcert");
if(null == Certcert)
{
out.println("<br>获取用户证书失败<BR>");
return;
}
else
{
out.println(Certcert);
}

CertificateFactory cf = CertificateFactory.getInstance("x509");
ByteArrayInputStream bin = new ByteArrayInputStream(Certcert.getBytes());
X509Certificate gaX509Cert = (X509Certificate)cf.generateCertificate(bin);
String id=gaX509Cert.getSubjectDN().toString();

out.print("证书主题是:"+id);

%>
</form>

</BODY>
</HTML>
通过Https方式访问CGI页面,页面自动跳转到测试jsp页面,测试jsp页面上打印出来了证书编码和证书主题,测试成功。将测试页面的jsp程序,与用户应用相结合,至此整个应用完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: