使用Ajax通过https访问带有自签名证书的本地主机

我正在使用https://localhost:port上运行服务器的NodeJS应用程序,并使用自签名证书(因为没有供应商提供本地主机的证书)。 我从我的网站使用AJAX调用命中locahost并发送数据到NodeJs应用程序。 我的电话由于预期的INSECURE_CONTENT而被阻止。 我想知道我们是否有任何解决方法?

见下面的更新

解决方法是在浏览器级别启用它。 这也应该允许AJAX调用。

对于Chrome

  1. 在chrome中input这个URL( chrome:// flags /#allow-insecure-localhost )
  2. 在这里输入图像描述
  3. 点击启用。
  4. 然后,你必须重新启动你的Chrome浏览器,以便更改可能会影响。

对于Firefox

  1. 在Firefox中转到您的本地主机。 它应该告诉你警告。
  2. 点击高级
  3. 点击添加例外…
  4. 新的popup窗口将出现,点击获取证书
  5. 确认checkbox显示“永久存储此exception”
  6. 点击“确认安全例外”。 参考下面的图片。

    • 在这里输入图像描述
    • 在这里输入图像描述

更新:

根据操作的评论,更新的答案如下:

( 回复此评论 )对于这个简单的黑客是在你的节点应用程序中有一个proxy路由。 创build类似http://localhost/proxy?yourwebsites_api/getData路由。 在节点服务器代理路由将从您的url获取GET参数,并击中您的网站服务器。 并将返回相同的回应。 就像你在c#使用HttpWebRequest或HttpClient或在curl中使用PHP

local.host 127.0.0.1的条目添加到本地主机文件,以将local.host域指向127.0.0.1(仅在该机器上)
然后,您可以为local.host创build一个自签名证书,确保将其与您的nodejs应用程序一起使用,并将其添加到您计算机上的根证书存储区,这将使浏览器识别证书。
您需要local.host条目,因为您需要一个格式良好的域名作为您的自签名证书。

您可以创build一个自签名证书,如下所示:

 openssl req -x509 -nodes -days 1000 -subj '/C=US/ST=CA/L=MV/CN=local.host' -newkey rsa:2048 -keyout local.host.key -out local.host.crt 

在osx上,主机文件位于/etc/hosts c:\windows\system32\drivers\etc\hosts上的Windows上的/etc/hosts

以下是如何将证书添加到根证书存储区的方法:

OSX:
https://pubs.vmware.com/flex-1/index.jsp?topic=%2Fcom.vmware.horizo​​n.flex.admin.doc%2FGUID-9201A917-D476-40EF-B1F4-BBF14AB83D94.html

视窗:
http://www.thewindowsclub.com/manage-trusted-root-certificates-windows

更新:

Op指出,Op应用程序将被安装在消费者桌面上。

您可能会为myapp.mydomain.com生成证书,并在您需要证书后将其指向127.0.0.1。 这并不要求您将证书添加到根存储。 但是,这仍然需要您将应用程序的私钥发送给所有用户,从而损害了证书,但是更新证书也是一件痛苦的事情。 这不是一个好的解决scheme。

您可以在安装过程中生成唯一的证书,并将其安装在根存储中。 这也损害了证书,但仅限于特定的用户。 这减less了攻击向量,因为它本身的证书只能保护用户,实际上这也是charlesproxy的工作原理。

最简单的方法是获得一个ngrok账户。 Ngrok使用wildcardcerts,所以你可以在你的本地机器上运行你的服务器,但你的url启动https:// mycompany.ngrok.io

除了更像是一个真正的服务器(url可以忽略端口),ngrok控制面板可以让你的回放信息(例如,表单发布服务器端的东西;修复你的服务器端代码,并从ngrok控制面板重新播放,所以你不必再次填写表格)

如果您想分享正在进行的工作,Ngrok也非常棒。 ngrok创build的隧道向公众开放(除非您使用密码保护)

每年60美元的自己的域名。 免费,如果你想使用像https://ba615d46.ngrok.io随机域

首先,你没有提供任何代码。 它是一个快速应用程序? 如果是这样,这可能会有所帮助。

 import express from 'express' const app = express() app.enable('trust proxy') app.use((request, response, next) => { if (this.request.headers['x-forwarded-proto'] !== 'https') { return response.redirect(`https://${request.headers.host}${request.url}`) } return next() }) const server = app.listen(process.env.port || 5000, function() { console.log('Server running at http://0.0.0.0:' + server.address().port) }) 
 <div id="output"></div> <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script> <script type="text/babel"> const getMessage = () => "Hello World"; document.getElementById('output').innerHTML = getMessage(); </script>