使用客户端证书调用Web服务.docx
- 文档编号:16760491
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:18
- 大小:80.69KB
使用客户端证书调用Web服务.docx
《使用客户端证书调用Web服务.docx》由会员分享,可在线阅读,更多相关《使用客户端证书调用Web服务.docx(18页珍藏版)》请在冰点文库上搜索。
使用客户端证书调用Web服务
构建安全的ASP.NET应用程序
身份验证、授权和安全通信
有关构建安全的ASP.NET应用程序的起点和完整概述,请参见登陆页面。
总结
Web服务将客户端证书身份验证作为客户端应用程序身份验证的一种方式。
本“如何做”介绍如何为客户端证书身份验证配置Web服务,以及如何调用Web服务以传递来自ASP.NETWeb应用程序的证书。
如何做:
使用来自ASP.NET的客户端证书来调用Web服务
为了执行授权,Web服务经常需要能够对它们的调用方(其它应用程序)进行身份验证。
客户端证书为Web服务提供了一种非常好的身份验证机制。
如果您使用客户端证书,您的应用程序也会得益于客户端应用程序和Web服务之间的安全通道创建(使用安全套接字层[SSL])。
这样您就可以安全地在Web服务之间传送保密信息。
SSL确保消息的完整性和机密性。
本“如何做”介绍如何调用配置为要求客户端证书的Web服务。
注意:
本“如何做”中的信息还适用于ASP.NET和IIS托管的远程组件。
为什么使用服务组件?
本“如何做”中介绍的解决方案使用被配置为在企业服务服务器应用程序中运行的服务组件(使用自定义的服务帐户)。
ASP.NETWeb应用程序调用该服务组件,而服务组件将调用Web服务(传递客户端证书)。
图1中显示了这一解决方案配置。
{Insertfigure:
HowTo-CallingAWebServicewithCertificates.gif}
图1
ASP.NET调用服务组件以调用Web服务
这种配置是为了确保系统在与Web服务通讯时能够访问用户配置文件。
这是初始SSL握手所必需的。
注意:
用于运行Web应用程序的ASPNET帐户具有“拒绝交互登录”权限,它禁止用户使用此帐户进行交互登录。
因此,该帐户没有用户配置文件。
不要给ASPNET帐户(或任何用于运行Web应用程序的帐户)授予交互登录的权限。
在配置运行Web应用程序的帐户时始终要遵循最少权限原则,并且给它们授予尽可能少的权限。
有关的详细信息,请参见本指南“参考”部分中的“如何做:
创建自定义帐户以便运行ASP.NET”。
为什么需要用户配置文件?
在请求要求客户端证书的Web服务时,在客户端和服务器之间就会进行SSL握手。
交换的一些组件有服务器证书、客户端证书以及客户端生成的“预备主要机密”。
以后可在协议中使用此机密来生成“主要机密”。
为使服务器确认证书提供者就是实际的私钥持有者,客户端必须使用私钥加密预备主要机密,并将加密的预备主要机密发送到服务器。
为使系统能够访问客户端的私钥以签名预备主要机密,它必须访问客户端密钥存储中的私钥。
密钥存储位于客户端的配置文件(必须加载)中。
需求
以下各项介绍了推荐的硬件、软件、网络基础结构、技巧和知识以及您需要的服务包。
●Microsoft®Windows®2000操作系统
●MicrosoftVisualStudio®.NET开发系统
●访问证书颁发机构(CA)以生成新的证书
●一个已安装了服务器证书的Web服务器
有关安装Web服务器证书的详细信息,请参见“如何做:
在Web服务器上设置SSL”。
“如何做”中的过程还要求您具备MicrosoftVisualC#™开发工具的相关知识。
总结
“如何做”包括如下过程:
1.创建一个简单的Web服务
2.将Web服务虚拟目录配置为需要有客户端证书
3.创建一个自定义帐户以运行服务组件
4.为自定义帐户请求一个客户端证书
5.使用浏览器测试客户端证书
6.将客户端证书导出到一个文件中
7.开发用于调用该Web服务的服务组件
8.配置和安装该服务组件
9.开发一个Web应用程序以调用该服务组件
注意:
在本“如何做”主题中,将Web服务计算机(它托管Web服务)命名为“WSServer”;而将Web服务客户端计算机(它托管客户端ASP.NETWeb应用程序和服务组件)命名为“WSClient”。
1.创建一个简单的Web服务
u在Web服务主机上创建一个简单的Web服务
1.启动VisualStudio.NET,创建一个新的名为SecureMath的C#ASP.NETWeb服务应用程序。
2.将service1.asmx重命名为math.asmx。
3.打开math.asmx.cs,并将Service1类重命名为math。
4.将下面的Web方法添加到math类。
[WebMethod]
publiclongAdd(longoperand1,longoperand2)
{
return(operand1+operand2);
}
4.在“构建”菜单上,单击“构建解决方案”以创建Web服务。
2.将Web服务虚拟目录配置为需要有客户端证书
此过程使用Internet信息服务为SSL配置Web服务的虚拟目录并且要求使用证书。
本过程假设您在Web服务器上安装了有效的证书。
有关安装Web服务器证书的详细信息,请参见本指南“参考”部分中的“如何做:
在Web服务器上设置SSL”。
u将Web服务虚拟目录配置为需要有客户端证书
1.在Web服务主机上启动Internet信息服务。
2.导航到SecureMath虚拟目录。
3.右击SecureMath,然后单击“属性”。
4.单击“目录安全性”选项卡。
5.单击“安全通信”下的“编辑”。
如果无法使用“编辑”,则很可能是由于没有安装Web服务器证书。
6.选择“要求安全通道(SSL)”复选框。
7.选择“要求客户端证书”选项。
8.单击“确定”,然后再单击“确定”。
9.在“继承覆盖”对话框中,单击“全选”,然后单击“确定”以关闭SecureMath属性对话框。
这会将新的安全设置应用于虚拟根目录下的所有子目录。
3.创建一个自定义帐户以运行服务组件
此过程在Web服务客户端计算机上创建一个新的用户帐户,可用来运行调用Web服务的服务组件。
u创建一个自定义帐户以运行服务组件
1.在客户端计算机上创建一个具有强密码的新用户帐户。
清除“用户下次登录时须更改密码”复选框,然后选择“密码永不过期”选项。
2.将该帐户添加到Administrators组中。
用于加载用户配置文件的帐户必须是本地计算机的管理员。
4.为自定义帐户请求一个客户端证书
在此过程中,您将使用新的自定义帐户登录到客户端计算机。
然后提出证书请求。
此过程假定您使用的是Microsoft证书服务。
如果您没有使用Microsoft证书服务来创建新的证书,请在使用自定义帐户登录的同时,向您的首选CA提出客户端证书请求并安装该证书。
此过程还假定将Microsoft证书服务配置为针对证书请求自动颁发证书。
还可以将它配置为将请求置为未决状态(它要求管理员显式颁发证书)。
u检查Microsoft证书服务设置
1.在Microsoft证书服务计算机上,在“管理工具”程序组中单击“证书颁发机构”。
2.展开“证书颁发机构(本地)”,右键单击该证书颁发机构,然后单击“属性”。
3.单击“策略模块”选项卡,然后单击“配置”。
4.检查默认操作。
以下过程假定选定了“始终颁发证书”。
u为自定义帐户请求一个客户端证书
1.注销客户端计算机并使用自定义帐户重新登录。
这将强制为自定义帐户创建一个用户配置文件。
2.浏览到该CA以请求客户端证书。
例如,如果CA位于CAServer计算机上,请浏览到以下位置。
http:
//caserver/certsrv
3.单击“请求证书”,然后单击“下一步”。
4.确保选中了“用户证书”,然后单击“下一步”。
5.单击“提交”。
此时,将生成一个请求并将它发送到CA以进行处理。
6.在颁发了证书并收到来自CA服务器的响应后,单击“安装此证书”。
7.确保将颁发CA的证书作为可信根证书安装到本地计算机上。
要确认这一情况,可执行以下步骤:
a.单击任务栏上的“开始”按钮,然后单击“运行”。
b.键入“mmc”,然后单击“确定”。
c.在“文件”菜单上,单击“添加/删除管理单元”。
d.单击“添加”。
e.单击“证书”,然后单击“添加”。
f.单击“计算机帐户”,然后单击“下一步”。
g.单击“本地计算机:
(运行本控制台的计算机)”,然后单击“完成”。
h.单击“关闭”,然后单击“确定”。
i在MMC管理单元的左侧窗格中,展开“证书(本地计算机)”。
j.展开“受信任的根证书颁发机构”,然后单击“证书”。
k.确认您的CA的证书已列出。
如果该CA的证书没有列出,请执行以下步骤:
a.浏览到http:
//caserver/certsrv。
b.单击“检索CA证书或证书吊销列表”,然后单击“下一步”。
c.单击“安装此CA证书路径”。
5.使用浏览器测试客户端证书
在此过程中,您将浏览到Web服务以确认服务器或客户端证书没有问题。
u使用浏览器测试客户端证书
1.使用InternetExplorer并浏览到https:
//server/SecureMath/Math.asmx。
确保您指定了“https”,因为已将站点配置为要求使用SSL。
2.此时应出现“客户身份验证”对话框。
选择您的客户端证书,然后单击“确定”。
3.确认在您的浏览器中成功显示Web服务测试页。
如果看到如图1所示的对话框,您需要将证书颁发机构的证书安装到“受信任的根证书颁发机构”存储中(正如上一过程中所述)。
.
{Insertfigure:
HowTo–CertificateAlertDialog.gif}
图1
“安全警报”对话框
6.将客户端证书导出到一个文件中
此过程将客户端证书导出到文件中。
随后,当服务组件需要将该证书传递到Web服务时,它就会检索该证书。
u将客户端证书导出到文件中
1.在InternetExplorer中,单击“工具”菜单上的“Internet选项”。
2.单击“内容”选项卡。
3.单击“证书”。
4.单击该客户端证书,然后单击“导出”。
5.单击“下一步”,跳过证书导出向导的初始对话框。
6.确认选中了“不,不要导出私钥”,然后单击“下一步”。
7.确保选中了“DER编码二进制X.509(.CER)”,然后单击“下一步”。
您必须使用此格式,因为.NET框架不支持Base-64或PKCS#7格式。
8.输入一个导出文件名称。
请注意.cer导出文件的位置,因为在随后的过程中还会需要此位置。
9.单击“下一步”,然后单击“完成”以导出证书。
10.关闭InternetExplorer。
11.注销计算机并使用一般开发帐户重新登录。
7.开发用于调用该Web服务的服务组件
此过程创建一个新的C#类库应用程序,并创建用于调用Web服务的服务组件。
此过程假定您当前在使用客户端计算机。
u开发用于调用该Web服务的服务组件
1.启动VisualStudio.NET,并创建一个名为WebServiceRequestor的新C#类库项目。
3.添加对SecureMathWeb服务的Web引用。
要点:
在添加Web引用之前,必须暂时将Web服务的虚拟目录重新配置为不要求客户端证书(但仍要求使用SSL)。
在成功添加Web引用后,将虚拟目录配置改回到要求客户端证书。
实际上,如果站点要求客户端证书,则服务的发布者将WSDL作为单独的脱机文件(服务的使用者可用它来创建代理)提供。
在“添加Web引用”对话框中,确保在指定Web服务位置时指定“https”。
如果不这样做,就会出现错误,因为已将Web服务虚拟目录配置为要求使用SSL。
4.添加一个对System.EnterpriseServices程序集的引用。
5.将class1.cs重命名为ProfileManager.cs。
6.将以下类定义添加到ProfileManager.cs中(替换主干class1类)。
ProfileManager类使用P/Invoke调用LoadUserProfile和UnloadUserProfileWin32API。
internalclassProfileManager
{
[DllImport("Userenv.dll",SetLastError=true,
CharSet=System.Runtime.InteropServices.CharSet.Auto)]
internalstaticexternboolLoadUserProfile(IntPtrhToken,
refPROFILEINFOlpProfileInfo);
[DllImport("Userenv.dll",SetLastError=true,
CharSet=System.Runtime.InteropServices.CharSet.Auto)]
internalstaticexternboolUnloadUserProfile(IntPtrhToken,
IntPtrhProfile);
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
publicstructPROFILEINFO
{
publicintdwSize;
publicintdwFlags;
publicStringlpUserName;
publicStringlpProfilePath;
publicStringlpDefaultPath;
publicStringlpServerName;
publicStringlpPolicyPath;
publicIntPtrhProfile;
}
}
7.将第二个名为MathServiceComponent.cs的类文件添加到项目中。
8.将以下using语句添加到MathServiceComponent.cs中现有using语句的下面。
usingSystem.Net;
usingSystem.Web.Services;
usingSystem.Security.Principal;
usingSystem.EnterpriseServices;
usingSystem.Runtime.InteropServices;
usingSystem.Security.Cryptography.X509Certificates;
usingWebServiceRequestor.WebReference1;
9.添加以下类定义(它提供公用CallMathWebService方法)。
在后面的过程中,您将从客户端ASP.NETWeb应用程序中调用此方法。
//Thisclasscallsthewebservicethatrequiresacertificate.
publicclassMathServiceComponent:
ServicedComponent
{
[DllImport("advapi32.dll",CharSet=CharSet.Auto,SetLastError=true)]
privateexternstaticboolDuplicateToken(IntPtrExistingTokenHandle,
intSECURITY_IMPERSONATION_LEVEL,
refIntPtrDuplicateTokenHandle);
[DllImport("kernel32.dll",CharSet=CharSet.Auto)]
privateexternstaticboolCloseHandle(IntPtrhandle);
//CallstheWebservicethatrequiresclientcertificates
//certFilepathpointstothe.cerfiletouse
//urlistheWebserviceurl
//operand1andoperand2aretheparameterstopasstotheWebservice
publiclongCallMathWebService(StringcertFilepath,
Stringurl,intoperand1,intoperand2)
{
boolretVal=false;
//Needtoduplicatethetoken.LoadUserProfileneedsatokenwith
//TOKEN_IMPERSONATEandTOKEN_DUPLICATE.
constintSecurityImpersonation=2;
IntPtrdupeTokenHandle=DupeToken(WindowsIdentity.GetCurrent().Token,
SecurityImpersonation);
if(IntPtr.Zero==dupeTokenHandle)
{
thrownewException("Unabletoduplicatetoken.");
}
//Loadtheprofile.
ProfileManager.PROFILEINFOprofile=newProfileManager.PROFILEINFO();
profile.dwSize=32;
profile.lpUserName=@"alexmlaptop\CustomASPNET";
retVal=ProfileManager.LoadUserProfile(dupeTokenHandle,refprofile);
if(false==retVal)
{
thrownewException("Errorloadinguserprofile."+
Marshal.GetLastWin32Error());
}
//InstantiatetheWebserviceproxy
mathmathservice=newmath();
mathservice.Url=url;
StringcertPath=certFilepath;
mathservice.ClientCertificates.Add(
X509Certificate.CreateFromCertFile(certPath));
longlngResult=0;
try
{
lngResult=mathservice.Add(operand1,operand2);
}
catch(Exceptionex)
{
if(exisWebException)
{
WebExceptionwe=exasWebException;
WebResponsewebResponse=we.Response;
thrownewException("Exceptioncallingmethod."+ex.Message);
}
}
ProfileManager.UnloadUserProfile(WindowsIdentity.GetCurrent().Token,
profile.hProfile);
CloseHandle(dupeTokenHandle);
returnlngResult;
}
privateIntPtrDupeToken(IntPtrtoken,intLevel)
{
IntPtrdupeTokenHandle=newIntPtr(0);
boolretVal=DuplicateToken(token,Level,refdupeTokenHandle);
if(false==retVal)
{
returnIntPtr.Zero;
}
returndupeTokenHandle;
}
}//endclass
10.在“构建”菜单中,单击“构建解决方案”
8.配置和安装该服务组件
此过程配置服务组件,生成强名称,在全局程序集高速缓存中安装它,并将它向COM+进行注册。
1.打开assemblyinfo.cs并在现有using语句之下添加下面的using语句。
usingSystem.EnterpriseServices;
2.将以下程序集级别属性添加到assemblyinfo.cs中,以便将服务组件配置为在COM+服务器应用程序中运行。
[assembly:
ApplicationActivation(ActivationOption.Server)]
3.打开一个命令提示窗口并转到当前的项目目录中。
4.使用sn.exe实用程序,生成一个包含公钥和私钥对的密钥文件。
sn.exe-kWebServiceRequestor.snk
5.返回到VisualStudio.NET。
6.在assemblyinfo.cs中找到[AssemblyKeyFile]属性并对它进行修改,以便按如下方式引用项目目录中的密钥文件。
[assembly:
AssemblyKeyFile(@"..\..\WebServiceRequestor.snk")]
7.在“构建”菜单中,单击“构建解决方案”
8.返回到命令提示窗口并运行以下命令以便将程序集添加到全局程序集高速缓存中。
gacutil.exe/ibin\debug\webservicerequestor.dll
9.运行以下命令以使用COM+注册程序集。
regsvcsbin\debug\webservicerequestor.dll
10.启动“组件服务”(位于“管理工具”程序组下面)。
11.展开“组件服务”、“计算机”和“我的电脑”节点。
12.展开“
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 客户端 证书 调用 Web 服务
![提示](https://static.bingdoc.com/images/bang_tan.gif)