终极指南:如何用LinkSwift免费获取八大网盘直链下载地址
2026/5/1 10:39:42
浏览器里输入https://api.openai.com/v1/chat/completions,却得到ERR_CERT_AUTHORITY_INVALID。抓包一看,TLS 1.3 握手刚走到 Certificate 报文,客户端就甩过去一个 Alert(Level=Fatal, Description=49)——也就是「Bad Certificate」。点开报文,能看到服务器发来的证书 CN 字段是*.internal.example.com,而当前访问域名却是api.openai.com——域名不匹配,浏览器当然直接拒绝。
下面这张简化流程图把一次正常 HTTPS 握手与异常握手放在一起对比,先有个直观印象:
sequenceDiagram participant C as Client participant S as Server Note over C,S: 正常握手 C->>S: ClientHello S->>C: ServerHello + Certificate + ServerKeyExchange C->>S: 校验证书→通过 C->>S: ClientKeyExchange + ChangeCipherSpec Note over C,S: 异常握手 C->>S: ClientHello S->>C: Certificate(自签名/域名不符) C->>S: Alert(Level=Fatal, Desc=49)| 浏览器代码 | OpenSSL 代码 | 含义 | 触发场景 |
|---|---|---|---|
| NET::ERR_CERT_AUTHORITY_INVALID | X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN | 无法验证签名链 | 自签名、根证书不在系统仓库 |
| NET::ERR_CERT_COMMON_NAME_INVALID | X509_V_ERR_HOSTNAME_MISMATCH | 域名不匹配 | 证书 CN/SAN 未覆盖访问域名 |
| MOZILLA_PKIX_ERROR_OCSP_RESPONSE_FOR_CERT_MISSING | X509_V_ERR_UNABLE_TO_GET_OCSP | 无法获取 OCSP 响应 | 服务端未配置 OCSP Stapling,客户端又强制检查 |
| ERR_CERT_WEAK_SIGNATURE | X509_V_ERR_UNSUPPORTED_SIGNATURE_ALGORITHM | 使用了弱算法 | SHA1/RSA 1024 等已被淘汰 |
下面命令均基于 OpenSSL 3.x,在终端可直接复现。
openssl verify -untrusted fullchain.pem cert.pem # 如果返回 OK,说明链完整;若提示 unable to get local issuer,则缺中间证书openssl s_client -connect api.openai.com:443 -showcerts </dev/null 2>/1 | \ awk '/BEGIN CERT/,/END CERT/{print}' > remote_chain.pem # 随后可用「openssl x509 -in remote_chain.pem -noout -text」逐张查看openssl s_client -connect api.openai.com:443 -ssl2 </dev/null # 现代站点应直接 handshake_failure,否则说明服务配置过于古老openssl x509 -in cert.pem -noout -ocsp_uri # 拿到 URI 后,用「openssl ocsp」命令验证证书是否被吊销import requests # 把公司私有根证书和公共根证书合并成 ca-bundle.crt response = requests.get( "https://api.openai.com/v1/models", verify="/etc/ssl/ca-bundle.crt" # 只信任此文件内的根证书 ) print(response.status_code)import requests import warnings warnings.warn("verify=False 仅用于本地调试,上线前必须移除", UserWarning) response = requests.get("https://api.openai.com/v1/models", verify=False)import requests import hashlib import base64 def pinned_get(url, expected_spki_b64): """ 仅校验服务器返回的叶子证书 SPKI 指纹,忽略整条链 expected_spki_b64: base64 编码的 SHA256 指纹 """ r = requests.get(url, verify=True, stream=True) sock = r.raw._original_response.fp.raw._sock cert_bin = sock.getpeercert(binary_form=True) spki = hashlib.sha256(cert_bin).digest() if base64.b64encode(spki).decode() != expected_spki_b64: raise ValueError("证书钉扎校验失败") return r # 使用前先抓取目标站点证书并计算好指纹 pinned_get("https://api.openai.com/v1/models", expected_spki_b64="7x5/.../w==")自动续期 + 监控
多级 CA 链构建要点
容器化环境证书管理
(正文完)
如果你也想亲手把「语音识别→大模型→语音合成」整条链路跑通,而不只是调调 HTTPS,可以试试这个动手实验:从0打造个人豆包实时通话AI。我跟着文档一步步搭下来,本地 Web 页面不到半小时就能开口说话,连证书都是自己配的,感觉比单纯调接口有趣得多。