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已经结合进去了,配置方法相对简单的多,在这里不予介绍了。
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
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路径下
设置好路径(拷到你的编译目录或者System32下,或其它能找到的地方),以便VC++可以找到。
perl configure.bat --with-apache=C:/apache/apache_1.3.27 --with-ssl=C:/apache/openssl
注意 这一步不要将mod_ssl的源代码和apache的源代码放在一个目录下,目录也尽量不要带空格。
nmake /f Makefile.win
apache程序就被安装到C:/apache/apache中
一个存为.cer,并获取到根证书,如果是多级根证,将多个根证文件拷贝到一个文件中保存为.cer
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>
保存
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;
}
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
访问“https://IP:SSl端口/cgi-bin/应用名.cgi”如
“https://127.0.0.1:443/cgi-bin/getCert.cgi”
将弹出选择用户证书对话框,选择用户证书后进入CGI页面,页面上将显示用户证书的公钥证书编码,至此Apache配置完成
将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程序,与用户应用相结合,至此整个应用完成
这里我们用到的各种安装包的版本:
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.71.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/system32copy 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.272.1.3 mod_ssl的下载
http://www.modssl.org下载,并解压到C:/apache/mod_ssl-2.8.14-1.3.272.2 配置MOD_SSL
cd C:/apache/mod_ssl-2.8.14-1.3.27perl 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/srcnmake /f Makefile.win
2.4 安装apache
nmake /f Makefile.win installr INSTDIR=C:/apache/apacheapache程序就被安装到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.exe3 CGI程序编写
3.1 编写CGI程序
打开文本编辑器编辑下面的程序并保存为getCert.cinclude <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程序,与用户应用相结合,至此整个应用完成
相关文章推荐
- 获取 X509 证书的 Version 信息 (openssl)
- openssl 获取x509.pem 证书信息
- openssl自建证书SSL+apache
- openssl建立证书,非常详细配置ssl+apache
- Linux下使用Openssl颁发Apache证书
- openssl自建证书SSL+apache
- openssl建立证书,非常详细配置ssl+apache
- 获取 X509 证书 serial (openssl)
- openssl建立证书,非常详细配置ssl+apache
- php获取证书序列号时openssl_x509_parse内存泄漏的替代的方案
- 通过OpenSSL获取证书扩展属性之二:“密钥用法”和"增强型密钥用法"
- openssl建立证书,非常详细配置ssl+apache
- openssl命令生成公私钥、证书方法,apache/tomcat支持https的证书配置
- Apache+OpenSSL实现证书服务器提供HTTPS
- openssl建立证书,非常详细配置ssl+apache
- Openssl编程获取X509证书的DNS
- openssl生成证书以及获取公钥和私钥
- 通过OpenSSL获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
- Openssl编程获取证书common name
- 原来win+apache实现ssl的证书认证如此简单 +使用openssl来生成CA证书、申请证书、颁发证书以及撤销证书的过程