我正在开发一些使用https
服务器的Node.js应用程序。在我开发它们时,我使用自签名证书在localhost
上运行它们。基本上,一切都有效,但我有两个问题:
当我第一次将浏览器指向https://localhost:3000
时,它会警告我有关不受信任的证书。当然,这是真实的(也是重要的),但是在开发过程中它是正确的。当然,我可以将证书添加为可信证书,但它们会不时更改,我不想让证书库混乱。
有时我忘记将https
部分输入地址栏,因此Chrome会尝试使用http
加载网站。无论出于何种原因,Chrome都没有意识到没有网络服务器响应http
请求,而是加载和加载并加载...
我想要解决这两个问题的方法是创建一个位于地址栏旁边的Chrome扩展程序,并提供一个按钮,您可以使用该按钮切换其状态:
localhost
发送了请求(并且只有!),它将执行以下两项操作:
http
,但几秒钟后网页仍为pending
,则会尝试使用https
。明确说明:这些规则仅适用于localhost
。
所以,现在我的问题是:
答案 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());