安全技巧:配置 IIS 4.0 证书鉴定

8/18/2000来源:ASP技巧人气:18534

配置 IIS 4.0 证书鉴定

Ramon Ali
Windows NT杂志 - 1999 年2月


使用证书服务器1.0(Certificate Server 1.0)来作为证书权威

如果你能赋予可信用户透明地访问加密网站的权限,岂不是很好?这样的话,每当这些用户在进入你的站点的时候,就不必总是需
要输入他们的用户名和口令了。用户可以同你的网站上的加密部分进行通信,而无须提供用户名和口令的一个方法是,在配置IIS
(Internet Information Server,互连网信息服务器)要求质询/响应认证之后,在Windows NT系统上使用IE浏览器。但如果你
的用户使用的并不是NT系统或IE浏览器,那又该怎么办呢?答案就是:使用Microsoft Certificate Server(微软证书服务
器)。

Certificate Server 是 NT 4.0 Option Pack 的组成部分之一,它使你能够为那些身份验证合格的用户生成并发放数字证书,
从而使他们在登录站点时可以不必提供身份证明就可以访问自己的NT用户帐号。

数字证书对于网络的安全性非常重要。数字证书实际上是一份电子文档,计算机系统可以利用它来确定和验证那些正在浏览网络,
收发电子邮件和传输文件的用户的身份。获取数字证书的一条途径是通过证书权威。这些机构通过核实用户的身份而向他们或他们
的系统颁发证书。证书服务器(Certificate Server)让你充当企业内部的证书权威的角色,使你能够保护员工的机密性,削减
开支并提高服务质量。(想获得关于证书权威和数字证书的背景信息,请参阅1997年10月期上Tao Zhou的文章"You Can Be a
Web Certification Authority")

然而不幸的是,查找有关配置证书服务器的有价值文档相当困难。在TechNet和微软网站上,你或许能找到零星的只字片语,但这
些粗略的材料往往使你不能很快就弄明白。所以在本文中,我将和你一起一步步地演示我所了解的安装和配置证书服务器的过程,
包括怎样安装证书服务器,启动证书权威服务和颁发客户证书。

起点

首先,你需要安装IIS4.0,Microsoft Management Console (MMC,微软管理控制台)和Certificate Server 1.0。这些都包含
在微软Windows NT 4.0 Option Pack的CD-ROM光盘上。微软公司在它的站点(http://www.microsoft.com/china/)上发布了用
于修正Certificate Server1.0缺陷的最新补丁。该缺陷导致当系统同时允许证书和匿名访问时,没有证书的用户会被挡在站点之
外。根据我使用证书服务器的经验,你其实并不需要这个补丁。因为当你配置访问许可方式时,你可以避开这个问题。这点后面我
将解释。(但是,我不幸还遇到其他一些错误,而目前还没有针对它们的补丁程序。)

从Option Pack CD-ROM光盘上安装证书服务器。如果你已经安装了证书服务器而只是还不能让它正常运行,我将告诉你一个秘
诀。当证书服务器的安装过程提示你在安装窗口中输入CA(Certificate Authority,证书权威)的具体信息时,如屏幕1所示,


屏幕1

如果你在State域中不输入CA姓名,IIS就不能在它的数据库中正确的注册这个CA,导致证书服务器不会接受带这个CA签名的客户证
书。如果你碰到了这个问题,你必须重新安装证书服务器。然而,当你重新安装证书服务器时,可能会收到下面两条错误信息中的
一条--证书服务器配置向导(Configuration Wizard)错误或Windows NT安装错误。在所有我碰到的情况下,这些信息仅仅表明
文件csback.gif, csbull.gif, 和cslogo.gif没有从Certificate Server 的根目录 (通常是 C:\winnt\system32
\certsrv) 拷贝到CertEnroll 子目录下。如果你收到这些错误信息,不妨手工完成这些文件的拷贝。

从NT的控制面板中服务项中启动证书权威(Certificate Authority)服务。如果服务不能启动,问题可能是服务器找不到
Microsoft access 数据库certmdb.mdb。不知道什么原因,证书服务器安装时将ODBC(Open Database Connectivity,开放式
数据库连接)系统数据源名称(Data Source Name)指向证书服务器根目录,而同时在CertAdm子目录中的 global.asa 文件中却
将其指向C:\winnt\system32 目录。而实际上证书服务器r 安装时将certmdb.mdb 文件放在C:\winnt\system32目录下。所以,
需要修改CertSrv 系统数据源名称 (从控制面板, ODBC项中),使其指向certmdb.mdb 文件, 如屏幕2所示。这样,你的CA 服务
就业已就绪,可以运行了。


屏幕2

设置CA

Certificate Server 安装程序将提示为服务器创建一个SSL (Secure Sockets Layer,安全套接层) 密匙。SSL 服务器密匙允
许网络服务器和客户浏览器进行安全加密的会话。如果没有SSL 密匙, IIS 4.0将无法使用基于证书的客户验证。在Create New
Key(创建新密匙)对话框中通过选择"Automatically send the request to an online authority(自动将申请发送到某在
线权威)"选项,你可以一次生成并签名SSL服务器密匙请求,如屏幕3所示。


屏幕3

如果你选择生成一个密匙请求文件,可以利用证书服务器的命令行实用工具certreq.exe验证这个文件。 (你可以用此文件从第三
方CA那里获得一个服务器密匙签名。) 当你获得一把带有签名的密匙时,证书服务器安装就大功告成了。

现在,你必须把你刚创建的CA增加到服务器的可信CA列表中去。通过在你的浏览器中安装服务器密匙可以做到这点。为此,启动服
务器上的IE 4.0 ,浏览站点http://server name/certsrv/certenroll/cacerts.htm。标题为Certificate Authority
Certificate List 的网页将会出现,并将列出你刚生成的CA密匙。点击此连接并选择"Open this file from its current
location(在当前位置打开此文件)",你将看到安装New Site Certificate(新站点证书)的提示,如屏幕4所示。



屏幕4

点击View Certificate, 确证密匙细节输入无误,然后点击OK。你将看到另一提示询问你将此证书增加到顶级储藏中,点击OK。
在IE 4.0中选择View菜单,依次选择Internet Options, Content, Authorities,检查IE 4.0是否已经成功地把证书增加到可信
权威列表中了。你将看到刚生成的CA处于IE 4.0的证书权威列表中,如屏幕5所示。



屏幕5

最后,在IIS安装的根目录下(通常是C:\winnt\system32\inetsrv)运行下面的命令。这些命令将利用用你生成的CA的详细数据更
新IIS 数据库:

Iisca

Net stop iisadmin /y

Net start w3svc

颁发客户证书

现在你可以开始颁发客户证书了。客户证书将直接安装在浏览器上。(Netscape 和Microsoft公司的新浏览器都支持客户证书;
但是,我将着重讲IE 4.0。)从客户端浏览http://server name/certsrv/certenroll/ceenroll.asp。Certificate
Enrollment Form(证书登记表)将让你填写客户证书的各个细节。正确填写各项并点击Submit Request(提交要求)。当提交要
求时,将调用IE 4.0的Web Server Enrollment Page(服务器的登记页)。在该页面上点击Download(下传)就能把客户证书安
装到浏览器上。选择View菜单,依次选择Internet Options, Content, Personal,可以检查客户证书是否正常安装了,你将在
IE 4.0的Client Authentication(客户验证)窗口中看到此客户证书。

在安装完客户证书之后,你需要让IIS知道此证书的拥有者被授权访问站点上受安全保护的区域。因为IIS的网络安全性是基于
Windows NT用户帐号的,所以IIS需要某种方法能将每个客户证书映射到服务器上某个NT用户或组的帐号上。实际上,IIS是利用
用客户证书映射表(Client Certificate Mapping table)来实现这一点的。为了创建客户证书映射,你必须将每个证书单独从
一个文本文件中引入IIS。这尽管是个繁琐的过程,但却可能是创建相应映射的唯一的方法。所以,必须找到某种方法能捕获客户浏
览器中安装的客户证书,并将其存放到文本文件中。最方便的办法是修改ASP(Active Server Pages,动态服务器网页)代码来实
现。清单1列出了把客户证书写入到一个文本文件中的ASP代码。

清单1 将客户证书写到文本文件的ASP代码

<% @Language = VBScript %>
<% Response.Buffer = True %>

<html>

<head>
<title>Client Certificate Capture</title>
</head>
<body>
<%
'Instantiate the ASP FileSystemObject in order
'to create a text file
Set fs = Server.CreateObject("Scripting.FileSystemObject")

'Create text file using append mode
Set outStream = fs.OpenTextFile( "C:\Inetpub\wwwroot\certificates\cert.txt", 8, True )

'Save certificate issuer information to text file
outStream.WriteLine( "# Issuer: " & Request.ClientCertificate("Issuer") )

'Extract certificate subject (user) and account information
'from certificate
su = Request.ClientCertificate( "Subject" )
mx = len(su)
for x = 1 to mx
if mid(su,x,1)=chr(10) or mid(su,x,1)=chr(13) then
su=left(su,x-1)+";"+right(su,mx-x)
end if
next
outStream.WriteLine( "# Subject: " & su )
outStream.WriteLine( "# Account: " & Request.ServerVariables("REMOTE_USER") )

'Extract encrypted certificate text from certificate; encode text as 64-bit data
uue = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

outStream.WriteLine( "-----BEGIN CERTIFICATE-----" )
cer = Request.ClientCertificate( "Certificate" )
lcer = len(cer)
l = 0

for x = 1 to lcer step 3
a1 = asc(mid(cer,x,1))
if x+1 <= lcer then
a2 = asc(mid(cer,x+1,1))
if x+2 <=lcer then
a3 = asc(mid(cer,x+2,1))
else
a3 = 0
end if
else
a2 = 0
a3 = 0
end if
outStream.Write mid(uue, (a1 and 252)/4 +1 ,1)
outStream.Write mid(uue, (a1 and 3)*16 + (a2 and 240)/16 +1 ,1)
if x+1 <= lcer then
outStream.Write mid(uue, (a2 and 15)*4 + (a3 and 192)/64 +1 ,1)
if x+2 <= lcer then
outStream.Write mid(uue, (a3 and 63) +1 ,1)
else
outStream.Write "="
end if
else
outStream.Write "=="
end if
l = l +4
if l = 64 then
outStream.WriteLine("")
l = 0
end if
next
if l > 0 then
outStream.WriteLine( "" )
end if
outStream.WriteLine( "-----END CERTIFICATE-----" )

Response.Write "Your certificate information has been received and logged successfully <br>"
Response.Write "You will be notified when we have configured your secured access to this Site "
%>

</body>
</html>

在你的网络服务器上创建一个目录来存放此ASP文件,并适当地修改代码中的路径,使它能将证书信息写到正确的地方。修改后的路
径如清单1所示。为了使此ASP程序能创建文本程序(清单1中是cert.txt),你需要在IIS中设置权限,允许对此目录进行写操作。
设置使存放此ASP文件的目录能同时以https方式和Anonymous方式访问,这样可以建立请求用户提交证书的提示。为了以https和
Anonymous方式访问,使用https://而不是http://来引用此ASP文件。运行此ASP文件的客户将收到请求提交客户证书的提示。结
果,用户提交的信息将写入到文本文件记录下来。

如果客户浏览此ASP文件时,而没有客户证书显示在客户验证窗口内,则可能是IIS元数据库中的CA信息出了问题。要解决此问题,
重新在IIS根目录下运行上文提到的三个命令(Iisca, NET STOP iisadmin /y,和 NET START w3svc)。现在cert.tx将应该包含
客户证书内容,如清单2所示。将清单2的内容拷贝到你喜爱的文本编辑器中,并保存到文件。

清单2 客户证书码的例子

# Issuer: C=AU, S=Test CA, L=Test Locality, O=Test Organization, OU=Test Unit, CN=Test CA
# Subject: EMAIL=ramon@sms.com.au, C=AU, S=NSW, L=Sydney, O=SMS Consulting Group P/L, OU=Network Services,
CN=Ramon Ali
# Account:
-----BEGIN CERTIFICATE-----
MIIDwzCCA22gAwIBAgIIChJSoAAAAAIwDQYJKoZIhvcNAQEEBQAweTELMAkGA1UE
BhMCQVUxEDAOBgNVBAgTB1Rlc3QgQ0ExFjAUBgNVBAcTDVRlc3QgTG9jYWxpdHkx
GjAYBgNVBAoTEVRlc3QgT3JnYW5pc2F0aW9uMRIwEAYDVQQLEwlUZXN0IFVuaXQx
EDAOBgNVBAMTB1Rlc3QgQ0EwHhcNOTgwODIwMDA1MDM3WhcNOTkwODIwMDA1MDM3
WjCBnzEfMB0GCSqGSIb3DQEJARYQcmFtb25Ac21zLmNvbS5hdTELMAkGA1UEBhMC
QVUxDDAKBgNVBAgTA05TVzEPMA0GA1UEBxMGU3lkbmV5MSEwHwYDVQQKExhTTVMg
Q29uc3VsdGluZyBHcm91cCBQL0wxGTAXBgNVBAsTEE5ldHdvcmsgU2VydmljZXMx
EjAQBgNVBAMTCVJhbW9uIEFsaTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDOE7cL
h26Y56e/vZX/WZVhWGXRE2Dj80ot16z5M0KMvi3nnwN3orDmwNrNlgaCu4TVHhnb
y/8UjI/qoZ4q/+2/AgMBAAGjggGwMIIBrDALBgNVHQ8EBAMCADgwEwYDVR0lBAww
CgYIKwYBBQUHAwIwgbIGA1UdIwSBqjCBp4AU8T1Ye5xrTFTBMeDkQrNnnAdXoFGh
faR7MHkxCzAJBgNVBAYTAkFVMRAwDgYDVQQIEwdUZXN0IENBMRYwFAYDVQQHEw1U
ZXN0IExvY2FsaXR5MRowGAYDVQQKExFUZXN0IE9yZ2FuaXNhdGlvbjESMBAGA1UE
CxMJVGVzdCBVbml0MRAwDgYDVQQDEwdUZXN0IENBghBvHlEkoACshBHSN7WYkDBE
MHUGA1UdHwRuMGwwM6AxoC+GLWh0dHA6Ly9HODkwOTU5L0NlcnRTcnYvQ2VydEVu
cm9sbC9UZXN0IENBLmNybDA1oDOgMYYvZmlsZTovL1xcRzg5MDk1OVxDZXJ0U3J2
XENlcnRFbnJvbGxcVGVzdCBDQS5jcmwwCQYDVR0TBAIwADBRBggrBgEFBQcBAQRF
MEMwQQYIKwYBBQUHMAKGNWh0dHA6Ly9HODkwOTU5L0NlcnRTcnYvQ2VydEVucm9s
bC9HODkwOTU5X1Rlc3QgQ0EuY3J0MA0GCSqGSIb3DQEBBAUAA0EAGRroJjwggP5n
812fb1/4/aifi4JqQxgCv5JTg2ocFHvudR924ucrCMWHqbmGW+F0x+jYREnXifyx
+alqFU7Ttg==
-----END CERTIFICATE-----

现在你可以生成客户证书与NT用户帐号之间的映射关系了。在IIS 4.0 Directory Security标签中选择你想要保护的目录,按照
如129页屏幕6所示的 Secure Communications 对话框的选项设置许可权限。


屏幕6

这种许可权限组合设定了对Web访问者有效证书的请求。在Secure Communications对话框中点击Edit(编辑)来创建客户证书映
射。(你可以生成通配符映射;但我在此只介绍单个映射。)确定你在Account Mappings(帐号映射)对话框中选中了Basic标签,
如屏幕7所示,点击Add(添加)来引入你从清单2中拷贝下来的证书文本文件。


屏幕7

你将看到提示询问证书文本文件。输入该文件的路径和文件名,点击OK。在Account Mappings对话框的Basic标签上,为这个映射
指定一个名字,输入相应的需要访问此安全区域的用户的NT帐号名(如IUSR_server等名字),然后输入并确认其NT用户口令。成功
的映射将如屏幕7所示相仿。

恭喜--你成为CA了

仅此而已!你已经为用户创建了客户证书,捕获了这些证书写入文本文件,并最终将此证书映射到NT用户帐号上。你的用户现在访
问你的安全网络区域时可以不必使用传统的用户名和口令的机制了。你的用户将会因更简便的访问方式而高兴,而你也会更加安
心,因为你的安全网络区是真正安全的。