wcf webservice 和使用 https 的 URL 转发
Posted
技术标签:
【中文标题】wcf webservice 和使用 https 的 URL 转发【英文标题】:wcf webservice and URL forwarding with https 【发布时间】:2015-02-14 06:31:22 【问题描述】:我这几天一直在研究并尝试解决这个问题,但没有成功。
我在 Windows Server 2012 上的 IIS 8 上部署了 WCF Web 服务。
在开发过程中,我一直在使用服务的完整 url 来进行服务调用。
示例:
http://myserver.com/appservices/service1.svc/getdata
但现在我需要做以下事情:
我在 godaddy 上有一个域,比如说 somedomain.com,我想使用一个子域 services.somedomain.com 来代替完整的网址。所以我想要services.somedomain.com/getdata
之类的东西,而不是写上面的完整网址。我无法做到这一点。我尝试在 Godaddy 上为子域 services 设置 URL 转发以转发到 http://myserver.com/appservices/service1.svc
,这适用于浏览器,但是在移动应用程序或通过提琴手使用它时,我收到 301 错误。 (我尝试了有和没有掩蔽)。有没有办法做到这一点?
我需要为此获得 SSL 认证。我的问题是,我应该为哪个域获得它?我是否为 somedomain.com 或子域 services.somedomain.com 或原始域 myserver.com 获取它。我这里有点迷茫,不想买错ssl证书
为了让您大致了解我希望获得的最终结果,我需要具备以下条件:
somedomain.com 指向部署在 iis 上的网站
services.somedomain.com 指向部署在同一 iis 上的 wcf webservice,它将用于将从 android/iphone 调用的服务。 这需要有 SSL 认证
我从 godaddy 购买了 somedomain.com
非常感谢任何提示/帮助我真的很感激
【问题讨论】:
您是否尝试在 IIS 8 上配置 HTTP redirect? 您在哪里托管?自主办?天蓝色? Http 301 不是错误,而是重定向。浏览器自动遵循此重定向,.Net WebClient 也是如此。也许 iPhone/Android 默认情况下不会。它是 REST 服务吗?它必须是 services.somedomain.com/getdata 还是 services.somedomain.com/api/getdata? @Dennis 我有自己的专用服务器,我是管理员。这是一个 Windows Server 2012。 @codeworx 是的,它是一个 REST 服务。我更喜欢它是 services.somedomain.com/getdata,但如果这不可行,那么我可以使用 services.somedomain.com/api/getdata。我对使子域工作并拥有 https 更感兴趣。谢谢 【参考方案1】:现在我从上面的问题中对情况有了更好的了解。
首先,由于您拥有两个域并且您是 Windows 2012 服务器的管理员,我建议您直接将somedomain.com
添加到您的服务器, 即不要重定向它。这更好,因为您只需要购买您需要的 SSL 证书。如果您使用重定向,则需要两个域的 SSL 证书,否则您的用户会收到安全警告,因为原始请求与证书不匹配。
您还想要的是 Url Rewrite,而不是 Redirect。有什么不同? 重定向是一个客户端请求,让网络浏览器转到另一个网站(使用301 error code)。 rewrite 是在 URL 到达您的服务之前对其进行 服务器端重写。
您可以开始使用 Url Rewriting 将以下内容添加到您的 Web.config
文件中:
<system.webServer>
<rewrite>
<rules>
<!-- My rules -->
</rules>
</rewrite>
</system.webServer>
我们将添加一些规则(假设您在同一台服务器上有services.somedomain.com
)。
第一条规则,将http://services.somedomain.com/appservices/service1.svc/getdata
重写为http://services.somedomain.com/getdata
。
<rule name="SubDomainAppService" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTP_HOST" pattern="^services\.somedomain\.com$" />
</conditions>
<action type="Rewrite" url="HTTPSservices.somedomain.com/appservices/service1.svc/R:1" />
</rule>
这将匹配正则表达式模式services.somedomain.com/getdata
的位置,捕获url 的剩余部分并在内部将其重写为services.somedomain.com/appservices/service1.svc/getdata
。此规则还强制/重写对HTTPS
的请求。
要为您的网站强制使用 SSL,您可以通过添加重写规则来执行此操作。这会将HTTP
上的任何传入请求重写为HTTPS
。
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Permanent" />
</rule>
URL 重写是一个复杂的话题,甚至不是我完全理解的话题。我在回答这个问题时阅读的一些资源:
Rewriting the protocol IIS Server Variables URL rewrite and the www subdomain奖励:
对于您的 DNS、域和 SSL 证书,我建议使用更好的提供商,例如 DNSimple。阅读 Troy Hunt 的* post why he moved。来自 DNSimple 的用于子域和通配符的 SSL 证书是 on their site。
* 如果您不知道 Troy Hunt 是谁,请阅读他关于安全的其余文章。尤其是他关于首先破解你的 API 的帖子。
【讨论】:
使用您提供的信息和一些文件,我能够让它工作。谢谢 这太棒了@Youssef,很高兴我能提供帮助。【参考方案2】:您需要配置您的服务器,以便它托管两个网站:
-
somedomain.com 与绑定:
协议:http,主机名:somedomain.com,端口:80
协议:http,主机名:www.somedomain.com,端口:80
services.somedomain.com 与绑定:
协议:https,主机名:services.somedomain.com,端口:443
协议:http,主机名:services.somedomain.com,端口:80
(最后一个绑定将仅用于将 http 流量重定向到 https)。
SSL:
您必须安装 SSL 证书才能在 IIS 中创建 SSL 绑定。 SSL 证书包含有关为其颁发证书的主机名的信息。颁发给 foo.com 的证书不能用于识别 bar.com。如果您需要保护多个主机名(在这种情况下他们会推荐 UCC 或通配符证书),请务必向证书提供商解释您的需求。
另请注意,IIS7 上的 SSL 主机头配置只能通过 appcmd 命令行完成。
部署:
在不同的目录中设置两个网站(一个包含 www 内容,另一个包含 webservice 文件)。一旦网站和 webservice 文件分开,您可以选择将 webservice 文件放在根目录中。
网址重写:
如果您想从 URL 中删除 service1.svc
,您可以使用 URL 重写。它需要安装URL Rewrite module。您可以使用 IIS 管理器 GUI 创建规则。下面是为 services.somedomain.com 生成的 web.config
文件的示例:
<system.webServer>
<!-- other rules -->
<rewrite>
<rules>
<rule name="http to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Temporary" />
</rule>
<rule name="everything to service1.svc">
<match url="(.*)" />
<conditions>
<add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
<add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/appservices/service1.svc/R:1" />
</rule>
</rules>
</rewrite>
</system.webServer>
【讨论】:
【参考方案3】:既然你问了几个问题,我希望回答其中一些:
首先检查您的子域 services.domain.com 是否被 godaddy 正确转发。 Ping 到子域以检查它是否命中您自己的服务器。与在 IIS 中相比,您可以使用主机名 services.domain.com 添加 Web 服务。 对于网站,您添加一个单独的网站,其主机名是:domain.com
SSL 证书有多种选择,但最便宜的一种是为子域获取它:services.domain.com。在 web.config 中,您可以添加如下所示的重定向,以确保服务始终使用 HTTPS 连接。
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="HTTPS" pattern="^OFF$" />
</conditions>
<action type="Redirect" url="https://HTTP_HOST/R:1" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
enter code here
【讨论】:
【参考方案4】:在 GoDaddy 上将 somedomain.com
和 services.somedomain.com
定义为 "A" 记录 以及您的服务器的 IP 地址,并将它们配置为您服务器上的两个站点。 不要重定向 - 即使你让它工作了,它也会减慢你的用户并花费你额外的证书。
您需要两个证书 - 一个用于 somedomain.com
,另一个用于 *.somedomain.com
。 注意通配符 - 这将允许您在以后需要其他子域时使用相同的证书。
我们希望在几个月后看到免费 SSL - 看看 Let's Encrypt,所以最好不要长期提交。
李>假设所有services.somedomain.com
服务都通过此入口点提供,您只需将/appservices/service1.svc
设置为您网站的默认值,即可避免URL 重写。
【讨论】:
以上是关于wcf webservice 和使用 https 的 URL 转发的主要内容,如果未能解决你的问题,请参考以下文章