ERROR: cannot download default sources list

问题

安装ROS Melodic时执行以下指令时出现报错。

sudo rosdep init
rosdep update

如题,具体如下:

ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.

能ping,浏览器能访问,能curl。

解决

法1

打开host文件,地址为/etc/hosts

添加以下内容。

151.101.84.133  raw.githubusercontent.com

保存再次执行即可。

法2

看ERROR是urlopen和ssl验证的问题,虽然已经可以读取我们手动新建的20-default.list中的内容,但并没有解决根本问题,要下载东西时依然出错。

报的错误原因是python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书,而当目标网站使用的是自签名的证书时就会抛出一个 urllib2.URLError的错误消息。

既然前面尝试了很多办法都没法解决SSL验证问题,那只能想办法在执行rosdep update时尝试定位urllib.urlopen()函数并规避掉SSL验证。

搜了很久,终于找到Z-HE:sudo rosdep init出错的解决方案,定位rosdep命令中用到的urllib.urlopen()

rosdep命令是py脚本,入口:
查找rosdep地址: /usr/bin/rosdep
查看rosdep.py内容:from rosdep2.main import rosdep_main
查找rosdep2地址:/usr/lib/python2.7/dist-packages/rosdep2
从main.py中进一步定位,发现是在
/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py中的
download_default_sources_list()调用了urlopen()

找到urlopen()之后,如果参考链接里的解决方案,需要修改所有调用的14个地方,太复杂。如果我们可以在rosdep浅入口处设置urlopen()全局属性,取消SSL验证,那是不是可以一下解决问题?

在网上查找后发现确实可以设置SSL验证全局取消(参考Py 坑之 CERTIFICATE_VERIFY_FAILED)。

因此,在/usr/lib/python2.7/dist-packages/rosdep2/sources_list.py中顶部直接插入两行代码取消SSL验证

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

参考链接

https://zhuanlan.zhihu.com/p/77483614

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据