我已经在这方面绞尽脑汁好几天了,所以我向 Stackoverflow 的聪明人寻求帮助。这是交易:
我正在构建一个 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的问题还是应用服务器的配置问题?这个错误正在杀死我并阻止我在工作中达到里程碑,所以任何帮助将不胜感激。谢谢!
这是完整的错误消息:
{ 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
}
要解决此问题,您需要设置 https-proxy,可以使用以下命令完成:
npm config set https-proxy http://proxy.example.com:8080