使用Chrome扩展程序将http重定向到https

时间:2013-10-31 08:03:28

标签: google-chrome ssl google-chrome-extension https localhost

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

  1. 当我第一次将浏览器指向https://localhost:3000时,它会警告我有关不受信任的证书。当然,这是真实的(也是重要的),但是在开发过程中它是正确的。当然,我可以将证书添加为可信证书,但它们会不时更改,我不想让证书库混乱。

  2. 有时我忘记将https部分输入地址栏,因此Chrome会尝试使用http加载网站。无论出于何种原因,Chrome都没有意识到没有网络服务器响应http请求,而是加载和加载并加载...

  3. 我想要解决这两个问题的方法是创建一个位于地址栏旁边的Chrome扩展程序,并提供一个按钮,您可以使用该按钮切换其状态:

    • 如果扩展程序被禁用,则它什么都不做。
    • 如果启用了扩展程序,并且您向localhost发送了请求(并且只有!),它将执行以下两项操作:
      1. 如果请求使用http,但几秒钟后网页仍为pending,则会尝试使用https
      2. 暂时接受任何证书,无论是否受到浏览器的信任。

    明确说明:这些规则仅适用于localhost

    所以,现在我的问题是:

    • 是否可以使用Chrome扩展程序?
    • 由于我完全没有编写Chrome扩展程序的经验,这将是一个很好的起点,我应该在Google上寻找哪些条款?

1 个答案:

答案 0 :(得分:5)

Google Chrome Extensions Documentation 是一个很好的起点。您使用Chrome扩展程序之外的所有内容都可以使用“证书接受”部分。 (我不是说这是不可能的,我只是不知道是不是 - 但如果是的话,我会非常感到惊讶(和关心)。)

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

如果您决定实施其余功能,我建议您首先查看 chrome.tabs 和/或 chrome.webRequest 。 (我还要提及“内容脚本”不太可能有用。)


那就是说,下面是一些演示扩展的代码(只是为了让你入门)。

做什么:
停用时 - >什么
激活时 - >收听定位到http://localhost[:PORT][/...]等网址的标签,并将其重定向到https(它不会等待响应或任何内容,只会立即重定向)。

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

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


扩展程序目录结构:

        extention-root-directory/
         |_____ manifest.json
         |_____ background.js
         |_____ img/
                 |_____ icon19.png
                 |_____ icon38.png

<强>的manifest.json:
(有关可能字段的详细信息,请参阅 here 。)

{
    "manifest_version": 2,
    "name":    "Test Extension",
    "version": "0.0",
    "default_locale": "en",
    "offline_enabled": true,
    "incognito":       "split",

    // The background-page will listen for
    // and handle various types of events
    "background": {
        "persistent": false,   // <-- if you use chrome.webRequest, 'true' is required
        "scripts": [
            "background.js"
        ]
    },

    // Will place a button next to the address-bar
    // Click to enable/disable the extension (see 'background.js')
    "browser_action": {
        "default_title": "Test Extension"
        //"default_icon": {
        //    "19": "img/icon19.png",
        //    "38": "img/icon38.png"
        //},
    },

    "permissions": [
        "tabs",                  // <-- let me manipulating tab URLs
        "http://localhost:*/*"   // <-- let me manipulate tabs with such URLs 
    ]
}

<强> background.js:
(相关文档: background pages event pages browser actions {{3} }

/* 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());