41

我正在创建自托管 Web API 服务。为了保护它,我已经研究并实施了这篇文章,使用 makecert 成功生成了本地 SSL 证书,并且我的服务经过身份验证并生成令牌很好,如果我正在使用

http://localhost/webapi/authentication/authenticate

链接,但是当我尝试使用 HTTPS 访问我的服务时,我在 Firefox 上得到以下信息:

ssl_error_rx_record_too_long

对于相同的请求,Fiddler 向我展示了:

HTTP/1.1 502 Fiddler - 连接失败日期:星期一,2013 年 8 月 26 日 10:44:27 GMT 内容类型:文本/html;charset=UTF-8 连接:关闭时间戳:13:44:27.433

[Fiddler] 到 localhost 的套接字连接失败。
无法与 server.fiddler.network.https 协商 HTTPS 连接> 无法保护 localhost 的现有连接。由于意外的数据包格式,握手失败..

我的自主机配置:

    private HttpSelfHostServer _server;
    private ExtendedHttpsSelfHostConfiguration _config;
    public const string ServiceAddress = "https://localhost/webapi";
    _config = new ExtendedHttpsSelfHostConfiguration(ServiceAddress);
    _server = new HttpSelfHostServer(_config);
    _server.OpenAsync();

这篇文章中获取的 ExtendedHttpSelfHostConfiguration是:

public class ExtendedHttpSelfHostConfiguration : HttpSelfHostConfiguration
{
    public ExtendedHttpSelfHostConfiguration(string baseAddress) : base(baseAddress) { }
    public ExtendedHttpSelfHostConfiguration(Uri baseAddress) : base(baseAddress) { }

    protected override BindingParameterCollection OnConfigureBinding(HttpBinding httpBinding)
    {
        if (BaseAddress.ToString().ToLower().Contains("https://"))
        {
            httpBinding.Security.Mode = HttpBindingSecurityMode.Transport;
        }

        return base.OnConfigureBinding(httpBinding);
    }
}

我错过了什么?提前致谢!

4

3 回答 3

40

根据这篇博客文章,我发现我应该创建一个 SSL 证书并将其分配给特定端口(在我的情况下为:99)。

我已经创建了本地签名的 SSL。然后得到了ThumbprintApplicationId。使用 CMD 命令netsh(在 Win7 之前的系统中有一个httpcfg工具),我已将证书分配给端口

netsh http add sslcert ipport=0.0.0.0:99 certhash=3e49906c01a774c888231e5092077d3d855a6861 appid={2d6059b2-cccb-4a83-ae08-8ce209c2c5c1},其中 certhash = SSL Thumbprint和 appid = ApplicationId我之前复制的。

就是这样,现在我可以发出 HTTPS 请求了!

于 2013-08-26T12:41:37.757 回答
11
  1. 打开 IIS
  2. 双击“服务器证书”
  3. 在右侧窗格中,单击“创建自签名证书”
  4. 输入名称“本地主机”
  5. 结束

将使用您指定的名称创建证书,找到它。

  1. 双击证书,它将打开其属性,选择“指纹”并复制该值。

现在您已经创建了证书,是时候将其绑定到您在 self 主机中使用的端口了。如果是https://localhost:5000

  1. 打开升高的 CMD
  2. 运行此命令将您创建的证书绑定到您正在使用的端口。

netsh http add sslcert ipport=0.0.0.0:5000 certhash=[cert-thumbprint] appid={[App-Id]}

  1. 将 [Cert-thumbprint](包括方括号)替换为您在步骤 6 中复制的值。
  2. 替换 [app-id] (包括方括号)是来自应用程序集信息的 guid

[assembly: Guid("[app-id]")]

你完成了!

于 2018-09-29T10:47:34.647 回答
-2

使用代码的第一种方法:

public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
        {
            actionContext.Response = actionContext.Request
                .CreateResponse(HttpStatusCode.Found);
            actionContext.Response.Content = new StringContent
                ("<did>Use https instead of http</div>", Encoding.UTF8, "text/html");

            UriBuilder uriBuilder = new UriBuilder(actionContext.Request.RequestUri);
            uriBuilder.Scheme = Uri.UriSchemeHttps;
            uriBuilder.Port = 44337;

            actionContext.Response.Headers.Location = uriBuilder.Uri;
        }
        else
        {
            base.OnAuthorization(actionContext);
        }
    }
}

在 web 配置文件中放入以下代码:

config.Filters.Add(new RequireHttpsAttribute());

使用属性的第二种方法:如果您不想使用第一种方法,您可以使用 . 装饰控制器类或操作方法RequireHttpsAttribute

于 2018-09-04T09:03:24.913 回答