仅将自签名 SSL 证书用于 Web 服务

Posted

技术标签:

【中文标题】仅将自签名 SSL 证书用于 Web 服务【英文标题】:Using a self signed SSL certificate just for a web service 【发布时间】:2015-10-21 11:36:00 【问题描述】:

我有一个客户端将拥有的 Web 服务,并且我希望发送到服务器的数据经过加密。为了测试这一点,我使用了自签名 SSL 证书。我知道,当您使用自签名证书并导航到使用它的任何地址时,网络浏览器会警告您它不安全等。

我想知道,如果我在网络服务上线时使用此证书而不是经过验证的证书,我是否会遇到任何问题?

另外我没有服务器的域名,所以我只使用我的 ISP 提供的 IP 地址,使用证书可以这样做吗,因为我读到的任何地方都在谈论他们关于将它们与域名一起使用?

【问题讨论】:

【参考方案1】:

SSL 证书通常颁发给域并由颁发机构签署。当浏览器连接到服务器时,服务器将其证书提供给客户端。然后客户端通过检查它正在访问的域是否与证书中提到的域相同来验证证书。此外,它验证其信任链。这意味着颁发者的证书也应该是有效的。如果颁发者不是根签名机构,则验证颁发者的颁发者证书。而且,最终应该信任根签名权限,这意味着根签名权限应该在您的信任库中。默认情况下,所有主要的签名机构(如 Verisign、Thawte 等)都在 JDK 信任库中,因此如果您有他们签署的证书,那么您在验证信任链时不会遇到问题。如果您的证书是由不受信任的权威机构签署的,那么您需要手动将颁发者的证书导入您的信任链中。

现在,当使用自签名证书时,颁发证书的实体本身就是根签名机构。因此证书应该手动导入您的信任库。您需要这样做才能通过 SSL 握手。但仅此一项并不能解决您的问题。由于您没有使用任何域名,因此如果您通过 DHCP 服务器自动获取服务器 IP,则每次重新启动服务器时,您的 IP 都可能会更改。如果是这种情况,那么一旦 IP 更改,即使是受信任的自签名证书也将不起作用。因为,证书是发给 IP 的,一旦 IP 发生变化,证书就会失效。要解决此问题,您需要从网络管理员处获取服务器的静态 IP 地址。然后为您的静态 IP 生成自签名证书。然后要求您的客户在他们的信任库中添加您的服务器证书。

这对您的客户来说有点乏味。但是,如果您有固定数量的客户端并且客户端计算机在您的控制之下,那么您可以自己将服务器证书添加到客户端信任存储中。但是,如果您的服务器对所有人开放或拥有大量客户端,那么我建议您获得由知名且受信任的证书颁发机构签署的证书。同样,除非您的服务器获得域名,否则无论谁签署您的证书,您仍然需要拥有静态 IP。

【讨论】:

如果无法验证服务器证书的信任链,浏览器会警告目标服务器不安全。浏览器仍然可以通过接受所涉及的风险来允许用户继续。但是,在非浏览器客户端的情况下,SSL 握手将失败,从而与服务器的连接将被断开。【参考方案2】:

自签名证书的问题在任何情况下都是相同的,无论是浏览器还是非浏览器:它本身绝对不能保证任何事情。 SSL 的目的有两个:加密和身份验证。通常,SSL 客户端会使用/要求这两个方面,以使连接真正被视为安全。

对于身份验证(“我在和谁说话?”),使用证书。要使用证书对对等方进行身份验证,您必须拥有该证书的副本以进行比较,或者您需要拥有该证书签名者的证书副本以比较签名。如果您两者都没有,则证书不能保证任何事情。

含义:自签名证书很好如果客户拥有该证书的副本并且可以信任他们从哪里获得证书的来源。如果您有一个非常狭窄的用例,其中每个将要连接到您的 Web 服务的客户端将事先与您联系(例如通过电子邮件),您可以向他们提供证书的副本,以便他们安装到他们的本地信任存储中,然后他们就能够建立无论如何都与您建立安全且经过身份验证的连接。

这不适用于具有任意随机访问者的典型网站;这就是签名证书的用途,已经信任的实体可以为迄今为止未知的第三实体提供担保。不过,它可能适用于供应商-客户场景。

话虽如此,如今免费提供证书非常便宜,并且可以为您的服务提供更多的可信度和专业性。

是的,证书可以是issued for IP addresses。

【讨论】:

以上是关于仅将自签名 SSL 证书用于 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

将自签名证书与 .NET 的 HttpWebRequest/Response 一起使用

如何将自签名证书与 XAMPP 一起用于使用 cURL 的 HTTPS 请求?

如何将自签名证书正确导入默认情况下可供所有 Java 应用程序使用的 Java 密钥库?

iOS 和 SSL:无法验证自签名服务器证书

Android Volley Self签名证书

将自签名证书添加到iphone Simulator?