【问题标题】:SSL: CERTIFICATE_VERIFY_FAILED when using pretrained detectron2 modelSSL:使用预训练检测器 2 模型时的 CERTIFICATE_VERIFY_FAILED
【发布时间】:2022-08-10 03:19:13
【问题描述】:

我试图在图像上使用detectron2 中的预训练mask_rcnn_R_50_FPN_3x 模型。我收到错误ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)

我正在使用适用于 Linux 的 Windows 子系统。以下代码会产生错误。

from detectron2.config import get_cfg
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor

cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")
cfg.MODEL.DEVICE='cpu'

predictor = DefaultPredictor(cfg)

我试过更新certifi 包。
我试过了

sudo apt install ca-certificates
sudo update-ca-certificates --fresh
export SSL_CERT_DIR=/etc/ssl/certs

基于此处的答案之一:https://stackoverflow.com/questions/52805115/certificate-verify-failed-unable-to-get-local-issuer-certificate.\ 我已经尝试下载 https://dl.fbaipublicfiles.com 的证书(通过在 Google Chrome 中单击挂锁符号 -> '连接安全' -> '证书有效' -> '详细信息' -> '复制到文件',并且然后对“证书路径”选项卡下的不同证书执行相同的操作)并将其内容复制到cacert.pem 文件中。


更新:
它似乎与urllib.request 模块有关(尽管我可能会误解一些事情)。我发现

from urllib import request
request.urlretrieve('https://dl.fbaipublicfiles.com')

urlretrive 函数由 detectron2 调用)导致相同的错误,而

import requests
requests.get('https://dl.fbaipublicfiles.com')

工作正常。

【问题讨论】:

  • 这个网站的证书很好。确保通信路径中没有 SSL 拦截组件,例如公司代理,或者在 WSL 的情况下,Windows 系统上的 SSL 拦截防病毒软件。
  • 感谢你的回复。你有没有机会就如何检查这个问题提供一些指导?
  • 尝试从 WSL 内部使用 openssl s_client -connect dl.fbaipublicfiles.com:443 | openssl x509 -text -noout 并查看它作为证书颁发者报告的内容。应该是“CN = DigiCert SHA2 High Assurance Server CA”。
  • 你可以运行python -c 'import certifi; print(certifi.where())' 并发布结果吗?
  • 当然,它会打印:/home/<username>/detectron2/detectronenv/lib/python3.8/site-packages/certifi/cacert.pem

标签: python ssl ssl-certificate windows-subsystem-for-linux detectron


【解决方案1】:

尝试将其放在您的 import 语句之后:

import certifi
import ssl

def create_context():
    context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    context.load_verify_locations(certifi.where())
    return context
ssl._create_default_https_context = create_context

这告诉urllib 使用certifi 的证书。

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 2022-10-19
    • 2019-06-21
    • 2021-05-05
    • 2020-09-14
    • 1970-01-01
    • 2019-01-22
    • 2018-04-15
    • 1970-01-01
    相关资源
    最近更新 更多