将http重定向到https是否不好?


247

我刚刚在服务器上安装了SSL证书。

然后,它为我的域上端口80上的所有流量设置了重定向,以将其重定向到端口443。

换句话说,我的所有访问http://example.com量现在都被重定向到https://example.com页面的相应版本。

重定向是在我的Apache虚拟主机文件中完成的,如下所示:

RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L] 

我的问题是,使用SSL是否有任何弊端?

由于这不是301重定向,因此切换到会失去搜索引擎中的链接汁/排名https吗?

感谢您的帮助。我一直想在服务器上设置SSL,仅是为了进行此操作,我终于决定今晚进行操作。到目前为止,它似乎运行良好,但是我不确定在每个页面上使用它是否是一个好主意。我的网站不是电子商务网站,并且不处理敏感数据;它主要用于外观和安装它的学习乐趣。


更新的问题

奇怪的是,由于Bing到处都使用HTTPS,因此从我的网站创建了此屏幕截图。

在此处输入图片说明


12
[WTF-我无法添加答案(尽管我似乎有足够的代表)。]我的答案(部分地)是有时糟糕。考虑在通过HTTP的GET中传递COOKIE或API密钥。如果您的站点将HTTP请求重定向到HTTPS请求,则这些调用将起作用,但是COOKIE或API密钥将以明文形式传输。有些API会关闭HTTP,这是一种更可靠的方法-根本没有HTTP,因此除非使用HTTPS,否则您甚至无法使其正常工作。示例:stripe.com/docs/api/lang=php#authentication中的
编码大声

8
@codingoutloud-替代方案是整个过程都通过HTTP进行,而根本没有HTTPS。怎么样了?
Mark Henderson

3
@BenCrowell,这是因为被俘虏的门户网站看起来非常像sslstrip-style重定向攻击(它们都是中间人请求劫持),因此支持HSTS的浏览器会阻止它们。
杰弗里·汉汀

3
注意,使用HTTPS意味着一切,你还包括应该HTTPS,或者根本不加载-例如使用jQuery的负载src="://example.com/jquery.js"-注意缺乏httphttps使浏览器加载相应的一个。我经历了一场噩梦,试图通过API(通过https加载)产生的http链接来正确加载一些嵌入式Amazon东西-这意味着它们直到我找到未记录的参数来切换https链接后才能正常工作
2014年

3
杰森 您的更新应该是一个新问题,可能是网站管理员提出的,因为它与您的原始问题(技术上)无关。但是您的样式表可能来自不安全的域。
马克·亨德森

Answers:


316

[R]标志本身就是302重定向(Moved Temporarily)。如果您确实希望人们使用您网站的HTTPS版本(提示:您这样做),那么您应该使用它[R=301]进行永久重定向:

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R=301,L] 

A 301使您所有的google-fu和来之不易的pagerank 保持完整。确保mod_rewrite已启用:

a2enmod rewrite

要回答您的确切问题:

将http重定向到https是否不好?

一定不行。这很好。


3
感谢您提供的信息,我的老板告诉我他仅在其网站的某些页面上运行https的原因是,它使用大量的服务器资源在每个页面上运行它。您是否对此有所了解,或者这是真的吗?
JasonDavis 2014年

9
@jasondavis仅当您不花几分钟来对其进行优化时
迈克尔·汉普顿

10
“它使用大量服务器资源来在每个页面上运行它。” 现代CPU具有加密加速功能,使SSL几乎免费。不用担心开销。
亚当·戴维斯

41
@AdamDavis加密算法可能是轻量级的,但是握手开销仍然存在。同样,HTTPS可以防止HTTP代理缓存您的内容。在大多数情况下,HTTPS的开销很小且值得,但是要过分概括。
200_success 2014年

6
它会杀死共享缓存,这对某些站点的使用模式很有用,并且通常保护得很少(人们可以知道您访问了该站点,但没有您所做的工作很重要,这很重要吗?这是SSL有用的唯一情况)。SSL在每种资源上的主要优点不是您需要“保护”(例如,看着“关于我们的人”),而是在必要的情况下您不会滑倒并不能使用它。
乔恩·汉娜

49

尽管我支持仅SSL网站的想法,但我要说的一个缺点是开销取决于您的网站设计。我的意思是,例如,如果您要在img标签中投放大量单独的图片,则可能会导致您的网站运行缓慢。我建议任何使用仅SSL的服务器的用户,以确保它们可以在以下服务器上工作。

  1. 如果您在链接中指定了自己的域名,请检查整个站点的内部链接,并确保它们都使用HTTPS,这样就不会引起自己的重定向。
  2. <meta property="og:url"使用您域的https版本将其更新为。
  3. 如果<base href=再次使用,请更新以使用HTTPS。
  4. 如果可能,安装SPDY协议
  5. 确保尽可能使用CSS Image Sprite,以减少请求数量。
  6. 更新您的站点地图以指示https状态,以便蜘蛛程序随着时间的推移了解此更改。
  7. 更改诸如Google网站站长工具之类的搜索引擎偏好设置,以偏爱HTTPS
  8. 在可能的情况下,将所有策略性媒体卸载到HTTPS CDN服务器。

如果解决了以上问题,那么我怀疑您会遇到很多问题。


SPDY是一个很好的建议;甚至似乎有一个模块向Apache 2.x添加了SPDY支持
Calrion 2014年

18
使用“ //yourserver.com/some-uri”而不是“ yourserver.com/some-uri ”解决了问题(1),因为浏览器将根据加载页面的模式来选择适当的模式(http或https) 。
MauganRa 2014年

1
@MauganRa当然,除非,例如,它是从http文章页面到https登录页面的链接。
Mołot

4
Google会通过Referer标题看到某人正在访问的URL 。例如,此网站使用Google CDN中的jQuery,并且每次我重新加载该网站时,我的浏览器都会向Google发送请求。因此,Referer还将标头发送给Google,该标头设置为该站点的URL。因此,Google可以在IP地址不变的情况下跟踪我访问的网站(如果在这段时间内使用Google服务,Google也可以将此信息与我的Google帐户关联)。
Stephan Kulla 2014年

1
对于1)我只是在MySQL数据库中进行了搜索并将HTTP替换为https ...我正在使用WordPress,因此它非常容易更新数百个链接
JasonDavis,2014年

38

我已经设置了https,那么您应该在网站的任何地方使用它。您将避免出现混合内容问题的风险,如果您拥有所需的工具,为什么不确保整个网站的安全呢?

关于从http到https的重定向,答案并不那么简单。

重定向将使您的用户更加轻松,他们只需输入whatsite.com并重定向到https。

但。如果用户有时处于不安全的网络上(或接近Troy Hunt和他的Pineapple),该怎么办?然后,用户将出于旧习惯请求http://whateversite.com。那是http。这可以妥协。重定向可能指向https://whateversite.com.some.infrastructure.long.strange.url.hacker.org。对于普通用户来说,这看起来很合法。但是流量可以被拦截。

因此,我们在这里有两个相互竞争的要求:做到用户友好和安全。幸运的是,有一种称为HSTS header的补救措施。使用它可以启用重定向。浏览器将移至安全站点,但是由于HSTS标头也使它记住了。当用户键入位于该不安全网络上的whatsite.com时,浏览器将立即转到https,而不会跳过通过HTTP进行的重定向。除非您处理非常敏感的数据,否则我认为这是大多数站点的安全性和可用性之间的一个公平的权衡。(当我最近设置一个处理病历的应用程序时,我使用了所有https,而没有重定向)。不幸的是Internet Explorer不支持HSTS(来源),因此,如果您的目标受众主要是使用IE且数据很敏感,则可能要禁用重定向。

因此,如果您不以IE用户为目标,请继续使用重定向,但还要启用HSTS标头。


更多的人也需要注意这一点。另一件事是,人们认为它们是安全的,因为端点是HTTPS,而忽略了GET或POST中发送到页面的所有信息都是纯文本的事实。
Velox

3
@Velox-我认为“人们认为它们是安全的,因为端点是HTTPS,而忽略了GET或POST中发送到页面的所有信息都是纯文本的事实”的含义是非常准确的。尽管存在一些陷阱,但在通过HTTPS传输期间,GET查询参数不会明显传播。例如,请参阅:stackoverflow.com/questions/323200/…POST负载也受到保护,同时也不易受日志记录和引用标头的影响。
–codingoutloud

@codingoutloud这就是我的观点。通过HTTPS对它们进行加密,但在对HTTP页面的初始请求中未对它们进行加密。
Velox

1
@Velox-如果整个站点都重定向到HTTPS,则不太可能在启动HTTPS之前发送任何GET参数(此后所有内容都将保留为HTTPS)。仍然有一个初始请求将发送cookie,可以通过HSTS对其进行补救...以及SSLStrip的一个很小的攻击窗口,它可能会被JavaScript击败,但这本身就是一场军备竞赛。
Brilliand 2014年

@Brilliand公平点,但是安全方面的弱点使整个事情变得脆弱。永远值得考虑。
Velox

22

这没有任何问题,实际上,这是最佳做法(适用于通过安全连接提供服务的网站)。实际上,您所做的与我使用的配置非常相似:

<VirtualHost 10.2.3.40:80>
  ServerAdmin me@example.com
  ServerName secure.example.com
  RedirectMatch 301 (.*) https://secure.example.com$1
</VirtualHost>

# Insert 10.2.3.40:443 virtual host here :)

301状态代码表示永久重定向,指示功能的客户端,以供日后连接的安全网址(如更新书签)。

如果您仅通过TLS / SSL来为站点提供服务,则建议您再执行一条指令,以在安全的虚拟主机中启用HTTP 严格传输安全性(HSTS):

<IfModule mod_headers.c>
  Header set Strict-Transport-Security "max-age=1234; includeSubdomains"
</IfModule>

此标头指示有能力的客户端(我相信这些天是大多数客户端)在接下来的几秒钟内应将HTTPS与提供的域(secure.example.com在这种情况下)一起使用1234。该; includeSubdomains部分是可选的,指示该指令不仅适用于当前域,还适用于其下的任何域(例如alpha.secure.example.com)。请注意,只有通过SSL / TLS连接提供服务时,浏览器才会接受HSTS标头!

为了根据当前的最佳实践测试服务器配置,Qualys的SSL服务器测试服务是一个不错的免费资源。我的目标是至少获得A-评分(由于缺乏对椭圆曲线加密的支持,Apache 2.2无法获得更高的评分)。


我应该添加,发送标头Strict-Transport-Security: max-age=0会否定任何先前的指令;像往常一样,必须通过HTTPS发送才能被接受,但是如果您决定还需要在域上使用HTTP,则这是取消事务的便捷方法。
Calrion 2014年

5

哇 !将HTTP重定向到HTTPS是一件非常好的事情,我看不到任何缺点。

只需确保您的客户端具有正确的CA即可避免关于浏览器中证书的非用户友好警告。

此外,设置Apache重定向到HTTPS的方式似乎还可以。


5

将http重定向到https是否不好?

一点都不。实际上,这是一件好事!

在重定向上:

通过完全消除重写,可以提高效率。这是我在类似情况下的配置...

<VirtualHost *:80>
  ServerName domainname.com

  <IfModule mod_alias.c>
    Redirect permanent / https://domainname.com/
  </IfModule>
</VirtualHost>

4

HTTPS并非万无一失。当然,通常强制使用HTTPS是一件好事。它可以防止普通罪犯对用户造成不良影响。

但是请记住要检查一下SSL设置,例如SSLCiphers设置。禁用诸如RC4加密,SSLv2和SSLv3协议之类的功能。另外,您应该确定系统的密码系统库是否支持TLS1.2(这是您想要的东西;))

启用S​​SL,这是一件好事。


熵不会耗尽(至少在您防御地球攻击者而不是伏都教的时候)。要么从不足的熵开始,要么无法做任何需要随机性的工作,要么从足够的熵开始,并且无论生成多少随机性,都保持足够的熵。
吉尔斯2014年

对不起,什么?Linux上有许多操作坚持使用硬件派生的强熵,而不是基于PRNG的可能足够好的熵,并且如果池深度很低,这些操作确实会阻塞。在Linux系统上,最有可能从足够的熵开始,但是过度使用会耗尽池,从而导致某些操作阻塞。
MadHatter 2014年

3

就我个人而言,我全都希望使用SSL来保护Web上的连接安全,但是我觉得这里遗漏了所有其他答案,这是因为并非所有支持HTTP连接的设备和软件都可以使用SSL,因此,如果他们不支持,我会考虑为用户提供某种避免它的方法。在某些国家/地区,加密技术非法的人也有可能被禁止访问您的网站。我会考虑添加一个带有链接的未加密登录页面,以强制使用该网站的不安全版本,但是除非用户明确选择按照您所说的那样做,然后将其转发到HTTPS版本。


解决方案的问题是,即使将HTTP登陆页面正确分离,也要使其具有一个纯净的HTTP登录页面,否则该页面将无法操作。即,没有任何实际保证可以将网站的HTTPS版本的链接完整地传递给访问者。
哈坎·林奎斯特

3

以下是一些广泛的笔触问题:

  • MITM / SSLSTRIP:这是一个很大的警告。如果您打算通过HTTPS服务站点,请在站点上禁用HTTP。否则,您将使用户容易受到包括SSLSTRIP在内的各种中间人攻击,该攻击将拦截请求并通过HTTP悄悄地为他们提供服务,从而将自己的恶意软件脚本插入流中。如果用户没有注意到,那么他们会认为会话实际上是安全的。

    • 但是,与此有关的问题是,如果您的站点是公共站点,并且您只是毫不客气地禁用了HTTP,则可能会失去很多访问者。它甚至可能不会发生到他们尝试HTTPS如果网站不会与HTTP加载。
  • 如果您的站点要求安全登录,则整个用户会话都应受到保护。不要通过HTTPS进行身份验证,然后将用户重定向回HTTP。如果再次这样做,您将使用户容易受到MITM攻击。目前,身份验证的标准方法是进行一次身份验证,然后来回传递身份验证令牌(在cookie中)。但是,如果您通过HTTPS进行身份验证,然后重定向到HTTP,则中间人可以拦截该Cookie,并像验证用户一样使用该网站,从而绕过您的安全性。

  • 实际上,HTTPS的“性能”问题仅限于创建新连接所涉及的握手。尽一切努力使从URL进行多个HTTPS连接的需求减至最少,您将遥遥领先。坦率地说,即使您通过HTTP提供内容,也是如此。如果您读过SPDY,您将意识到它所做的一切都旨在尝试通过单个连接从单个URL提供所有内容。是的,使用HTTPS会影响缓存。但是,无论如何,如今有多少网站只是静态的可缓存内容?使用Web服务器上的缓存来最大限度地减少冗余数据库查询,一次又一次地检索未更改的数据,并防止不必要的频繁执行昂贵的代码路径,您可能会付出更多的努力。


您实际上可以解决sslstrip的方法是使用HSTS(最好是预先加载HSTS设置)。在这方面,您是否接受通过纯HTTP发出的请求实际上并不重要,即使您仅接受HTTPS请求,MITM也可以通过纯HTTP应答(可能是代理到您的HTTPS站点)。
哈坎·林奎斯特

@HåkanLindqvist我真的赢得了你的反对票?在不通过HTTPS进行身份验证然后在其余会话中切换到HTTP方面,我是否给出了不好的建议或好的建议?我是否就HTTPS性能神话提供了不好的建议?另外,如果客户端最初尝试使用HTTPS连接,则MITM无法在不触发浏览器警报的情况下进行拦截和响应,因为除非证书被盗或伪造成功,否则证书将不匹配。另一方面,如果站点接受HTTP连接,则侦听会更容易。无论哪种方式,HTTPS都会提高标准。
克雷格(Craig)

..当然,我完全同意使用HSTS。
克雷格(Craig)

我的答案问题是列表中的第一项声称解决sslstrip而实际上却没有解决(谈到神话)。在我最初的评论中,我想尝试得出的是,如果您有一个活动的MITM(首先是sslstrip所需要的),从客户端的角度来看,攻击者实质上可以是“站点”。是由攻击者决定他们是否要接受来自客户端的纯HTTP连接,在这方面您的实际Web服务器的行为不会影响攻击者可以或将做的事情。
霍坎·林德奎斯特(HåkanLindqvist)

@HåkanLindqvist除非访问者有意尝试与HTTPS连接,否则除非攻击者设法窃取了服务器证书或以某种方式成功伪造了证书,否则攻击者无法在浏览器中不抛出标志就无法满足该请求。以便将连接切换到HTTP。HTTPS 仍然提高了标准。当然,如果访问者通过HTTP进行初始连接尝试,则所有选择都将完全无效。
克雷格(Craig)

1

从技术上讲,这不是您的原始问题的答案,但是,如果您在所有位置使用Google Chrome扩展程序HTTPSEverywhere(我确定其他浏览器上也有类似的扩展程序),则该扩展程序会自动将HTTP站点重定向到HTTPS站点。我已经使用了一段时间了,而且我没有任何问题(除了速度下降以外,但我还没有进行测试)。HTTPSEeverywhere可以通过服务器端的某些规则进行更改,但是由于我在该领域没有做太多事情,因此我不确定确切的细节。

回到您的实际问题,如果您使用HTTPSEverywhere之类的东西,则仅使用HTTP的动机就更少了,尽管我认为很难为需要的时候建立正确的规则。


1

通过HTTP进行HTTPS的唯一技术缺点是,与普通HTTP相比,处理HTTPS请求在计算上更加昂贵

但是,鉴于大多数现代服务器都具有高功率的CPU,因此这种影响通常可以忽略不计,除非您处于极高的流量水平,此时无论如何您都更有可能使用负载平衡器

随着像SPDY这样需要SSL / TLS才能工作的协议的出现,实际上可以通过对多个请求进行显着的性能改进并整体上更快地将资产提供给客户端来抵消上述计算开销。


HTTPS性能的问题在于,建立新连接的成本更高,因为涉及的往返次数更多,并且非对称加密/解密比对称加密/解密要昂贵得多。一旦连接握手建立了共享的对称加密密钥,则正在进行的开销实际上是不相关的(很小)。如果您读过SPDY,您会发现它做的所有花哨的东西的目的实质上是在单个连接上提供来自URL的所有内容,从而减轻了连接握手的开销。
Craig

1

重定向到https非常好,但我读过它还取决于您如何组织重定向。

根据security.stackexchange.com上的答案中的建议,制作专用的虚拟服务器将传入的HTTP请求重定向到您的https连接,听起来很聪明,而且将消除一些其他安全威胁。Apache中的配置如下所示:

# Virtual host for rerouting
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

# Virtual host for secure hosting on https
<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on
    Header set Strict-Transport-Security "max-age=8640000;includeSubdomains"

    ...site settings...

</VirtualHost>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.