使用来自Android应用的自签名证书访问服务器上运行的REST API

时间:2019-03-19 23:32:10

标签: android rest api ssl https

我正在使用与我的服务器上的REST API通信的android应用程序,该应用程序是自签名的。我的API使用框架回送在节点上运行。

现在,我的API不安全,因此我可以从android应用发送请求,并且效果很好。只有我的域受保护。 API在端口3000上运行。现在,问题来了。

我已经创建了一个用于重置密码的网络表单,因此当用户在应用程序中并想要重置其帐户的密码时,他会收到电子邮件。他可以在应用程序或浏览器中打开带有重置链接的电子邮件。

1。情况

当用户在浏览器中打开重置链接时,他在HTTPS URL上。当他输入新密码并点击按钮更改密码时,他正在从HTTPS向HTTP上的不安全API发送请求。

这给了我错误:

The page at xxx was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint xxx. This request has been blocked; the content must be served over HTTPS.

这是我的功能:

function post() {
    const urlParams = new URLSearchParams(window.location.search);
    const token = urlParams.get('access_token');
    console.log("TOKEN:", token);
    const user = {
        newPassword: document.querySelector('#input-password-check').value,
    }
    const http = new XMLHttpRequest()
    http.open('POST', 'http://www.example.com:3000/api_path/reset-password')
    http.setRequestHeader('x-access-token', token)
    http.send(JSON.stringify(user)) 
    http.onload = function() {

        alert(http.responseText)
    }
}

2。情况

当我保护我的API时,我的域和API均为HTTPS,我可以从Web重置密码,但是当我发送请求时,我得到ERR_CERT_AUTHORITY_INVALID。而且还来自android APP,因为它不信任我的证书。而且我找不到解决方案,如何使我的应用程序信任它。

我还应该说我是从url解析令牌,并且在应用程序中重置密码时,该令牌在标头中发送,并且我在Java中从我的应用程序发送请求...不打开网站。一切都通过retrofix + rxjava完成。

任何想法如何解决这个问题?我不想绕开它,我想做正确的事,但也不想为受信任的SSL证书付费...

1 个答案:

答案 0 :(得分:0)

我能够通过使用Lets Encrypt证书解决此问题。以前,我已经在服务器上安装了Encrypt,但是我为Loopback API创建了新的自签名证书,这很愚蠢,我不知道自己在做什么。

因此,不要忘记将回送api的证书路径设置为“让我们加密”。