我正在创建自托管Web API服务。为了保护它,我研究并实现了这篇文章,成功地使用makecert生成了一个本地SSL证书,我的服务经过了身份验证,并生成了令牌,如果我使用
http://localhost/webapi/authentication/authenticate
链接,但是当我尝试使用HTTPS访问我的服务时,我在Firefox上得到了以下信息:
ssl_error_rx_record_too_long
对于同样的请求,Fiddler向我展示了:
HTTP/1.1 502 Fiddler -连接失败日期:Mon,26 Aug 2013 10:44:27 GMT内容类型:text/html; charset=UTF-8连接:关闭时间戳:13:44:27.433
[Fiddler]到localhost的套接字连接失败。
无法与server.fiddler.network协商HTTPS连接。https>无法保护本地主机的现有连接。由于意外的数据包格式,握手失败。
我的自主机配置:
private HttpSelfHostServer _server;
private ExtendedHttpsSelfHostConfiguration _config;
public const string ServiceAddress = "https://localhost/webapi";
_config = new ExtendedHttpsSelfHostConfiguration(ServiceAddress);
_server = new HttpSelfHostServer(_config);
_server.OpenAsync();
其中,从this post获取的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);
}
}
我错过了什么?提前感谢!
3条答案
按热度按时间ttcibm8c1#
根据this blog post我已经想通了,我应该创建一个SSL证书,并将其分配给特定的端口(在我的情况下:99)。
我创建了本地签名的SSL。然后得到Thumbprint和ApplicationId。使用CMD命令netsh(在Win7之前的系统中有一个httpcfg工具),我已经将我的证书分配给了端口
netsh http add sslcert ipport=0.0.0.0:99 certhash=3e49906c01a774c888231e5092077d3d855a6861 appid={2d6059b2-cccb-4a83-ae08-8ce209c2c5c1}
,其中certhash = SSLThumbprint,appid =ApplicationId我之前复制过。就是这样,现在我可以发出HTTPS请求了!
dzhpxtsq2#
1.打开IIS
1.双击“服务器证书”
1.在右窗格中,单击“创建自签名证书”
1.输入名称“localhost”
1.完成
将使用您指定的名称创建证书,找到它。
1.双击证书,它将打开其属性,选择“Thumbprint”并复制值。
现在您已经创建了证书,是时候将其绑定到您在self主机中使用的端口了。如果是https://localhost:5000
1.开放性抬高型CMD
1.运行此命令将您创建的证书绑定到您正在使用的端口。
netsh http add sslcert ipport=0.0.0.0:5000 certhash=[cert-thumbprint] appid={[App-Id]}
1.将[Cert-thumbprint](包括方括号)替换为您在步骤6中复制的值。
1.将[app-id](包括方括号)替换为应用程序集信息中的guid
[assembly: Guid("[app-id]")]
你完了!
6ojccjat3#
使用代码的第一种方法:
在web config文件中放入以下代码:
使用属性的第二种方法:如果你不想使用第一种方法,你可以用
RequireHttpsAttribute
装饰控制器类或动作方法。