使用客户端证书调用 Web 服务.docx

上传人:牧羊曲112 文档编号:5010650 上传时间:2023-05-29 格式:DOCX 页数:11 大小:176.64KB
返回 下载 相关 举报
使用客户端证书调用 Web 服务.docx_第1页
第1页 / 共11页
使用客户端证书调用 Web 服务.docx_第2页
第2页 / 共11页
使用客户端证书调用 Web 服务.docx_第3页
第3页 / 共11页
使用客户端证书调用 Web 服务.docx_第4页
第4页 / 共11页
使用客户端证书调用 Web 服务.docx_第5页
第5页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《使用客户端证书调用 Web 服务.docx》由会员分享,可在线阅读,更多相关《使用客户端证书调用 Web 服务.docx(11页珍藏版)》请在三一办公上搜索。

1、构建安全的ASP.NET应用程 序身份验证、授权和安全通信有关构建安全的ASP.NET应用程序的起点和完整概述,请参见登陆页面。总结Web服务将客户端证书身份验证作为客户端应用程序身份验证的一种方式。本“如何做” 介绍如何为客户端证书身份验证配置Web服务,以及如何调用Web服务以传递来自 ASP.NET Web应用程序的证书。如何做:使用来自ASP.NET的客户端证书来调用Web 服务为了执行授权,Web服务经常需要能够对它们的调用方(其它应用程序)进行身份验证。客户端证书为Web服务提供了一种非常好的身份验证机制。如果您使用客户端证书,您的 应用程序也会得益于客户端应用程序和Web服务之间

2、的安全通道创建(使用安全套接字层 SSL)。这样您就可以安全地在Web服务之间传送保密信息。SSL确保消息的完整性和 机密性。本“如何做”介绍如何调用配置为要求客户端证书的Web服务。注意:本“如何做”中的信息还适用于ASP.NET和IIS托管的远程组件。为什么使用服务组件?本“如何做”中介绍的解决方案使用被配置为在企业服务服务器应用程序中运行的服务组件 (使用自定义的服务帐户)。ASP.NET Web应用程序调用该服务组件,而服务组件将调 用Web服务(传递客户端证书)。图1中显示了这一解决方案配置。Insert figure: How To - Calling A Web Service

3、with Certificates.gif图1ASP.NET调用服务组件以调用Web服务这种配置是为了确保系统在与Web服务通讯时能够访问用户配置文件。这是初始SSL握 手所必需的。注意:用于运行Web应用程序的ASPNET帐户具有“拒绝交互登录”权限,它禁止用 户使用此帐户进行交互登录。因此,该帐户没有用户配置文件。不要给ASPNET帐户(或任何用于运行Web应用程序的帐户)授予交互登录的权限。 在配置运行Web应用程序的帐户时始终要遵循最少权限原则,并且给它们授予尽可能少 的权限。有关的详细信息,请参见本指南“参考”部分中的“如何做:创建自定义帐户以 便运行ASP.NET ”。为什么需要用

4、户配置文件?在请求要求客户端证书的Web服务时,在客户端和服务器之间就会进行SSL握手。交换 的一些组件有服务器证书、客户端证书以及客户端生成的“预备主要机密”。以后可在协议 中使用此机密来生成“主要机密”。为使服务器确认证书提供者就是实际的私钥持有者,客户端必须使用私钥加密预备主要机 密,并将加密的预备主要机密发送到服务器。为使系统能够访问客户端的私钥以签名预备主 要机密,它必须访问客户端密钥存储中的私钥。密钥存储位于客户端的配置文件(必须加载) 中。需求以下各项介绍了推荐的硬件、软件、网络基础结构、技巧和知识以及您需要的服务包。 Microsoft Windows 2000 操作系统 Mi

5、crosoft Visual Studio .NET 开发系统 访问证书颁发机构(CA)以生成新的证书 一个已安装了服务器证书的Web服务器有关安装Web服务器证书的详细信息,请参见“如何做:在 Web服务器上设詈 SSL”。“如何做”中的过程还要求您具备Microsoft Visual C#开发工具的相关知识。总结“如何做”包括如下过程:1. 创建一个简单的Web服务2. 将Web服务虚拟目录配置为需要有客户端证书3. 创建一个自定义帐户以运行服务组件4. 为自定义帐户请求一个客户端证书5. 使用浏览器测试客户端证书6. 将客户端证书导出到一个文件中7. 开发用于调用该Web服务的服务组件8

6、. 配置和安装该服务组件9. 开发一个Web应用程序以调用该服务组件注意:在本“如何做”主题中,将Web服务计算机(它托管Web服务)命名为“WSServer”;而将Web服务客户端计算机(它托管客户端ASP.NET Web应用程 序和服务组件)命名为“WSClient”。1.创建一个简单的Web服务u在Web服务主机上创建一个简单的Web服务1. 启动 Visual Studio .NET,创建一个新的名为 SecureMath 的 C# ASP.NET Web 服务 应用程序。2. 将 service1.asmx 重命名为 math.asmx。3. 打开 math.asmx.cs,并将 S

7、ervicel 类重命名为 math。4. 将下面的Web方法添加到math类。WebMethodpublic long Add(long operandl, long operand2)return (operand1 + operand2);4. 在“构建”菜单上,单击“构建解决方案”以创建Web服务。2. 将Web服务虚拟目录配置为需要有客户端证书此过程使用Internet信息服务为SSL配置Web服务的虚拟目录并且要求使用证书。 本过程假设您在Web服务器上安装了有效的证书。有关安装Web服务器证书的详细信 息,请参见本指南“参考”部分中的“如何做:在 Web服务器上设詈SSL”。u将

8、Web服务虚拟目录配置为需要有客户端证书1. 在Web服务主机上启动Internet信息服务。2. 导航到SecureMath虚拟目录。3. 右击SecureMath,然后单击“属性”。4. 单击“目录安全性”选项卡。5. 单击“安全通信”下的“编辑”。如果无法使用“编辑”,则很可能是由于没有安装Web服务器证书。6. 选择“要求安全通道(SSL) ”复选框。7. 选择“要求客户端证书”选项。8. 单击“确定”,然后再单击“确定”。9. 在“继承覆盖”对话框中,单击“全选”,然后单击“确定”以关闭SecureMath属 性对话框。这会将新的安全设置应用于虚拟根目录下的所有子目录。3. 创建一个

9、自定义帐户以运行服务组件此过程在Web服务客户端计算机上创建一个新的用户帐户,可用来运行调用Web服务 的服务组件。u创建一个自定义帐户以运行服务组件1. 在客户端计算机上创建一个具有强密码的新用户帐户。清除“用户下次登录时须更改 密码”复选框,然后选择“密码永不过期”选项。2. 将该帐户添加到Administrators组中。用于加载用户配置文件的帐户必须是本地计算机的管理员。4. 为自定义帐户请求一个客户端证书在此过程中,您将使用新的自定义帐户登录到客户端计算机。然后提出证书请求。此过程假 定您使用的是Microsoft证书服务。如果您没有使用Microsoft证书服务来创建新的证书, 请

10、在使用自定义帐户登录的同时,向您的首选CA提出客户端证书请求并安装该证书。此过程还假定将Microsoft证书服务配置为针对证书请求自动颁发证书。还可以将它配置为 将请求置为未决状态(它要求管理员显式颁发证书)。u检查Microsoft证书服务设置1. 在Microsoft证书服务计算机上,在“管理工具”程序组中单击“证书颁发机构”。2. 展开“证书颁发机构(本地)”,右键单击该证书颁发机构,然后单击“属性”。3. 单击“策略模块”选项卡,然后单击“配置”。4. 检查默认操作。以下过程假定选定了 “始终颁发证书”。u为自定义帐户请求一个客户端证书1. 注销客户端计算机并使用自定义帐户重新登录。

11、这将强制为自定义帐户创建一个用户配置文件。2. 浏览到该CA以请求客户端证书。例如,如果CA位于CAServer计算机上,请浏 览到以下位置。http:/caserver/certsrv3. 单击“请求证书”,然后单击“下一步”。4. 确保选中了 “用户证书”,然后单击“下一步”。5. 单击“提交”。此时,将生成一个请求并将它发送到CA以进行处理。6. 在颁发了证书并收到来自CA服务器的响应后,单击“安装此证书”。7. 确保将颁发CA的证书作为可信根证书安装到本地计算机上。要确认这一情况,可执行以下步骤:a. 单击任务栏上的“开始”按钮,然后单击“运行”。b. 键入“mmc”,然后单击“确定”

12、。c. 在“文件”菜单上,单击“添加/删除管理单元”。d. 单击“添加”。e. 单击“证书”,然后单击“添加”。f. 单击“计算机帐户”,然后单击“下一步”。g. 单击“本地计算机:(运行本控制台的计算机)”,然后单击“完成”。h. 单击“关闭”,然后单击“确定”。i在MMC管理单元的左侧窗格中,展开“证书(本地计算机)”。j.展开“受信任的根证书颁发机构”,然后单击“证书”。k.确认您的CA的证书已列出。如果该CA的证书没有列出,请执行以下步骤:a. 浏览到U http:/caserver/certsrv。b. 单击“检索CA证书或证书吊销列表”,然后单击“下一步”。c. 单击“安装此CA证

13、书路径”。5. 使用浏览器测试客户端证书在此过程中,您将浏览到Web服务以确认服务器或客户端证书没有问题。u使用浏览器测试客户端证书1. 使用 Internet Explorer 并浏览到U https:/server/SecureMath/Math.asmx。确保您指定了“https”,因为已将站点配置为要求使用SSL。2. 此时应出现“客户身份验证”对话框。选择您的客户端证书,然后单击“确定”。3. 确认在您的浏览器中成功显示Web服务测试页。如果看到如图1所示的对话框,您需要将证书颁发机构的证书安装到“受信任的根 证书颁发机构”存储中(正如上一过程中所述)。Insert figure:

14、How To -Certificate Alert Dialog.gif图1“安全警报”对话框6. 将客户端证书导出到一个文件中此过程将客户端证书导出到文件中。随后,当服务组件需要将该证书传递到Web服务时, 它就会检索该证书。u将客户端证书导出到文件中1. 在Internet Explorer中,单击“工具”菜单上的“Internet选项”。2. 单击“内容”选项卡。3. 单击“证书”。4. 单击该客户端证书,然后单击“导出”。5. 单击“下一步”,跳过证书导出向导的初始对话框。6. 确认选中了 “不,不要导出私钥”,然后单击“下一步”。7. 确保选中了“DER编码二进制X.509 (.CE

15、R) ”,然后单击“下一步”。您必须使用此格式,因为.NET框架不支持Base-64或PKCS #7格式。8. 输入一个导出文件名称。请注意.cer导出文件的位置,因为在随后的过程中还会需 要此位置。9. 单击“下一步”,然后单击“完成”以导出证书。10. 关闭 Internet Explorer。11. 注销计算机并使用一般开发帐户重新登录。7. 开发用于调用该Web服务的服务组件此过程创建一个新的C#类库应用程序,并创建用于调用Web服务的服务组件。此过程 假定您当前在使用客户端计算机。u开发用于调用该Web服务的服务组件1.启动 Visual Studio.NET,并创建一个名为 Web

16、ServiceRequestor 的新 C# 类库 项目。3. 添加对SecureMath Web服务的Web弓I用。要点:在添加Web引用之前,必须暂时将Web服务的虚拟目录重新配置为不要求 客户端证书(但仍要求使用SSL)。在成功添加Web引用后,将虚拟目录配置改 回到要求客户端证书。实际上,如果站点要求客户端证书,则服务的发布者将WSDL作为单独的脱机文件 (服务的使用者可用它来创建代理)提供。在“添加Web引用”对话框中,确保在指定Web服务位置时指定“https”。如果 不这样做,就会出现错误,因为已将Web服务虚拟目录配置为要求使用SSL。4. 添加一个对System.Enterp

17、riseServices程序集的引用。5. 将 class1.cs 重命名为 ProfileManager.cs。6. 将以下类定义添加到ProfileManager.cs中(替换主干class1类)。ProfileManager 类使用 P/Invoke 调用 LoadUserProfile 和 UnloadUserProfile Win32 API。internal class ProfileManagerDllImport(Userenv.dll,SetLastError二true,CharSet二System.Runtime.InteropServices.CharSet.Auto)i

18、nternal static extern bool LoadUserProfile(IntPtr hToken,ref PROFILEINFO lpProfileInfo);DllImport(Userenv.dll,SetLastError二true,CharSet二System.Runtime.InteropServices.CharSet.Auto)internal static extern bool UnloadUserProfile(IntPtr hToken,IntPtr hProfile);StructLayout(LayoutKind.Sequential, CharSet

19、=CharSet.Ansi)public struct PROFILEINFO(public int dwSize;public int dwFlags;public String lpUserName;public String lpProfilePath;public String lpDefaultPath;public String lpServerName;public String lpPolicyPath;public IntPtr hProfile;7. 将第二个名为MathServiceComponent.cs的类文件添加到项目中。8. 将以下using语句添加到MathSe

20、rviceComponent.cs中现有using语句的下 面。using System.Net;using System.Web.Services;using System.Security.Principal;using System.EnterpriseServices;using System.Runtime.InteropServices;using System.Security.Cryptography.X509Certificates;using WebServiceRequestor.WebReference1;9.添加以下类定义(它提供公用CallMathWebServic

21、e 方法)。在后面的过程中,您 将从客户端ASP.NET Web应用程序中调用此方法。/ This class calls the web service that requires a certificate. public class MathServiceComponent : ServicedComponent DllImport(advapi32.dll, CharSet=CharSet.Auto, SetLastError=true) private extern static bool DuplicateToken(IntPtr ExistingTokenHandle, int

22、SECURITY_IMPERSONATION_LEVEL, ref IntPtr DuplicateTokenHandle);DllImport(kernel32.dll, CharSet=CharSet.Auto) private extern static bool CloseHandle(IntPtr handle);/ Calls the Web service that requires client certificates/ certFilepath points to the .cer file to use / url is the Web service url/ oper

23、and1 and operand2 are the parameters to pass to the Web service public long CallMathWebService(String certFilepath, String url, int operand1, int operand2) (bool retVal = false;/ Need to duplicate the token.LoadUserProfile needs a token with / TOKEN_IMPERSONATE and TOKEN_DUPLICATE.const int Security

24、Impersonation = 2;IntPtr dupeTokenHandle = DupeToken(WindowsIdentity.GetCurrent().Token, SecurityImpersonation);if(IntPtr.Zero = dupeTokenHandle) (throw new Exception(Unable to duplicate token.);/ Load the profile.ProfileManager.PROFILEINFO profile = new ProfileManager.PROFILEINFO(); profile.dwSize

25、= 32; profile.lpUserName = alexmlaptopCustomASPNET;retVal = ProfileManager.LoadUserProfile(dupeTokenHandle, ref profile); if(false = retVal)( throw new Exception(Error loading user profile. + Marshal.GetLastWin32Error();/ Instantiate the Web service proxy math mathservice = new math(); mathservice.U

26、rl = url;String certPath = certFilepath;mathservice.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certPath);long lngResult = 0;try( lngResult = mathservice.Add(operand1, operand2); catch (Exception ex)(if(ex is WebException)(WebException we = ex as WebException;WebResponse webResponse =

27、we.Response;throw new Exception(Exception calling method. + ex.Message); ProfileManager.UnloadUserProfile(WindowsIdentity.GetCurrent().Token, profile.hProfile);CloseHandle(dupeTokenHandle);return lngResult;private IntPtr DupeToken(IntPtr token, int Level)(IntPtr dupeTokenHandle = new IntPtr(0);bool

28、retVal = DuplicateToken(token, Level, ref dupeTokenHandle); if(false = retVal)(return IntPtr.Zero;return dupeTokenHandle; / end class10. 在“构建”菜单中,单击“构建解决方案”8. 配置和安装该服务组件此过程配置服务组件,生成强名称,在全局程序集高速缓存中安装它,并将它向COM+进 行注册。1.打开assemblyinfo.cs并在现有using语句之下添加下面的using语句。using System.EnterpriseServices;2.将以下程序集级

29、别属性添加到assemblyinfo.cs中,以便将服务组件配置为在 COM+服务器应用程序中运行。assembly: ApplicationActivation(ActivationOption.Server)3. 打开一个命令提示窗口并转到当前的项目目录中。4. 使用sn.exe实用程序,生成一个包含公钥和私钥对的密钥文件。sn.exe -k WebServiceRequestor.snk5. 返回到 Visual Studio .NET。6. 在assemblyinfo.cs中找到AssemblyKeyFile属性并对它进行修改,以便按如下 方式引用项目目录中的密钥文件。assembly

30、: AssemblyKeyFile(.WebServiceRequestor.snk)7. 在“构建”菜单中,单击“构建解决方案”8. 返回到命令提示窗口并运行以下命令以便将程序集添加到全局程序集高速缓存中。gacutil.exe /i bindebugwebservicerequestor.dll9. 运行以下命令以使用COM+注册程序集。regsvcs bindebugwebservicerequestor.dll10. 启动“组件服务”(位于“管理工具”程序组下面)。11. 展开“组件服务”、“计算机”和“我的电脑”节点。12. 展开“COM+应用程序”文件夹。13. 右键单击 WebS

31、erviceRequestor,然后单击“属性”。14. 单击“标识”选项卡。15. 选择“指定用户:”选项,并输入与先前创建的自定义帐户对应的帐户详细信息。这将COM+应用程序配置为使用自定义帐户运行。16. 单击“确定”,关闭“属性”对话框。17. 关闭“组件服务”。9. 开发一个Web应用程序以调用该服务组件此过程创建一个简单的ASP.NET Web应用程序,您将把它作为客户端应用程序来使用以 调用Web服务(通过服务组件)。u开发一个Web应用程序以调用该服务组件1. 在 Web服务客户端计算机上,创建一个新的名为SecureMathClient的C# ASP.NET Web应用程序。

32、2. 添加对 System.EnterpriseServices 的引用3. 添加对 WebServiceRequestor 服务组件的引用。浏览到位于 WebServiceRequestor项目文件夹下面的bindebug文件夹中的 WebServiceRequestor.dll。4.打开 WebForm1.aspx.cs并在现有using语句之下添加下面的using语句。using WebServiceRequestor;5在“设计器”模式下查看WebForml.aspx,并使用以下ID创建如图2所示的表 单: operandl operand2 result addInsert figu

33、re: How To - WebServiceClientForm.gif图2Web表单控件排列6双击“Add”以创建一个按钮单击事件处理程序。7.将下面的代码添加到事件处理程序。注意:将certPath字符串设置为在过程6 “将客户端证书导出到一个文件中”中导 出的证书文件的位置。将url字符串和HTTPS URL设置为您的Web服务。private void add_Click(object sender, System.EventArgs e)/ TODO: Replace with a valid path to your certificate string certPath = C

34、:CustomAccountCert.cer;/ TODO: Replace with a valid URL to your Web service string url = https:/wsserver/securemath/math.asmx;MathServiceComponent 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”。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号