Working with SSL in Web API(在 Web API 中使用 SSL)
一些常见的身份验证方案在普通 HTTP 上是不安全的。 尤其是,基本身份验证和窗体身份验证会发送未加密的凭据。 为了保证安全,这些身份验证方案 必须使用 SSL。 此外,SSL 客户端证书可用于对客户端进行身份验证。
在服务器上启用 SSL
在 IIS 7 或更高版本中设置 SSL:
- 创建或获取证书。 对于测试,可以创建自签名证书。
- 添加 HTTPS 绑定。
有关详细信息,请参阅 如何在 IIS 7 上设置 SSL。
对于本地测试,可以从 Visual Studio 在 IIS Express 中启用 SSL。 在属性窗口中,将“启用 SSL”设置为“True”。 记下 SSL URL 的值;使用此 URL 测试 HTTPS 连接。
在 Web API 控制器中强制 SSL
如果同时具有 HTTPS 和 HTTP 绑定,客户端仍可使用 HTTP 访问站点。 你可以允许某些资源通过 HTTP 使用,而其他资源需要 SSL。 在这种情况下,请使用操作筛选器来要求对受保护的资源使用 SSL。 以下代码演示了一个检查 SSL 的 Web API 身份验证筛选器:
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
base.OnAuthorization(actionContext);
}
}
}
将此筛选器添加到要求使用 SSL 的任何 Web API 操作:
public class ValuesController : ApiController
{
[RequireHttps]
public HttpResponseMessage Get() { ... }
}
SSL 客户端证书
SSL 使用公钥基础结构证书提供身份验证。 服务器必须提供向客户端对服务器进行身份验证的证书。 客户端向服务器提供证书并不常见,但这是对客户端进行身份验证的一个选项。 若要将客户端证书与 SSL 配合使用,需要一种向用户分发已签名证书的方法。 对于许多应用程序类型,这不是一个良好的用户体验,但在某些环境中 (例如,企业) 它可能是可行的。
优点 | 缺点 |
---|---|
- 证书凭据强于用户名/密码。 - SSL 提供完整的安全通道,包括身份验证、消息完整性和消息加密。 | - 必须获取和管理 PKI 证书。 - 客户端平台必须支持 SSL 客户端证书。 |
若要将 IIS 配置为接受客户端证书,请打开 IIS 管理器并执行以下步骤:
单击树视图中的站点节点。
双击中间窗格中的 “SSL 设置” 功能。
在 “客户端证书”下,选择以下选项之一:
- 接受:IIS 将接受来自客户端的证书,但不需要证书。
- 要求:需要客户端证书。 (若要启用此选项,还必须选择“需要 SSL”)
还可以在 ApplicationHost.config 文件中设置以下选项:
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert" />
<!-- To require a client cert: -->
<!-- <access sslFlags="Ssl, SslRequireCert" /> -->
</security>
</system.webServer>
SslNegotiateCert 标志表示 IIS 将接受来自客户端的证书,但不需要一个等效于 IIS 管理器) 中的“接受”选项 (。 若要要求证书,请设置 SslRequireCert 标志。 对于测试,还可以在位于“Documents\IISExpress\config”的本地applicationhost.Config文件中的 IIS Express 中设置这些选项。
创建用于测试的客户端证书
出于测试目的,可以使用 MakeCert.exe 创建客户端证书。 首先,创建测试根颁发机构:
makecert.exe -n "CN=Development CA" -r -sv TempCA.pvk TempCA.cer
Makecert 将提示你输入私钥的密码。
接下来,将证书添加到测试服务器的“受信任的根证书颁发机构”存储,如下所示:
- 打开“MMC”。
- 在“ 文件”下,选择“ 添加/删除管理单元”。
- 选择“ 计算机帐户”。
- 选择“ 本地计算机 ”并完成向导。
- 在导航窗格下,展开“受信任的根证书颁发机构”节点。
- 在 “操作 ”菜单上,指向“ 所有任务”,然后单击“ 导入 ”启动证书导入向导。
- 浏览到证书文件 TempCA.cer。
- 单击“ 打开”,然后单击“ 下一步 ”并完成向导。 (系统将提示你重新输入密码。)
现在,创建由第一个证书签名的客户端证书:
makecert.exe -pe -ss My -sr CurrentUser -a sha1 -sky exchange -n "CN=name"
-eku 1.3.6.1.5.5.7.3.2 -sk SignedByCA -ic TempCA.cer -iv TempCA.pvk
在 Web API 中使用客户端证书
在服务器端,可以通过在请求消息上调用 GetClientCertificate 来获取客户端证书。 如果没有客户端证书,方法返回 null。 否则,它将返回 X509Certificate2 实例。 使用此对象从证书获取信息,例如颁发者和使用者。 然后,可以使用此信息进行身份验证和/或授权。
X509Certificate2 cert = Request.GetClientCertificate();
string issuer = cert.Issuer;
string subject = cert.Subject;