主持人:localhost。不在证书的替代名称中

时间:2017-02-09 10:09:23

标签: node.js reactjs ssl-certificate graphql react-apollo

我在进行服务器端渲染时遇到错误。

RENDERING ERROR: { [Error: Network error: request to https://api-dev.xyz.io/graphql failed, reason: Hostname/IP doesn't match certificate's altnames: "Host: localhost. is not in the cert's altnames: DNS:*.xyz.io"]
  graphQLErrors: null,
  networkError: 
   { [FetchError: request to https://api-dev.xyz.io/graphql failed, reason: Hostname/IP doesn't match certificate's altnames: "Host: localhost. is not in the cert's altnames: DNS:*.xyz.io"]
     name: 'FetchError',
     message: 'request to https://api-dev.xyz.io/graphql failed, reason: Hostname/IP doesn\'t match certificate\'s altnames: "Host: localhost. is not in the cert\'s altnames: DNS:*.xyz.io"',
     type: 'system',
     errno: undefined,
     code: undefined },
  message: 'Network error: request to https://api-dev.xyz.io/graphql failed, reason: Hostname/IP doesn\'t match certificate\'s altnames: "Host: localhost. is not in the cert\'s altnames: DNS:*.xyz.io"',
  extraInfo: undefined }

注意: - 我使用的是react,readux,apollo-client(GraphQL)和ExpressJS(NodeJS)。我要求的API服务器在其他域上,我无法对其进行任何更改。

在使用客户端渲染时,我没有遇到任何困难,一切都按预期工作,但在服务器端渲染时,我遇到了错误。

所以我在服务器上尝试了以下方法,但仍然没有运气。

  1. 添加自签名证书
  2. 在https选项中添加' rejectUnauthorized':false。

    const options = {
      'key': key,
      'cert': cert,
      'ca': [ fs.readFileSync('local-certificate.pem') ],
      'rejectUnauthorized':false
    };
    
    https.createServer(options, app).listen(httpsPort, '0.0.0.0', function onStart(err) {
      if (err) { console.log(err); }
      console.info('==> Listening on httpsPort %s. Open up http://0.0.0.0:%s/ in your browser.', httpsPort, options);
    });
    
  3. 我还尝试在How can I generate a self-signed certificate with SubjectAltName using OpenSSL?的帮助下在我的自签名证书中添加altname

  4. 有没有办法绕过证书验证,以便我的快递服务器可以向另一个拥有有效证书的域上的API服务器发出请求。

    我仍然不确定是否可以通过在我的快递服务器上进行任何更改来修复。

    请告诉我对此的任何见解。

2 个答案:

答案 0 :(得分:0)

主机名是NodeJS下面的系统级设置。您需要有权访问运行 NodeJS 副本的机器/虚拟机。

答案 1 :(得分:0)

错误消息表明 https://api-dev.xyz.io/graphql 处的服务器认为传入请求正被定向到 https://localhost/graphql。因此,它失败了,因为 SSL 证书没有保护 https://localhost/。

您的服务器端渲染是否会尝试对正在执行服务器端渲染以加载渲染的初始数据的同一服务器执行提取/API 调用?如果是这样,是否可以将客户端需要从 API 中获取的初始数据直接传递给服务器端渲染,而不是 React 在服务器端渲染中尝试执行对自身的 API 调用?

也许 this tutorial 可以用作示例参考。