您可以使用带有自签名证书的服务工作者吗?
Can you use a service worker with a self-signed certificate?
我有用于测试的开发服务器。他们有 SSL 自签名证书,这使我们能够通过 HTTPS 测试 Web 应用程序,但带有明显的警告,表明证书不可验证。
没关系,但我有一个 Service Worker 抛出 navigator.serviceWorker.register
错误
SecurityError: Failed to register a ServiceWorker: An SSL certificate error occurred when fetching the script.
如何将 Service Worker 与具有自签名证书的内网测试服务器一起使用?
作为使用自签名证书的替代方法,您可以启动 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 开始工作。
可在此处找到更多信息:
编辑:将 --unsafety-...
更改为 --unsafely-...
对于本地开发,我们使用自签名证书。解决 OSX 上与本地开发相关的问题。我们做了以下事情:
- 创建您的证书并提供它
- 导航到 https url
- 打开开发工具 > 安全 > 查看证书
- 将证书图标拖到桌面并双击它,这将打开钥匙串访问。
- 将证书图标拖动到登录,打开登录并双击证书(它应该以开发域或类似名称命名)
打开信任下拉列表,select 总是信任。返回您的应用,关闭 window 并使用 https 重新打开,您现在应该有 'faux' https 用于您的开发域。
上面接受的答案对我不起作用。我按照 @stef52 针对此问题 Error with Service Worker registration 的建议向其中添加了 --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
对我来说,忽略证书或为移动设备设置不安全来源标志都不起作用。
但是,端口转发成功了。 Service workers 被允许在本地主机上 运行 无论它是否使用证书签名并通过 SSL 通信,所以基本上你让你的移动设备认为它在本地主机上 运行 但实际上你正在将它转发到服务器机器上的真实本地主机。这可以通过以下两种方法中的每一种来实现:
- 使用本机 chrome 开发工具转发:
- 使用 ADB:
这个答案重复了查克斯的一些观点。
如果在本地某个地址端口发生特定的 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/
对于那些在尝试@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
上找到更多信息
我正在研究最新的 Chrome 可用 v.79。以下适用于 OS X.
创建新证书 -
仅当您的默认证书已过期时才需要,如果安装 apache 已经很长时间了,则可能是这种情况。
中的以下代码片段为本地主机创建一个新证书
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"
然后重启服务器
让您的计算机信任您的自签名证书
单击 URL 左侧的挂锁图标,同时 https://localhost 打开
在所述面板上,选择'certificates',右侧的window将打开。
Select 本地主机,然后在 'details' 上方的大图标上,将图标拖到您的桌面。
您最终应该会在桌面上看到 localhost.cer
等文件。
双击此文件或右键单击 -> 使用钥匙串访问打开
Select 类别 'All items' 和名称为 'localhost' 的证书应出现在右侧面板上。
双击右侧面板上的 'localhost' 应该会打开下面的 window
展开'trust'并在'when using this certificate'下select'always trust'
关闭window。现在应该信任此证书。
是的,在 Firefox 83/84 上没问题。这在 Chrome 87/88 上对我不起作用,所以我换了。
您不需要 public IP、FDQN、ssl 证书、and/or 繁琐的设置来进行基本的 Web 开发。
最终,我为开发中的应用程序关闭了 PWA。
Pasi Matalamäki 和 Lesbaa 的回答是最正确的。我将解释原因并讨论这些概念。
是的,您可能能够以忽略来自开发站点的证书错误的模式启动 chrome - 即使您今天可以这样做,我的钱说将来会改变.因此,我不会在2021年走那条路。
问题的症结在于,浏览器很难将 PWA 和 serviceworkers 的力量交到开发人员手中,同时让这些东西远离黑帽黑客——或者至少让几乎不可能有人设置所有浏览器都会信任并让 运行.
的恶意 PWA
当你从那个角度思考问题时,正确的解决方案就很清楚了。您需要一个开发环境,为您的 PWA 提供浏览器信任的证书。
让我说,作为一名开发人员和一名从业数十年的基础设施专业人士,这也让我感到难过。但它不应该。
我看到很多评论说您不需要 public IP 和 SSL 证书来进行基本的 Web 开发。我同意。但公平地说,开发 PWA 和服务工作者并不是基本的 Web 开发——正如我之前所说,它是必须保护的强大 Web 开发。
此外,您不需要 public IP,也不需要购买证书 -- 不适用于单独的开发人员或公司的企业开发商店。
无论如何,您必须获得由您的浏览器信任的 CA 生成的证书。在公司内部网络和开发内部应用程序的背景下,您的基础设施团队很可能已经拥有公司所有内部 PC 信任的 CA,因此您将完全锁定浏览器。您只需要找出如何获得他们生成的证书,然后该证书就是您与 http 服务器一起使用的证书或您用来提供服务的任何证书。
对于不属于公司的开发人员,您只需创建自己的 CA,然后使用该 CA 生成证书。这里有许多很好的指南之一:https://www.ibm.com/docs/en/runbook-automation?topic=certificate-generate-root-ca-key
但是,您接下来必须做一件重要的事情 -- 您必须将该 CA 安装到您的 OS 中,以便您的 OS 将其视为受信任的第三方 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/CRTs 输出的工具的格式与您 OS 期望的格式不同。如果您发现这是您的情况,有很多文章可以告诉您如何将证书转换为各种格式。
现在,一些读者可能会想“但是我如何才能让它为我的整个团队工作,等等”。答案是,你真的不能。除非你的团队在公司网络上,所有 PC 都受到管理并且已经设置为信任公司 CA 等。因此,如果这是你的用例,只需找到拥有内部 SSL 服务的基础架构团队并进行讨论。
虽然看起来 PITA 必须经历所有这些,但请再次考虑如果您可以通过某种方式让其他 PC 信任您的证书,那将是多么危险。
好消息是,当开发完成并部署时,您最终会得到一个 public IP 和一个与该 IP 绑定的证书等。所以这真的只是一个开发环境问题。
嗯,我想如果您的应用程序位于公司网络上并且只能在内部访问,则不会。在那种情况下,您只需从同一基础架构团队获得生产证书。
是的,您可以在 chrome 浏览器中使用 self-signed SSL 作为本地主机。
起初,chrome 不允许 self-signed SSL 本地服务器,但您可以通过以下方式启用它:
- 在新标签页的搜索栏中输入
Chrome://flags
- 现在在 Chrome 内标记搜索允许从本地主机加载资源的无效证书。并启用它。
我有用于测试的开发服务器。他们有 SSL 自签名证书,这使我们能够通过 HTTPS 测试 Web 应用程序,但带有明显的警告,表明证书不可验证。
没关系,但我有一个 Service Worker 抛出 navigator.serviceWorker.register
SecurityError: Failed to register a ServiceWorker: An SSL certificate error occurred when fetching the script.
如何将 Service Worker 与具有自签名证书的内网测试服务器一起使用?
作为使用自签名证书的替代方法,您可以启动 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 开始工作。
可在此处找到更多信息:
编辑:将 --unsafety-...
更改为 --unsafely-...
对于本地开发,我们使用自签名证书。解决 OSX 上与本地开发相关的问题。我们做了以下事情:
- 创建您的证书并提供它
- 导航到 https url
- 打开开发工具 > 安全 > 查看证书
- 将证书图标拖到桌面并双击它,这将打开钥匙串访问。
- 将证书图标拖动到登录,打开登录并双击证书(它应该以开发域或类似名称命名) 打开信任下拉列表,select 总是信任。返回您的应用,关闭 window 并使用 https 重新打开,您现在应该有 'faux' https 用于您的开发域。
上面接受的答案对我不起作用。我按照 @stef52 针对此问题 Error with Service Worker registration 的建议向其中添加了 --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
对我来说,忽略证书或为移动设备设置不安全来源标志都不起作用。
但是,端口转发成功了。 Service workers 被允许在本地主机上 运行 无论它是否使用证书签名并通过 SSL 通信,所以基本上你让你的移动设备认为它在本地主机上 运行 但实际上你正在将它转发到服务器机器上的真实本地主机。这可以通过以下两种方法中的每一种来实现:
- 使用本机 chrome 开发工具转发:
- 使用 ADB:
这个答案重复了查克斯的一些观点。
如果在本地某个地址端口发生特定的 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/
对于那些在尝试@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
上找到更多信息我正在研究最新的 Chrome 可用 v.79。以下适用于 OS X.
创建新证书 - 仅当您的默认证书已过期时才需要,如果安装 apache 已经很长时间了,则可能是这种情况。
中的以下代码片段为本地主机创建一个新证书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"
然后重启服务器
让您的计算机信任您的自签名证书
单击 URL 左侧的挂锁图标,同时 https://localhost 打开
Select 本地主机,然后在 'details' 上方的大图标上,将图标拖到您的桌面。
您最终应该会在桌面上看到 localhost.cer
等文件。
双击此文件或右键单击 -> 使用钥匙串访问打开
Select 类别 'All items' 和名称为 'localhost' 的证书应出现在右侧面板上。
双击右侧面板上的 'localhost' 应该会打开下面的 window
展开'trust'并在'when using this certificate'下select'always trust'
关闭window。现在应该信任此证书。
是的,在 Firefox 83/84 上没问题。这在 Chrome 87/88 上对我不起作用,所以我换了。
您不需要 public IP、FDQN、ssl 证书、and/or 繁琐的设置来进行基本的 Web 开发。
最终,我为开发中的应用程序关闭了 PWA。
Pasi Matalamäki 和 Lesbaa 的回答是最正确的。我将解释原因并讨论这些概念。
是的,您可能能够以忽略来自开发站点的证书错误的模式启动 chrome - 即使您今天可以这样做,我的钱说将来会改变.因此,我不会在2021年走那条路。
问题的症结在于,浏览器很难将 PWA 和 serviceworkers 的力量交到开发人员手中,同时让这些东西远离黑帽黑客——或者至少让几乎不可能有人设置所有浏览器都会信任并让 运行.
的恶意 PWA当你从那个角度思考问题时,正确的解决方案就很清楚了。您需要一个开发环境,为您的 PWA 提供浏览器信任的证书。
让我说,作为一名开发人员和一名从业数十年的基础设施专业人士,这也让我感到难过。但它不应该。
我看到很多评论说您不需要 public IP 和 SSL 证书来进行基本的 Web 开发。我同意。但公平地说,开发 PWA 和服务工作者并不是基本的 Web 开发——正如我之前所说,它是必须保护的强大 Web 开发。
此外,您不需要 public IP,也不需要购买证书 -- 不适用于单独的开发人员或公司的企业开发商店。
无论如何,您必须获得由您的浏览器信任的 CA 生成的证书。在公司内部网络和开发内部应用程序的背景下,您的基础设施团队很可能已经拥有公司所有内部 PC 信任的 CA,因此您将完全锁定浏览器。您只需要找出如何获得他们生成的证书,然后该证书就是您与 http 服务器一起使用的证书或您用来提供服务的任何证书。
对于不属于公司的开发人员,您只需创建自己的 CA,然后使用该 CA 生成证书。这里有许多很好的指南之一:https://www.ibm.com/docs/en/runbook-automation?topic=certificate-generate-root-ca-key
但是,您接下来必须做一件重要的事情 -- 您必须将该 CA 安装到您的 OS 中,以便您的 OS 将其视为受信任的第三方 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/CRTs 输出的工具的格式与您 OS 期望的格式不同。如果您发现这是您的情况,有很多文章可以告诉您如何将证书转换为各种格式。
现在,一些读者可能会想“但是我如何才能让它为我的整个团队工作,等等”。答案是,你真的不能。除非你的团队在公司网络上,所有 PC 都受到管理并且已经设置为信任公司 CA 等。因此,如果这是你的用例,只需找到拥有内部 SSL 服务的基础架构团队并进行讨论。
虽然看起来 PITA 必须经历所有这些,但请再次考虑如果您可以通过某种方式让其他 PC 信任您的证书,那将是多么危险。
好消息是,当开发完成并部署时,您最终会得到一个 public IP 和一个与该 IP 绑定的证书等。所以这真的只是一个开发环境问题。
嗯,我想如果您的应用程序位于公司网络上并且只能在内部访问,则不会。在那种情况下,您只需从同一基础架构团队获得生产证书。
是的,您可以在 chrome 浏览器中使用 self-signed SSL 作为本地主机。
起初,chrome 不允许 self-signed SSL 本地服务器,但您可以通过以下方式启用它:
- 在新标签页的搜索栏中输入
Chrome://flags
- 现在在 Chrome 内标记搜索允许从本地主机加载资源的无效证书。并启用它。