具有自签名证书的基于SSL的OpenID
我在个人服务器上设置了自己的开放ID提供程序,并在我的apache配置文件中添加了对https的重定向。当不使用安全连接时(当我禁用重定向时),我可以正常登录,但是使用重定向时,无法使用此错误消息登录:
基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。
我猜这是因为我使用的是自签名证书。
任何人都可以确认是否存在自签名证书吗?如果没有,没有人知道这是什么问题?
解决方案
听起来像这样。OpenID服务器的客户端不信任根证书颁发机构。
对OpenID URL使用SSL的主要好处是,它为依赖方提供了一种机制来发现DNS是否已被篡改。依赖方无法判断带有自签名证书的OpenID URL是否已被破坏。
通过在提供商的终结点URL上使用SSL还有其他好处(更容易建立关联,无需监听扩展数据),如果我们使用自签名证书,这些好处仍然存在,但我认为这些是次要的。
(免责声明:我是OpenID的新手,所以我在这里可能是错的。)Open ID使用者(例如,StackOverflow)和Open ID Provider(服务器)之间的通信不需要HTTPS-它也可以正常工作就像通过纯HTTP一样安全。我们需要做的是将服务器配置为仅在显示登录页面时才切换到HTTPS。在这种情况下,只有浏览器才需要考虑自签名证书。我们可以将证书导入到PC上,一切都将与使用Verisign颁发的证书一样安全。
OpenID以重定向透明的方式设计。只要在每次重定向中通过GET或者POST保留了必要的键/值对,一切都将正确运行。
实现与不使用自签名证书的使用者兼容的最简单解决方案是使用非加密端点,该端点将checkid_immediate
和checkid_setup
消息重定向到一个加密的端点。
在服务器代码中执行此操作比使用Web服务器重定向更容易,因为前者可以更轻松地处理POST请求,同时还可以使代码保持一致。此外,只要完成适当的检查,就可以使用同一端点来处理所有OpenID操作,无论是否应通过SSL进行处理。
例如,在PHP中,重定向可以很简单:
// Redirect OpenID authentication requests to https:// of same URL // Assuming valid OpenID operation over GET if (!isset($_SERVER['HTTPS']) && ($_GET['openid_mode'] == 'checkid_immediate' || $_GET['openid_mode'] == 'checkid_setup')) http_redirect("https://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}");
就普通用户而言,由于`openid.return_to'值是针对纯HTTP端点生成的,因此它仅处理未加密的服务器。假设通过会话和随机数对OpenID 2.0进行适当的操作,则使用者与服务器之间传递的任何信息都不会泄露可利用的信息。浏览器和OpenID服务器之间的可利用的操作(密码监听或者会话cookie劫持)是通过加密通道完成的。
除了阻止窃听者之外,通过SSL进行身份验证操作还允许我们使用"安全" HTTP cookie标志。如果我们愿意的话,这将为checkid_immediate
操作增加另一层保护。