《使用客户端证书调用Web服务.doc》由会员分享,可在线阅读,更多相关《使用客户端证书调用Web服务.doc(12页珍藏版)》请在三一办公上搜索。
1、构建安全的 ASP.NET 应用程序身份验证、授权和安全通信有关构建安全的 ASP.NET 应用程序 的起点和完整概述,请参见登陆页面。总结Web 服务将客户端证书身份验证作为客户端应用程序身份验证的一种方式。本“如何做”介绍如何为客户端证书身份验证配置 Web 服务,以及如何调用 Web 服务以传递来自 ASP.NET Web 应用程序的证书。如何做:使用来自 ASP.NET 的客户端证书来调用 Web 服务为了执行授权,Web 服务经常需要能够对它们的调用方(其它应用程序)进行身份验证。客户端证书为 Web 服务提供了一种非常好的身份验证机制。如果您使用客户端证书,您的应用程序也会得益于客
2、户端应用程序和 Web 服务之间的安全通道创建(使用安全套接字层 SSL)。这样您就可以安全地在 Web 服务之间传送保密信息。SSL 确保消息的完整性和机密性。本“如何做”介绍如何调用配置为要求客户端证书的 Web 服务。注意:本“如何做”中的信息还适用于 ASP.NET 和 IIS 托管的远程组件。为什么使用服务组件?本“如何做”中介绍的解决方案使用被配置为在企业服务服务器应用程序中运行的服务组件(使用自定义的服务帐户)。ASP.NET Web 应用程序调用该服务组件,而服务组件将调用 Web 服务(传递客户端证书)。图 1 中显示了这一解决方案配置。Insert figure: How
3、To - Calling A Web Service with Certificates.gif图 1ASP.NET 调用服务组件以调用 Web 服务这种配置是为了确保系统在与 Web 服务通讯时能够访问用户配置文件。这是初始 SSL 握手所必需的。 注意:用于运行 Web 应用程序的 ASPNET 帐户具有“拒绝交互登录”权限,它禁止用户使用此帐户进行交互登录。因此,该帐户没有用户配置文件。 不要给 ASPNET 帐户(或任何用于运行 Web 应用程序的帐户)授予交互登录的权限。在配置运行 Web 应用程序的帐户时始终要遵循最少权限原则,并且给它们授予尽可能少的权限。有关的详细信息,请参见本
4、指南“参考”部分中的“如何做:创建自定义帐户以便运行 ASP.NET”。为什么需要用户配置文件?在请求要求客户端证书的 Web 服务时,在客户端和服务器之间就会进行 SSL 握手。交换的一些组件有服务器证书、客户端证书以及客户端生成的“预备主要机密”。以后可在协议中使用此机密来生成“主要机密”。 为使服务器确认证书提供者就是实际的私钥持有者,客户端必须使用私钥加密预备主要机密,并将加密的预备主要机密发送到服务器。为使系统能够访问客户端的私钥以签名预备主要机密,它必须访问客户端密钥存储中的私钥。密钥存储位于客户端的配置文件(必须加载)中。需求以下各项介绍了推荐的硬件、软件、网络基础结构、技巧和知
5、识以及您需要的服务包。Microsoft Windows 2000 操作系统Microsoft Visual Studio .NET 开发系统访问证书颁发机构 (CA) 以生成新的证书一个已安装了服务器证书的 Web 服务器有关安装 Web 服务器证书的详细信息,请参见“如何做:在 Web 服务器上设置 SSL”。 “如何做”中的过程还要求您具备 Microsoft Visual C# 开发工具的相关知识。总结“如何做”包括如下过程:1.创建一个简单的 Web 服务2.将 Web 服务虚拟目录配置为需要有客户端证书3.创建一个自定义帐户以运行服务组件4.为自定义帐户请求一个客户端证书5.使用浏
6、览器测试客户端证书6.将客户端证书导出到一个文件中7.开发用于调用该 Web 服务的服务组件8.配置和安装该服务组件9.开发一个 Web 应用程序以调用该服务组件 注意:在本“如何做”主题中,将 Web 服务计算机(它托管 Web 服务)命名为“WSServer”;而将 Web 服务客户端计算机(它托管客户端 ASP.NET Web 应用程序和服务组件)命名为“WSClient”。1. 创建一个简单的 Web 服务u在 Web 服务主机上创建一个简单的 Web 服务1.启动 Visual Studio .NET,创建一个新的名为 SecureMath 的 C# ASP.NET Web 服务应用
7、程序。2.将 service1.asmx 重命名为 math.asmx。3.打开 math.asmx.cs,并将 Service1 类重命名为 math。4.将下面的 Web 方法添加到 math 类。WebMethodpublic long Add(long operand1, long operand2)return (operand1 + operand2);4.在“构建”菜单上,单击“构建解决方案”以创建 Web 服务。 2. 将 Web 服务虚拟目录配置为需要有客户端证书此过程使用 Internet 信息服务为 SSL 配置 Web 服务的虚拟目录并且要求使用证书。本过程假设您在 W
8、eb 服务器上安装了有效的证书。有关安装 Web 服务器证书的详细信息,请参见本指南“参考”部分中的“如何做:在 Web 服务器上设置 SSL”。u将 Web 服务虚拟目录配置为需要有客户端证书1.在 Web 服务主机上启动 Internet 信息服务。2.导航到 SecureMath 虚拟目录。3.右击 SecureMath,然后单击“属性”。4.单击“目录安全性”选项卡。5.单击“安全通信”下的“编辑”。如果无法使用“编辑”,则很可能是由于没有安装 Web 服务器证书。6.选择“要求安全通道 (SSL)”复选框。7.选择“要求客户端证书”选项。8.单击“确定”,然后再单击“确定”。9.在“
9、继承覆盖”对话框中,单击“全选”,然后单击“确定”以关闭 SecureMath 属性对话框。这会将新的安全设置应用于虚拟根目录下的所有子目录。 3. 创建一个自定义帐户以运行服务组件此过程在 Web 服务客户端计算机上创建一个新的用户帐户,可用来运行调用 Web 服务的服务组件。 u创建一个自定义帐户以运行服务组件1.在客户端计算机上创建一个具有强密码的新用户帐户。清除“用户下次登录时须更改密码”复选框,然后选择“密码永不过期”选项。2.将该帐户添加到 Administrators 组中。用于加载用户配置文件的帐户必须是本地计算机的管理员。 4. 为自定义帐户请求一个客户端证书在此过程中,您将
10、使用新的自定义帐户登录到客户端计算机。然后提出证书请求。此过程假定您使用的是 Microsoft 证书服务。如果您没有使用 Microsoft 证书服务来创建新的证书,请在使用自定义帐户登录的同时,向您的首选 CA 提出客户端证书请求并安装该证书。此过程还假定将 Microsoft 证书服务配置为针对证书请求自动颁发证书。还可以将它配置为将请求置为未决状态(它要求管理员显式颁发证书)。 u检查 Microsoft 证书服务设置1.在 Microsoft 证书服务计算机上,在“管理工具”程序组中单击“证书颁发机构”。2.展开“证书颁发机构(本地)”,右键单击该证书颁发机构,然后单击“属性”。3.
11、单击“策略模块”选项卡,然后单击“配置”。4.检查默认操作。 以下过程假定选定了“始终颁发证书”。 u为自定义帐户请求一个客户端证书1.注销客户端计算机并使用自定义帐户重新登录。这将强制为自定义帐户创建一个用户配置文件。2.浏览到该 CA 以请求客户端证书。例如,如果 CA 位于 CAServer 计算机上,请浏览到以下位置。http:/caserver/certsrv3.单击“请求证书”,然后单击“下一步”。4.确保选中了“用户证书”,然后单击“下一步”。5.单击“提交”。 此时,将生成一个请求并将它发送到 CA 以进行处理。6.在颁发了证书并收到来自 CA 服务器的响应后,单击“安装此证书
12、”。7.确保将颁发 CA 的证书作为可信根证书安装到本地计算机上。 要确认这一情况,可执行以下步骤:a.单击任务栏上的“开始”按钮,然后单击“运行”。b.键入“mmc”,然后单击“确定”。c.在“文件”菜单上,单击“添加/删除管理单元”。d.单击“添加”。e.单击“证书”,然后单击“添加”。f.单击“计算机帐户”,然后单击“下一步”。g.单击“本地计算机:(运行本控制台的计算机)”,然后单击“完成”。h.单击“关闭”,然后单击“确定”。i在 MMC 管理单元的左侧窗格中,展开“证书(本地计算机)”。j.展开“受信任的根证书颁发机构”,然后单击“证书”。k.确认您的 CA 的证书已列出。 如果该
13、 CA 的证书没有列出,请执行以下步骤:a.浏览到 http:/caserver/certsrv。b.单击“检索CA证书或证书吊销列表”,然后单击“下一步”。c.单击“安装此 CA 证书路径”。 5. 使用浏览器测试客户端证书在此过程中,您将浏览到 Web 服务以确认服务器或客户端证书没有问题。u使用浏览器测试客户端证书1.使用 Internet Explorer 并浏览到 https:/server/SecureMath/Math.asmx。确保您指定了“https”,因为已将站点配置为要求使用 SSL。2.此时应出现“客户身份验证”对话框。选择您的客户端证书,然后单击“确定”。3.确认在您
14、的浏览器中成功显示 Web 服务测试页。 如果看到如图 1 所示的对话框,您需要将证书颁发机构的证书安装到“受信任的根证书颁发机构”存储中(正如上一过程中所述)。.Insert figure: How To Certificate Alert Dialog.gif图 1“安全警报”对话框 6. 将客户端证书导出到一个文件中此过程将客户端证书导出到文件中。随后,当服务组件需要将该证书传递到 Web 服务时,它就会检索该证书。u将客户端证书导出到文件中1.在 Internet Explorer 中,单击“工具”菜单上的“Internet 选项”。2.单击“内容”选项卡。3.单击“证书”。4.单击该
15、客户端证书,然后单击“导出”。5.单击“下一步”,跳过证书导出向导的初始对话框。6.确认选中了“不,不要导出私钥”,然后单击“下一步”。7.确保选中了“DER 编码二进制 X.509 (.CER)”,然后单击“下一步”。您必须使用此格式,因为 .NET 框架不支持 Base-64 或 PKCS #7 格式。8.输入一个导出文件名称。请注意 .cer 导出文件的位置,因为在随后的过程中还会需要此位置。 9.单击“下一步”,然后单击“完成”以导出证书。10.关闭 Internet Explorer。11.注销计算机并使用一般开发帐户重新登录。 7. 开发用于调用该 Web 服务的服务组件此过程创建
16、一个新的 C# 类库应用程序,并创建用于调用 Web 服务的服务组件。此过程假定您当前在使用客户端计算机。u开发用于调用该 Web 服务的服务组件1.启动 Visual Studio.NET,并创建一个名为 WebServiceRequestor 的新 C# 类库项目。3.添加对 SecureMath Web 服务的 Web 引用。要点:在添加 Web 引用之前,必须暂时将 Web 服务的虚拟目录重新配置为不要求客户端证书(但仍要求使用 SSL)。在成功添加 Web 引用后,将虚拟目录配置改回到要求客户端证书。实际上,如果站点要求客户端证书,则服务的发布者将 WSDL 作为单独的脱机文件(服务
17、的使用者可用它来创建代理)提供。在“添加 Web 引用”对话框中,确保在指定 Web 服务位置时指定“https”。如果不这样做,就会出现错误,因为已将 Web 服务虚拟目录配置为要求使用 SSL。 4.添加一个对 System.EnterpriseServices 程序集的引用。5.将 class1.cs 重命名为 ProfileManager.cs。6.将以下类定义添加到 ProfileManager.cs 中(替换主干 class1 类)。ProfileManager 类使用 P/Invoke 调用 LoadUserProfile 和 UnloadUserProfile Win32 AP
18、I。internal class ProfileManagerDllImport(Userenv.dll, SetLastError=true, CharSet=System.Runtime.InteropServices.CharSet.Auto)internal static extern bool LoadUserProfile(IntPtr hToken, ref PROFILEINFO lpProfileInfo);DllImport(Userenv.dll, SetLastError=true, CharSet=System.Runtime.InteropServices.Char
19、Set.Auto)internal static extern bool UnloadUserProfile(IntPtr hToken, IntPtr hProfile);StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)public struct PROFILEINFO public int dwSize; public int dwFlags; public String lpUserName; public String lpProfilePath; public String lpDefaultPath; public
20、String lpServerName; public String lpPolicyPath; public IntPtr hProfile; 7.将第二个名为 MathServiceComponent.cs 的类文件添加到项目中。8.将以下 using 语句添加到 MathServiceComponent.cs 中现有 using 语句的下面。using System.Net;using System.Web.Services;using System.Security.Principal;using System.EnterpriseServices;using System.Runti
21、me.InteropServices;using System.Security.Cryptography.X509Certificates;using WebServiceRequestor.WebReference1;9.添加以下类定义(它提供公用 CallMathWebService 方法)。在后面的过程中,您将从客户端 ASP.NET Web 应用程序中调用此方法。/ This class calls the web service that requires a certificate.public class MathServiceComponent : ServicedCompo
22、nentDllImport(advapi32.dll, CharSet=CharSet.Auto, SetLastError=true)private extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int SECURITY_IMPERSONATION_LEVEL,ref IntPtr DuplicateTokenHandle);DllImport(kernel32.dll, CharSet=CharSet.Auto)private extern static bool CloseHandle(IntPtr handl
23、e);/ Calls the Web service that requires client certificates/ certFilepath points to the .cer file to use/ url is the Web service url/ operand1 and operand2 are the parameters to pass to the Web servicepublic long CallMathWebService(String certFilepath, String url, int operand1, int operand2) bool r
24、etVal = false;/ Need to duplicate the token.LoadUserProfile needs a token with / TOKEN_IMPERSONATE and TOKEN_DUPLICATE.const int SecurityImpersonation = 2;IntPtr dupeTokenHandle = DupeToken(WindowsIdentity.GetCurrent().Token,SecurityImpersonation);if(IntPtr.Zero = dupeTokenHandle) throw new Exceptio
25、n(Unable to duplicate token.); / Load the profile.ProfileManager.PROFILEINFO profile = new ProfileManager.PROFILEINFO();profile.dwSize = 32;profile.lpUserName = alexmlaptopCustomASPNET;retVal = ProfileManager.LoadUserProfile(dupeTokenHandle, ref profile);if(false = retVal) throw new Exception(Error
26、loading user profile. + Marshal.GetLastWin32Error(); / Instantiate the Web service proxymath mathservice = new math();mathservice.Url = url;String certPath = certFilepath;mathservice.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath);long lngResult = 0;try lngResult = mathservice.Ad
27、d(operand1, operand2); catch (Exception ex) if(ex is WebException) WebException we = ex as WebException;WebResponse webResponse = we.Response;throw new Exception(Exception calling method. + ex.Message); ProfileManager.UnloadUserProfile(WindowsIdentity.GetCurrent().Token, profile.hProfile);CloseHandl
28、e(dupeTokenHandle);return lngResult; private IntPtr DupeToken(IntPtr token, int Level) IntPtr dupeTokenHandle = new IntPtr(0);bool retVal = DuplicateToken(token, Level, ref dupeTokenHandle);if(false = retVal) return IntPtr.Zero; return dupeTokenHandle; / end class10.在“构建”菜单中,单击“构建解决方案” 8. 配置和安装该服务组件
29、此过程配置服务组件,生成强名称,在全局程序集高速缓存中安装它,并将它向 COM+ 进行注册。1.打开 assemblyinfo.cs 并在现有 using 语句之下添加下面的 using 语句。using System.EnterpriseServices;2.将以下程序集级别属性添加到 assemblyinfo.cs 中,以便将服务组件配置为在 COM+ 服务器应用程序中运行。assembly: ApplicationActivation(ActivationOption.Server)3.打开一个命令提示窗口并转到当前的项目目录中。4.使用 sn.exe 实用程序,生成一个包含公钥和私钥对
30、的密钥文件。sn.exe -k WebServiceRequestor.snk5.返回到 Visual Studio .NET。6.在 assemblyinfo.cs 中找到 AssemblyKeyFile 属性并对它进行修改,以便按如下方式引用项目目录中的密钥文件。assembly: AssemblyKeyFile(.WebServiceRequestor.snk)7.在“构建”菜单中,单击“构建解决方案”8.返回到命令提示窗口并运行以下命令以便将程序集添加到全局程序集高速缓存中。gacutil.exe /i bindebugwebservicerequestor.dll9.运行以下命令以使
31、用 COM+ 注册程序集。regsvcs bindebugwebservicerequestor.dll10.启动“组件服务”(位于“管理工具”程序组下面)。11.展开“组件服务”、“计算机”和“我的电脑”节点。12.展开“COM+ 应用程序”文件夹。13.右键单击 WebServiceRequestor,然后单击“属性”。14.单击“标识”选项卡。15.选择“指定用户:”选项,并输入与先前创建的自定义帐户对应的帐户详细信息。这将 COM+ 应用程序配置为使用自定义帐户运行。16.单击“确定”,关闭“属性”对话框。17.关闭“组件服务”。 9. 开发一个 Web 应用程序以调用该服务组件此过程
32、创建一个简单的 ASP.NET Web 应用程序,您将把它作为客户端应用程序来使用以调用 Web 服务(通过服务组件)。u开发一个 Web 应用程序以调用该服务组件1.在 Web 服务客户端计算机上,创建一个新的名为 SecureMathClient 的 C# ASP.NET Web 应用程序。2.添加对 System.EnterpriseServices 的引用3.添加对 WebServiceRequestor 服务组件的引用。 浏览到位于 WebServiceRequestor 项目文件夹下面的 bindebug 文件夹中的 WebServiceRequestor.dll。4.打开 Web
33、Form1.aspx.cs 并在现有 using 语句之下添加下面的 using 语句。using WebServiceRequestor;5在“设计器”模式下查看 WebForm1.aspx,并使用以下 ID 创建如图 2 所示的表单:operand1operand2resultadd Insert figure: How To - WebServiceClientForm.gif图 2Web 表单控件排列6双击“Add”以创建一个按钮单击事件处理程序。7.将下面的代码添加到事件处理程序。注意:将 certPath 字符串设置为在过程 6“将客户端证书导出到一个文件中”中导出的证书文件的位置
34、。将 url 字符串和 HTTPS URL 设置为您的 Web 服务。private void add_Click(object sender, System.EventArgs e)/ TODO: Replace with a valid path to your certificatestring certPath = C:CustomAccountCert.cer;/ TODO: Replace with a valid URL to your Web servicestring url = https:/wsserver/securemath/math.asmx;MathService
35、Component mathComp = new MathServiceComponent(); long addResult = mathComp.CallMathWebService( certPath, url, Int32.Parse(operand1.Text), Int32.Parse(operand2.Text);result.Text = addResult.ToString();8.在“构建”菜单中,单击“构建解决方案”9.运行该应用程序。输入两个要相加的数,然后单击 Add。Web 应用程序将调用服务组件,该服务组件将调用使用 SSL 并传递客户端证书的 Web 服务。 其他资源有关详细信息,请参见本指南的“参考”部分的“如何做:在 Web 服务器上设置 SSL”。 12