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 连接。

属性中已启用 S S L 的图像为 true

在 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 管理器并执行以下步骤:

  1. 单击树视图中的站点节点。

  2. 双击中间窗格中的 “SSL 设置” 功能。

  3. “客户端证书”下,选择以下选项之一:

    • 接受: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 将提示你输入私钥的密码。

接下来,将证书添加到测试服务器的“受信任的根证书颁发机构”存储,如下所示:

  1. 打开“MMC”。
  2. 在“ 文件”下,选择“ 添加/删除管理单元”。
  3. 选择“ 计算机帐户”。
  4. 选择“ 本地计算机 ”并完成向导。
  5. 在导航窗格下,展开“受信任的根证书颁发机构”节点。
  6. “操作 ”菜单上,指向“ 所有任务”,然后单击“ 导入 ”启动证书导入向导。
  7. 浏览到证书文件 TempCA.cer。
  8. 单击“ 打开”,然后单击“ 下一步 ”并完成向导。 (系统将提示你重新输入密码。)

现在,创建由第一个证书签名的客户端证书:

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;