您是否可以使用具有自签名证书的服务工作者?

时间:2016-08-02 18:41:55

标签: ssl https self-signed service-worker

我有用于测试的开发人员服务器。它们具有SSL自签名证书,允许我们通过HTTPS测试Web应用程序,但有明显的警告证明证书不可验证。

没关系,但我有一个服务工作者会在navigator.serviceWorker.register

时抛出错误
  

SecurityError:无法注册ServiceWorker:获取脚本时发生SSL证书错误。

如何将Service Worker与具有自签名证书的Intranet测试服务器一起使用?

9 个答案:

答案 0 :(得分:22)

作为使用自签名证书的替代方法,您可以启动Chrome或Firefox,以便假装某些域是安全的。例如,在Mac上使用Chrome,您可以使用以下命令启动它:

/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ --user-data-dir=/tmp/foo --unsafely-treat-insecure-origin-as-secure=http://www.your.site

然后,服务人员应该从http://www.your.site开始工作。

更多信息可以在这里找到: Options for testing service workers via HTTP

修改:将--unsafety-...更改为--unsafely-...

答案 1 :(得分:3)

上面接受的答案对我不起作用。我在此问题Error with Service Worker registration的@ stef52所建议的错误中添加了--ignore-certificate-errors,并且有效

chrome.exe --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost/
对于MAC用户

 ./Google\ Chrome --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost

答案 2 :(得分:2)

对于本地开发,我们使用自签名证书。克服OSX上与本地开发相关的问题。我们做了以下事情:

  • 创建证书并提供服务
  • 导航至https网址
  • 打开开发工具>安全>查看证书
  • 将证书图标拖到桌面上并双击它,这将打开钥匙串访问权。
  • 将证书图标拖到登录状态,打开登录并双击证书(应该使用dev域或类似命名) 打开信任下拉列表并选择始终信任。回到你的应用程序关闭窗口,并使用https重新打开,你现在应该有' faux' https for your dev domain。

答案 3 :(得分:1)

此答案重复了一些Chucks的观点。

如果特定的DomException发生在某个地址端口的本地,则在访问本地计算机上的Web资源时,这些最新版本的浏览器启动之一可能有助于:

open -a Opera.app --args --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost:8111

open -a Brave\ Browser.app --args --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost:8111

open -a Google\ Chrome.app --args --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost:8111

Chromium浏览器未从这些设置开始,以允许克服此特定的DomException以便在本地将SSL与Service Worker一起使用。

此人也提供了有关此事的一些见解:https://deanhume.com/testing-service-workers-locally-with-self-signed-certificates/

答案 4 :(得分:1)

是的,在 Firefox 83/84 上没问题。这在 Chrome 87/88 上对我不起作用,所以我换了。

您不应该需要公共 IP、FDQN、ssl 证书和/或繁琐的设置来进行基本的 Web 开发。

最终,我为正在开发的应用程序关闭了 PWA。

答案 5 :(得分:0)

对我来说,忽略证书或为移动设备设置不安全的来源标记都无效。

但是,portforwarding可以解决问题。无论服务工作人员是否通过证书进行签名并通过SSL进行通信,都允许其在localhost上运行,因此基本上让您的移动设备认为它在localhost上运行,但实际上是将其转发到服务器计算机上的真实localhost。这可以通过以下两种方法来实现:

答案 6 :(得分:0)

对于尝试@Chucks接受答案后遇到错误No such file or directory的用户,请尝试以下操作,

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=/tmp/foo --ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure=https://localhost:1123

更多信息,请访问this link

答案 7 :(得分:0)

对于我来说,我正在使用最新的Chrome浏览器v.79。以下在OS X上有效。

创建新证书- 仅必需。如果自您的apache安装以来已经过了很长时间,则默认证书已过期。

使用letsencrypt.org

中的以下代码段为本地主机创建新证书
openssl req -x509 -out server.crt -keyout server.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

通过放置创建的.crt和.key启用新创建的证书 在/usr/local/etc/httpd中或您的证书可能位于的任何位置。

server.key / server.crt应该是证书的默认名称,但是如果您进行了更改,最好检查一下/usr/local/etc/httpd/extra/httpd-ssl.conf上的配置

以下几行是有意义的:

SSLCertificateFile "/usr/local/etc/httpd/server.crt"
SSLCertificateKeyFile "/usr/local/etc/httpd/server.key"

然后重新启动服务器

使您的计算机信任您的自签名证书

https://localhost打开的情况下,单击URL左侧的挂锁图标。 Chrome certificate panel 在上述面板上,选择“证书”,然后将打开右侧的窗口。

选择localhost,然后在“详细信息”上方的大图标上,将其拖到您的桌面上。

您最终应该在桌面上看到localhost.cer之类的文件。

双击该文件或右键单击->使用钥匙串访问权限打开

选择类别“所有项目”,并且名称为“本地主机”的证书应显示在右侧面板上。

All items

双击右侧面板上的“本地主机”,然后会打开以下窗口

Window

展开“信任”,然后在“使用此证书时”下选择“始终信任”

关闭窗口。现在该证书应该是受信任的。

答案 8 :(得分:0)

Pasi Matalamäki 和 Lesbaa 的回答是最正确的。我将解释原因并讨论概念。

是的,您可能能够以忽略来自您网站的证书错误的模式启动 chrome - 即使您今天可以这样做,我的钱说将来会发生变化。因此,我不会在 2021 年走那条路。

问题的症结在于,浏览器很难将 PWA 和 serviceworker 的力量交到开发人员手中,同时让这些东西远离黑帽黑客——或者至少实际上是做到这一点有人不可能设置所有浏览器都信任并让其运行的恶意 PWA。

当您从这个角度思考问题时,正确的解决方案就很明确了。您需要一个开发环境,在该环境中为您的 PWA 提供浏览器信任的证书。

让我说,作为一名开发人员和数十年的基础设施专业人士,这也难倒了我。但它不应该有。

我看到很多评论说您不需要公共 IP 和 SSL 证书来进行基本的 Web 开发。我同意。但公平地说,开发 PWA 和 Service Worker 并不是基本的 Web 开发——正如我之前所说,它是必须确保安全的强大 Web 开发。

此外,您不需要公共 IP,也不需要购买证书 - 不需要单独的开发人员或公司的企业开发商店。

无论如何,您必须获得由您的浏览器信任的 CA 生成的证书。在公司内部网络和开发内部应用程序的上下文中,您的基础架构团队很可能已经拥有一个 CA,您公司的所有内部 PC 都信任该 CA,因此您将完全锁定浏览器。您只需要了解如何获取由他们生成的证书,然后该证书就是您与 http-server 或用于提供它的任何东西一起使用的证书。

在不属于公司的开发人员的上下文中,您只需创建自己的 CA,然后使用该 CA 生成证书。以下是有关这样做的众多优秀指南之一:https://www.ibm.com/docs/en/runbook-automation?topic=certificate-generate-root-ca-key

但是,接下来您必须做一件重要的事情——您必须将该 CA 安装到您的操作系统中,以便您的操作系统将其视为受信任的第三方 CA。如何在 Windows 和 MacOS 上执行此操作:https://smallbusiness.chron.com/make-computer-trust-certificate-authority-57649.html

在 Linux 上,这里有一个关于如何在一种流行风格上做到这一点的好帖子:https://superuser.com/questions/437330/how-do-you-add-a-certificate-authority-ca-to-ubuntu

请注意,您可能不必这样做,但我还将使用 CA 生成的证书安装到我的主机上。可能没有必要。

您可能会遇到问题,因为您用来生成 CA/CRT 输出的工具与您的操作系统期望的格式不同。如果您发现这是您的情况,有很多文章可以告诉您如何将证书转换为各种格式。

现在,一些读者可能会想“但是我如何让整个团队使用它,等等”。答案是,你真的不能。除非您的团队在企业网络上,并且所有 PC 都受到管理并且已经设置为信任企业 CA 等。同样,如果这是您的用例,只需找到拥有内部 SSL 服务的基础架构团队并进行讨论。

虽然 PITA 似乎必须经历所有这些,但再想想如果您能以某种方式让其他 PC 信任您的证书会有多危险。

好消息是,当开发完成并且需要部署时,您最终会得到一个公共 IP 和一个与该 IP 相关的证书等等。所以这实际上只是一个开发环境问题。

好吧,我想不是在您的应用程序位于公司网络上并且只能在内部访问的情况下。在这种情况下,您只需从同一个基础架构团队获得生产证书。