在AWS中-具有SSL证书的子域在RESTful调用中不起作用

时间:2019-12-31 03:39:36

标签: amazon-web-services ssl https amazon-elastic-beanstalk subdomain

我有一个AWS Amplify实例来启动我拥有的REACT应用程序。它还具有SSL证书,因此我可以通过输入以下内容在浏览器上访问该应用: https://myreactapp.com(不是我的真实应用网址,仅是示例)

我有一个在没有SSL证书的Elastic Beanstalk实例上运行的Web servlet,并且我的REACT应用程序通过以下代码段与之交互:

    var myObject = {
        data1: this.state.data1,
        data2: this.state.data2
    }


    $.ajax({
        type: "POST",
        url: 'http://<my-backend-webservices-app>.us-east-1.elasticbeanstalk.com/doSomething', // works only from React app when running on local machine (http://localhost:3000), not from https url
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',
        data: myObject,
        success: function(response) {
          console.log('success -- ' + response);  
        },
        function(errMsg) {
            alert('Major Error');
        }
    }); 

此代码运行良好,当我在计算机上本地运行React App时,我从 my-backend-webservices-app 获得了响应。因为当我在本地使用它时,react应用程序位于http://localhost:3000上(注意它不是https),并且它与也在http上的Elastic Beanstalk实例通信。

但是,当我从带有SSL证书的AWS Amplify运行我的React应用程序时,它抱怨来自HTTPS的RESTFul请求无法与http url通信。这是来自浏览器的错误:

  

jquery.js:8676混合内容:位于的页面   'https://master。<.....>。amplify <...>。com /已通过HTTPS加载,   但请求了不安全的XMLHttpRequest端点   'http://.us-east-1.elasticbeanstalk.com/doSomething'。   该请求已被阻止;内容必须通过HTTPS提供。

所以我想解决的问题是向我的ElasticBeanStalk实例添加一个SSL证书。因此,首先我创建了一个子域 services.myreactapp.com ,其中主域是 myreactapp.com ,然后我分配了我的ElasticBeanstalk实例(其中my-backend-webservices-app是)到该 services.myreactapp.com 子域。

然后,我进入了AWS的证书管理器服务页面,并请求将公共证书分配给services.myreactapp.com子域。

所以现在我将上面代码片段的URL更新为使用https而不是http:

        url: 'https://<my-backend-webservices-app>.us-east-1.elasticbeanstalk.com/doSomething',

但是现在,只要我的来自https的React应用向后端servlet发出请求,它就会挂起。

有什么想法我想念的吗?

2 个答案:

答案 0 :(得分:0)

转到AWS路线53,在DNS管理中创建指向您的beantalk URL的CNAM DNS记录,例如-

services.myreactapp.com -> xyz.us-east-1.elasticbeanstalk.com

然后在您的React应用中使用services.myreactapp.com作为URL。同样,在执行此操作之前,请确保您能够访问https://services.myreactapp.com的后端,然后可以检查运行状况API(如果有)进行测试。注意-这可能需要一些时间才能使services.myreactapp.com生效。

答案 1 :(得分:0)

这里没有什么要强调的。

关于ACM颁发的证书

  • 首先,如果您从证书管理器请求证书,则该证书不会自动应用于您的任何应用程序,您需要将该证书应用于您的应用程序。

使用带有Elasticbeanstalk的ACM颁发的证书

如果您不使用负载均衡器(单个实例)

subdomain.example.com指向Elasticbeanstalk的DNS名称

  • 一旦您在负载均衡器上启用了SSL或配置了单个实例以通过ssl为您的应用程序提供服务,就可以创建A记录以将services.myreactapp.com指向您的Elasticbeanstalk dns名称。确保在创建Yes记录时选择别名A

使用前端应用程序中的新DNS名称

最后,您可以在前端应用程序中使用subdomain.mydomain.com而不是elasticbeanstalk dns名称。

希望这会有所帮助,祝你好运。