Google chrome 使用Chrome扩展将http重定向到https

Google chrome 使用Chrome扩展将http重定向到https,google-chrome,ssl,google-chrome-extension,https,localhost,Google Chrome,Ssl,Google Chrome Extension,Https,Localhost,我正在开发一些Node.js应用程序,它们使用https服务器。在开发它们时,我使用自签名证书在localhost上运行它们。基本上,一切正常,但我有两个问题: 当我将浏览器指向https://localhost:3000它第一次警告我有不可信的证书。当然,这是正确的(也是重要的),但它是在开发时注释的。当然,我可以将证书添加为受信任的证书,但它们会不时发生变化,我不想使证书存储混乱 有时我只是忘记在地址栏中输入https部分,所以Chrome尝试使用http加载网站。无论出于什么原因,Chro

我正在开发一些Node.js应用程序,它们使用
https
服务器。在开发它们时,我使用自签名证书在
localhost
上运行它们。基本上,一切正常,但我有两个问题:

  • 当我将浏览器指向
    https://localhost:3000
    它第一次警告我有不可信的证书。当然,这是正确的(也是重要的),但它是在开发时注释的。当然,我可以将证书添加为受信任的证书,但它们会不时发生变化,我不想使证书存储混乱

  • 有时我只是忘记在地址栏中输入
    https
    部分,所以Chrome尝试使用
    http
    加载网站。无论出于什么原因,Chrome都没有意识到没有响应
    http
    请求的Web服务器,而是加载、加载、加载

  • 为了解决这两个问题,我想做的是创建一个Chrome扩展,它位于地址栏旁边,并提供一个按钮,您可以使用该按钮切换其状态:

    • 如果该扩展被禁用,它将什么也不做
    • 如果扩展已启用,并且您向
      localhost
      (并且只有在那时!)发送请求,则它将执行两项操作:
    • 如果请求使用
      http
      ,但几秒钟后页面仍处于
      挂起状态
      ,则应尝试改用
      https
    • 临时接受任何证书,无论其是否受浏览器信任
    明确地说:这些规则仅对
    localhost
    有效

    所以,现在我的问题是:

    • 使用Chrome扩展就可以做到这一点吗
    • 由于我在编写Chrome扩展方面绝对没有经验,那么什么是一个好的起点呢?我应该在Google上寻找什么术语呢
      • 这是一个很好的起点。您描述的所有内容都可以使用Chrome扩展名,但“证书接受”部分除外。(我不是说这是不可能的,我只是不知道是否可能——但如果可能的话,我会感到非常惊讶(和担心)

        当然,始终存在
        --ignore certificate errors
        命令行开关,但它不会区分
        localhost
        和其他域

        如果您决定实现其余的功能,我建议您首先查看和/或。(我还要提到,“内容脚本”不太可能有任何用处。)


        也就是说,下面是一些演示扩展的代码(只是为了让您开始)

        什么是你做的:
        停用时->无任何内容
        激活时->侦听指向URL的选项卡,如
        http://localhost[:PORT][/…]
        并将它们重定向到
        https
        (它不等待响应或任何东西,它只是立即重定向它们)

        如何使用:
        单击浏览器操作图标以激活/停用

        当然,这并不完美/完整,但这是一个起点:)


        扩展目录结构:

                extention-root-directory/
                 |_____ manifest.json
                 |_____ background.js
                 |_____ img/
                         |_____ icon19.png
                         |_____ icon38.png
        
        manifest.json:
        (有关可能字段的更多信息,请参见。)

        是一个很好的起点。您描述的所有内容都可以使用Chrome扩展名,但“证书接受”部分除外。(我不是说这是不可能的,我只是不知道是否可能——但如果可能的话,我会感到非常惊讶(和担心)

        当然,始终存在
        --ignore certificate errors
        命令行开关,但它不会区分
        localhost
        和其他域

        如果您决定实现其余的功能,我建议您首先查看和/或。(我还要提到,“内容脚本”不太可能有任何用处。)


        也就是说,下面是一些演示扩展的代码(只是为了让您开始)

        什么是你做的:
        停用时->无任何内容
        激活时->侦听指向URL的选项卡,如
        http://localhost[:PORT][/…]
        并将它们重定向到
        https
        (它不等待响应或任何东西,它只是立即重定向它们)

        如何使用:
        单击浏览器操作图标以激活/停用

        当然,这并不完美/完整,但这是一个起点:)


        扩展目录结构:

                extention-root-directory/
                 |_____ manifest.json
                 |_____ background.js
                 |_____ img/
                         |_____ icon19.png
                         |_____ icon38.png
        
        manifest.json:
        (有关可能字段的更多信息,请参见。)


        这是一个很好的起点。除证书接受部分外,您描述的所有内容都可以使用Chrome扩展。(我不是说这是不可能的,我只是不知道它是否是-但如果是的话,我会非常惊讶(并担心)的。)当然,总是有
        --忽略证书错误
        命令行开关,但它不会区分localhost和其他。感谢您指出这一切,它非常有用:-)。还有一个问题:您建议使用WebRequestAPI还是简单的内容脚本?我认为内容脚本对您没有多大用处。我会去的,好的,非常感谢:-)。如果你愿意,你能把你的评论转换成答案吗?现在有一个答案我想让你们接受:这是一个很好的起点。除证书接受部分外,您描述的所有内容都可以使用Chrome扩展。(我并不是说这是不可能的,我只是不知道它是否是——但如果是的话,我会非常惊讶(并担心)的。)当然,总是有
        --ignore certificate errors
        命令行开关,但它不会区分本地主机和
        /* Configuration for the Badge to indicate "ENABLED" state */
        var enabledBadgeSpec = {
            text: " ON ",
            color: [0, 255, 0, 255]
        };
        /* Configuration for the Badge to indicate "DISABLED" state */
        var disabledBadgeSpec = {
            text: "OFF",
            color: [255, 0, 0, 100]
        };
        
        
        /* Return whether the extension is currently enabled or not */
        function isEnabled() {
            var active = localStorage.getItem("active");
            return (active && (active == "true")) ? true : false;
        }
        
        /* Store the current state (enabled/disabled) of the extension
         * (This is necessary because non-persistent background pages (event-pages)
         *  do not persist variable values in 'window') */
        function storeEnabled(enabled) {
            localStorage.setItem("active", (enabled) ? "true" : "false");
        }
        
        /* Set the state (enabled/disabled) of the extension */
        function setState(enabled) {
            var badgeSpec = (enabled) ? enabledBadgeSpec : disabledBadgeSpec;
            var ba = chrome.browserAction;
            ba.setBadgeText({ text: badgeSpec.text });
            ba.setBadgeBackgroundColor({ color: badgeSpec.color });
            storeEnabled(enabled);
            if (enabled) {
                chrome.tabs.onUpdated.addListener(localhostListener);
                console.log("Activated... :)");
            } else {
                chrome.tabs.onUpdated.removeListener(localhostListener);
                console.log("Deactivated... :(");
            }
        }
        
        /* When the URL of a tab is updated, check if the domain is 'localhost'
         * and redirect 'http' to 'https' */
        var regex = /^http(:\/\/localhost(?::[0-9]+)?(?:\/.*)?)$/i;
        function localhostListener(tabId, info, tab) {
            if (info.url && regex.test(info.url)) {
                var newURL = info.url.replace(regex, "https$1");
                chrome.tabs.update(tabId, { url: newURL });
                console.log("Tab " + tabId + " is being redirected to: " + newURL);
            }
        }
        
        /* Listen for 'browserAction.onClicked' events and toggle the state  */
        chrome.browserAction.onClicked.addListener(function() {
            setState(!isEnabled());
        });
        
        /* Initially setting the extension's state (upon load) */
        setState(isEnabled());