您可以使用带有自签名证书的服务人员吗?


71

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

很好,但是我有一个服务人员,该服务人员抛出了错误 navigator.serviceWorker.register

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

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


@Tom这些是内部测试系统,没有预算购买有效的系统。
基思

4
买?如果不是通配符,则可以免费使用let加密:letsencrypt.org-
汤姆(Tom),

8
如果只是为了测试,则可以使用标记使用http启动浏览器:chrome --unsafely-treat-insecure-origin-as-secure
psimyn

4
@psimyn欢呼,这很有用。是否有等效的移动设备测试?
基思

4
而且,对于从Internet无法访问的仅限内部使用的系统,LetsEncrypt也不适用。
杰克逊

Answers:


46

作为使用自签名证书的替代方法,您可以启动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开始工作。

可以在这里找到更多信息: 通过HTTP测试服务人员的选项

编辑:更改--unsafety-...--unsafely-...


16
注意:--allow-insecure-localhost本地开发时,该标志也很有用
vine77

1
我这样尝试过,但仍然收到相同的错误:./chrome --unsafely-treat-insecure-origin-as-secure = 192.168.120.49:3000。我也尝试使用指定的目录。请抓狂
数学'18

1
服务人员的调试说明如下:chromium.org/blink/serviceworker/service-worker-faq
Mathias S

1
答案是不是?不允许自签名证书吗?
user798719

2
@ phil294,如果可以显式安装证书,则应该可以。我正在制作仅应在本地网络上使用的网页。这些设备可以由我准备,也可以由普通用户使用。设备甚至不应该具有互联网连接。在这种情况下,证书颁发机构如何提供帮助?我应该能够安装我想要的任何证书。
sanderd17'2

14

上面接受的答案对我不起作用。我在@ stef52所建议的问题中添加了--ignore-certificate-errors这个问题,它与Service Worker注册有关,并且有效

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
ignore-certificate-errors在chrome:// flags中找不到该标志。知道为什么?
科迪

7

对我而言,使用最新的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证书面板 在上述面板上,选择“ certificates”,然后将打开右侧的窗口。

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

您应该以诸如localhost.cer桌面上的文件结尾。

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

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

所有项目

双击右侧面板上的“ localhost”,然后将打开以下窗口

窗口

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

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


6

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

  • 创建您的证书并提供服务
  • 导航到https网址
  • 打开开发工具>安全>查看证书
  • 将证书图标拖到桌面上,然后双击它,这将打开钥匙串访问。
  • 拖动证书图标以登录,打开登录并双击证书(应使用dev域或类似名称命名),打开信任下拉列表并选择始终信任。返回您的应用程序,关闭窗口并使用https重新打开,现在您的开发人员域应使用“ faux” https。

对于本地开发,您可以只使用localhost,而服务人员不需要任何类型的证书
user798719 '18的

不适用于Chrome 58+的受信任的自签名证书
Ozil

@Ozil,我删除了我的证书并执行了上述操作,它在OSX Chrome 67上正常运行。此外,您信任操作系统中的证书,而不是chrome中的证书。您正在使用什么设置? letsencrypt.org/docs/certificates-for-localhost
Lesbaa

@ user798719该问题未指定桌面。如何将Web服务器安装到iPod touch,iPhone或iPad上以执行本地主机测试?
Damian Yerrick

2

这个答案重复了一些丘克斯的观点。

如果特定的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/


1

对我而言,忽略证书或为移动设备设置不安全的来源标志不起作用。

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


1

对于No such file or directory尝试@Chucks接受的答案后遇到错误的人,请尝试以下方法,

/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

可以在此链接上找到更多信息

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.