HCLonely / HCLonely/AWA-Helper

Twitch出现unable to verify the first certificate

Open
#75 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
TypeScript
Stars
55
Forks
8
Avg merge
48m
Merged PRs (30d)
1

Description

版本3.4.8
使用steamcommunity 302
配置了TLSRejectUnauthorized: false
首次做任务时产生以下报错:

[2026-08-26 07:58:54] 正在获取 Achievements...OK
[2026-08-26 07:59:04] 正在匹配 Achievements...
[2026-08-26 07:59:04] 正在初始化 TwitchTrack...[2026-08-26 07:59:04] 匹配 Achievements 完成!
Error
[2026-08-26 07:59:09] 正在重试第 1 次...Error
[2026-08-26 07:59:12] 正在重试第 2 次...Error
[2026-08-26 07:59:13] 正在重试第 3 次...Error(0): 证书错误,请尝试更换代理或节点!
Ie [Error]: unable to verify the first certificate
    at Ie.from (output/main.js:1:1305488)
    at w.<anonymous> (output/main.js:1:1334715)
    at w.emit (node:events:531:35)
    at f.<computed> (output/main.js:1:1286415)
    at ClientRequest.emit (node:events:519:28)
    at emitErrorEvent (node:_http_client:108:11)
    at TLSSocket.socketErrorListener (node:_http_client:575:5)
    at TLSSocket.emit (node:events:531:35)
    at emitErrorNT (node:internal/streams/destroy:170:8)
    at emitErrorCloseNT (node:internal/streams/destroy:129:3)
    at _n.request (output/main.js:1:1350149)
    at process.processTicksAndRejections (node:internal/process/task_queues:103:5)
    at async output/main.js:1:3422114
    at async _n.request (output/main.js:1:1350053)
    ... collapsed 4 duplicate lines matching above 2 lines 2 times...
    at async mY.Twitch.init (output/main.js:1:3434330)
    at async lY.Archievement.watchTwitch (output/main.js:1:3445290) {
  isAxiosError: true,
  code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
  config: [Object: null prototype] {
    transitional: {
      silentJSONParsing: true,
      forcedJSONParsing: true,
      clarifyTimeoutError: false,
      legacyInterceptorReqResOrdering: true
    },
    adapter: [ 'xhr', 'http', 'fetch' ],
    transformRequest: [ [Function (anonymous)] ],
    transformResponse: [ [Function (anonymous)] ],
    timeout: 300000,
    xsrfCookieName: 'XSRF-TOKEN',
    xsrfHeaderName: 'X-XSRF-TOKEN',
    maxContentLength: -1,
    maxBodyLength: -1,
    env: { FormData: [Function], Blob: [class Blob] },
    validateStatus: [Function: validateStatus],
    headers: Object [AxiosHeaders] {
      Accept: 'application/json, text/plain, */*',
      'Content-Type': undefined,
      Host: 'www.twitch.tv',
      'User-Agent': 'axios/1.16.1',
      'Accept-Encoding': 'gzip, compress, deflate, br'
    },
    maxRedirects: 5,
    url: 'https://www.twitch.tv/',
    method: 'get',
    Logger: h { id: 1787702353574, data: '' },
    allowAbsoluteUrls: true,
    retryCount: 3,
    data: undefined
  },
  request: <ref *1> Writable {
    _events: {
      close: undefined,
      error: [Function (anonymous)],
      prefinish: undefined,
      finish: undefined,
      drain: undefined,
      response: [Function (anonymous)],
      socket: [Array],
      timeout: undefined,
      abort: undefined
    },
    _writableState: WritableState {
      highWaterMark: 16384,
      length: 0,
      corked: 0,
      onwrite: [Function: bound onwrite],
      writelen: 0,
      bufferedIndex: 0,
      pendingcb: 0,
      [Symbol(kState)]: 17581054,
      [Symbol(kBufferedValue)]: null,
      [Symbol(kErroredValue)]: [Error]
    },
    _maxListeners: undefined,
    _options: {
      maxRedirects: 5,
      maxBodyLength: Infinity,
      protocol: 'https:',
      path: '/',
      method: 'GET',
      headers: [Object: null prototype],
      agents: [Object],
      auth: undefined,
      family: undefined,
      beforeRedirect: [Function: Vt],
      beforeRedirects: [Object: null prototype],
      http2Options: undefined,
      hostname: 'www.twitch.tv',
      port: '',
      agent: undefined,
      insecureHTTPParser: false,
      nativeProtocols: [Object],
      sensitiveHeaders: [],
      pathname: '/'
    },
    _ended: true,
    _ending: true,
    _redirectCount: 0,
    _redirects: [],
    _requestBodyLength: 0,
    _requestBodyBuffers: [],
    _eventsCount: 3,
    _onNativeResponse: [Function (anonymous)],
    _headerFilter: /^(?:Authorization|Proxy-Authorization|Cookie)$/i,
    _currentRequest: ClientRequest {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      outputData: [],
      outputSize: 0,
      writable: true,
      destroyed: true,
      _last: true,
      chunkedEncoding: false,
      shouldKeepAlive: true,
      maxRequestsOnConnectionReached: false,
      _defaultKeepAlive: true,
      useChunkedEncodingByDefault: false,
      sendDate: false,
      _removedConnection: false,
      _removedContLen: false,
      _removedTE: false,
      strictContentLength: false,
      _contentLength: 0,
      _hasBody: true,
      _trailer: '',
      finished: true,
      _headerSent: true,
      _closed: false,
      _header: 'GET / HTTP/1.1\r\n' +
        'Accept: application/json, text/plain, */*\r\n' +
        'Host: www.twitch.tv\r\n' +
        'User-Agent: axios/1.16.1\r\n' +
        'Accept-Encoding: gzip, compress, deflate, br\r\n' +
        'Connection: keep-alive\r\n' +
        '\r\n',
      _keepAliveTimeout: 0,
      _onPendingData: [Function: nop],
      agent: [Agent],
      socketPath: undefined,
      method: 'GET',
      maxHeaderSize: undefined,
      insecureHTTPParser: false,
      joinDuplicateHeaders: undefined,
      path: '/',
      _ended: false,
      res: null,
      aborted: false,
      timeoutCb: [Function: emitRequestTimeout],
      upgradeOrConnect: false,
      parser: null,
      maxHeadersCount: null,
      reusedSocket: false,
      host: 'www.twitch.tv',
      protocol: 'https:',
      _redirectable: [Circular *1],
      [Symbol(shapeMode)]: false,
      [Symbol(kCapture)]: false,
      [Symbol(kBytesWritten)]: 0,
      [Symbol(kNeedDrain)]: false,
      [Symbol(corked)]: 0,
      [Symbol(kChunkedBuffer)]: [],
      [Symbol(kChunkedLength)]: 0,
      [Symbol(kSocket)]: [TLSSocket],
      [Symbol(kOutHeaders)]: [Object: null prototype],
      [Symbol(errored)]: null,
      [Symbol(kHighWaterMark)]: 16384,
      [Symbol(kRejectNonStandardBodyWrites)]: false,
      [Symbol(kUniqueHeaders)]: null,
      [Symbol(kError)]: [Error]
    },
    _currentUrl: 'https://www.twitch.tv/',
    _timeout: null,
    [Symbol(shapeMode)]: true,
    [Symbol(kCapture)]: false
  },
  cause: Error: unable to verify the first certificate
      at TLSSocket.onConnectSecure (node:internal/tls/wrap:1701:34)
      at TLSSocket.emit (node:events:519:28)
      at TLSSocket._finishInit (node:internal/tls/wrap:1099:8)
      at ssl.onhandshakedone (node:internal/tls/wrap:885:12) {
    code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
  }
}

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the reported request path in output/main.js, especially Twitch.init and Archievement.watchTwitch, and reproduce the first task using the reported TLSRejectUnauthorized setting. Trace the request to https://www.twitch.tv/ and verify that certificate handling is consistent with the configured setting and that the retry sequence no longer ends with the reported certificate error.

Written by the indexing model from the issue text.

Assessment

Tech stack
node.js, typescript
Domain
networking
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Needs clarification
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.