为什么我在 Electron 应用程序中发出 HTTPS 请求时会收到“错误:写入 EPROTO”?

问题描述 投票:0回答:2

我已经在这方面绞尽脑汁好几天了,所以我向 Stackoverflow 的聪明人寻求帮助。这是交易:

系统详情

  • Node 版本(由于 Electron 依赖而无法更改):v4.1.1
  • 电子版本:v0.34.3
  • 操作系统版本:Mac OSX Yosemite 10.10.5 (14F1021)

问题描述

我正在构建一个 Electron 应用程序,它必须与我公司的应用程序服务器进行通信。服务器连接必须通过 HTTPS。我正在使用 Node 的内置

https
模块。当向服务器发出请求时,我收到以下错误:

{ [Error: write EPROTO]
  code: 'EPROTO',
  errno: 'EPROTO',
  syscall: 'write',
  address: undefined }

我对此进行了大量的谷歌搜索,我发现的大多数内容都指向代理,但我没有使用代理。我尝试过以下方法:

  • 在选项哈希中设置
    rejectUnauthorized: false
  • 修改
    secureProtocol
    选项(无结果)
  • 尝试设置
    --tls-cipher-list
    (不知道我在那里做什么)

我可以毫无问题地通过

curl
提出请求。不幸的是,我无法发布我正在请求的实际 URL。

示例代码

这里有一些示例代码(Coffeescript)说明了这个问题:

https = require 'https'

options = {
  host: '[Application URL]'
  path: '/'
  method: 'GET'
  port: 443
}

options.agent = new https.Agent(options)

callback = (response) ->
  str = ''
  console.log response
  console.log "STATUS: #{response.statusCode}"
  console.log "HEADERS: #{JSON.stringify(response.headers)}"
  response.setEncoding 'utf-8'
  response.on 'data', (chunk) -> str += chunk
  response.on 'end', -> console.log str

makeRequest = ->
  req = https.request options, callback
  req.on 'error', (err) ->
    console.log err
  req.end()

makeRequest()

有谁知道可能导致此问题的原因是什么?是Node的问题还是应用服务器的配置问题?这个错误正在杀死我并阻止我在工作中达到里程碑,所以任何帮助将不胜感激。谢谢!

node.js https electron
2个回答
0
投票

这是完整的错误消息:

{ Error: write EPROTO 140229514995584:error:1414D17A:SSL routines:tls12_check_peer_sigalg:wrong curve:../deps/openssl/openssl/ssl/t1_lib.c:1097:

    at WriteWrap.afterWrite [as oncomplete] (net.js:868:14) errno: 'EPROTO', code: 'EPROTO', syscall: 'write' }

错误中错误的曲线部分表明客户端和服务器正在尝试使用不同的椭圆曲线进行加密建立连接,这是不兼容的。

解决方案:

ecdhCurve: 'secp384r1'
添加到选项对象。

像这样:

options = {
  host: '[Application URL]'
  path: '/'
  method: 'GET'
  port: 443,
  ecdhCurve: 'secp384r1
}

-7
投票

要解决此问题,您需要设置 https-proxy,可以使用以下命令完成:

npm config set https-proxy http://proxy.example.com:8080
© www.soinside.com 2019 - 2024. All rights reserved.