Python升級後ssl模塊不可用問題解決和淺析

2021-02-21 DBA閒思雜想錄

在Cent0S 7.5下將Python 2.7.5升級到Python 3.6.6後,發現ssl模塊不可用,具體詳細信息如下所示:

[root@db-server ~]# pip list
Package    Version
 --
pip        19.2.3 
setuptools 39.0.1 
WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping

[root@db-server ~]# python -V
Python 3.6.6

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/ssl.py", line 101, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
>>> 
>>> import socket
>>> hasattr(socket,"SSL")
False
>>>


檢查發現openssl包已經安裝了,然後按照網上的文章,修改Modules/Setup.dist中,找到SSL配置部分,如下截圖所示

[root@db-server ~]# yum list installed |grep openssl
openssl.x86_64                        1:1.0.2k-19.el7                  @base    
openssl-libs.x86_64                   1:1.0.2k-19.el7                  @base 

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
#SSL=/usr/local/ssl
#_ssl _ssl.c \#       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \#       -L$(SSL)/lib -lssl -lcrypto

# The crypt module is now disabled by default because it breaks builds
# on many systems (where -lcrypt is needed), e.g. Linux (I believe).
#
# First, look at Setup.config; configure may have set this for you.

#_crypt _cryptmodule.c # -lcrypt        # crypt(3); needs -lcrypt on some systems


這裡需要取消注釋部分(上圖紅框附近部分的設置),設置SSL路徑,但是這個SSL的安裝路徑在哪裡呢?我查找了一下,發現openssl的安裝路徑如下:

[root@db-server ~]# whereis openssl
openssl: /usr/bin/openssl /usr/lib64/openssl /usr/share/man/man1/openssl.1ssl.gz
[root@db-server ~]# rpm -ql openssl
/etc/pki/CA
/etc/pki/CA/certs
/etc/pki/CA/crl
/etc/pki/CA/newcerts
/etc/pki/CA/private
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
/etc/pki/tls/misc/CA
/etc/pki/tls/misc/c_hash
/etc/pki/tls/misc/c_info
/etc/pki/tls/misc/c_issuer
/etc/pki/tls/misc/c_name
/usr/bin/openssl
/usr/share/doc/openssl-1.0.2k
/usr/share/doc/openssl-1.0.2k/FAQ
/usr/share/doc/openssl-1.0.2k/NEWS
/usr/share/doc/openssl-1.0.2k/README
/usr/share/doc/openssl-1.0.2k/README.FIPS
/usr/share/doc/openssl-1.0.2k/README.legacy-settings
/usr/share/licenses/openssl-1.0.2k
/usr/share/licenses/openssl-1.0.2k/LICENSE
/usr/share/man/man1/asn1parse.1ssl.gz
/usr/share/man/man1/ca.1ssl.gz
....


嘗試了幾個路徑,例如SSL=/usr/lib64/openssl ,然後重新編譯安裝Python,發現依然報錯,

[root@db-server Python-3.6.6]# vi Modules/Setup.dist


SSL=/usr/lib64/openssl
_ssl _ssl.c \
       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
       -L$(SSL)/lib -lssl -lcrypto


#cd /tmp/Python-3.6.6
#./configure --prefix=/usr/local
#make
#make install


在Python的解壓安裝包裡面,我查了一下setup.py , 發現搜索ssl關鍵字,發現有如下一些代碼, 但是我搜索了一下相關文件和目錄,居然找不到這些目錄(ssl/include和/ssl/lib)和ssl.h這些文件。

[root@db-server ~]# vi /tmp/Python-3.6.6/setup.py
    # Detect SSL support for the socket module (via _ssl)
        search_for_ssl_incs_in = [
                              '/usr/local/ssl/include',
                              '/usr/contrib/ssl/include/'
                             ]
        ssl_incs = find_file('openssl/ssl.h', inc_dirs,
                             search_for_ssl_incs_in
                             )
        if ssl_incs is not None:
            krb5_h = find_file('krb5.h', inc_dirs,
                               ['/usr/kerberos/include'])
            if krb5_h:
                ssl_incs += krb5_h
        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
                                     ['/usr/local/ssl/lib',
                                      '/usr/contrib/ssl/lib/'
                                     ] )

        if (ssl_incs is not None and
            ssl_libs is not None):
            exts.append( Extension('_ssl', ['_ssl.c'],
                                   include_dirs = ssl_incs,
                                   library_dirs = ssl_libs,
                                   libraries = ['ssl', 'crypto'],
                                   depends = ['socketmodule.h']), )
        else:
            missing.append('_ssl')

[root@db-server ~]# ls -lrt /usr/lib64/openssl
total 0
drwxr-xr-x. 2 root root 218 Sep 20 07:00 engines

[root@db-server ~]# ls /usr/local/ssl
ls: cannot access /usr/local/ssl: No such file or directory

[root@db-server ~]# find / -name ssl.h


後面才搞清楚,openssl包只包含了可執行部分,openssl-devel才包含了頭文件、頭文件參考、某些庫文件等以及跟開發相關的東西。所以只安裝了openssl包是找不到相應的頭文件的,安裝完openssl-devel之後,

[root@db-server ~]# rpm -qa | grep openssl-devel
[root@db-server ~]# rpm -qa | grep openssl
openssl-1.0.2k-19.el7.x86_64
openssl-libs-1.0.2k-19.el7.x86_64

[root@db-server ~]# yum list installed |grep openssl-devel
[root@db-server ~]# yum list installed |grep openssl
openssl.x86_64                        1:1.0.2k-19.el7                  @base    
openssl-libs.x86_64                   1:1.0.2k-19.el7                  @base    
[root@db-server ~]# 

[root@db-server ~]# yum install openssl-devel


使用rpm -ql  openssl-devel 定位安裝安裝路徑為「/usr/include/openssl」,修改安裝路徑的Modules/Setup.dist文件,修改後的部分如下所示(對比上面截圖),然後重新編譯安裝Python後問題解決。

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/include/openssl
_ssl _ssl.c \
        -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
        -L$(SSL)/lib -lssl -lcrypto

相關焦點

  • python 淺析模塊的導入和調用
    給IT入門加星標,提升編程技能今天買了一本關於模塊的書,說實話,模塊真的太多了,小編許多也不知道,要是把模塊全講完,可能得出本書了,所以小編在自己有限的能力範圍內在這裡淺析一下自己的見解,同時講講幾個常用的模塊。 什麼是模塊?  在電腦程式的開發過程中,隨著程序代碼越寫越多,在一個文件裡面,代碼會越來越長,越來越不容易維護。
  • 完美解決 Python2 和 python3 共存問題的Anaconda
    同時讓人尷尬的是很多遺留的老系統依舊運行在 Python2 的環境中,因此有時你不得不同時在兩個版本中進行開發,調試。如何在系統中同時共存 Python2 和 Python3 是開發者不得不面對的問題,一個利好的消息是,Anaconda 能完美解決Python2 和 Python3 的共存問題,而且在 Windows 平臺經常出現安裝依賴包(比如 MySQL-python)失敗的情況也得以解決。Anaconda 是什麼?
  • Python 獲取 NCBI 基因名 SSL 證書異常?
    下面是個人簡單總結的 3 種常用解決方法。由於在 openssl_cafile 中指定的 ca 文件(cert.pem)不存在,所以導致上面的錯誤。注意,如果放到 openssl_capath 目錄下還會出現類似的問題,一定要放到 openssl_cafile 指定的位置。
  • 可升級的PICKLE模塊(Python Recipe)
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • 【連載電子書六】Python常用模塊
    所有和python解釋器相關的都在sys模塊.在python中我們不需要手寫這一套算法.7. pickle模塊pickle用起來很簡單. 說白了. 就是把我們的python對象寫入到文件中的一種解決方案. 但是寫入到文件的是bytes. 所以這東西不是給人看的. 是給機器看的.
  • centos7.9升級ssh和ssl
    .10  在強制刪除ssl時,該文件也將被刪除。yum命令將使用不了。刪除ssl後,在放入該目錄。。yum,,rpm將能使用註:先刪除ssh,在刪除sslyum remove ***刪除不了的使用rpm -e --nodeps ***刪除後,上傳備份文件,運行命令 yum search openssl,可查找升級  ssl.
  • Python爬蟲核心模塊urllib的學習
    因為是為了自己複習起來方便~所以就不一句英語一句中文的對照著翻了,有興趣看原版的,自己點官方文檔吧~        Python 3.x版本後的urllib和urllib2        現在的Python已經出到了3.5.2        在Python 3以後的版本中,urllib2這個模塊已經不單獨存在(也就是說當你import
  • python 安全之 urllib 模塊
    urllib 庫是 python
  • 使用Python v3.4 + SSLContext 進行SSL / TLS客戶端證書驗證
    的/ usr / bin中/ python3導入套接字導入sslhost_addr ='127.0.0.1'host_port = 8082server_sni_hostname ='example.com'server_cert ='server.crt'client_cert ='client.crt'client_key
  • 如何正確解決Python中的中文編碼問題?
    這種異常在Python中很容易遇到,尤其是在Python2.x中,是一個很讓初學者費解頭疼的問題。不過,如果你理解了Python的Unicode,並在編碼中遵循一定的原則,這種編碼問題還是比較容易理解和解決的。
  • Python擴展庫安裝與常見問題解決完整指南
    但一般不把庫叫作模塊,例如tkinter庫包含若干模塊文件,此時一般說標準庫tkinter而不說tkinter模塊。在Python中,有內置模塊、標準庫和擴展庫之分。內置模塊和標準庫是Python官方的標準安裝包自帶的,內置模塊沒有對應的文件,可以認為是封裝在Python解釋器主程序中的;標準庫有對應的Python程序文件,這些文件在Python安裝路徑中的Lib文件夾中。如圖1中1、2、3所示。
  • 最近很火的免費SSL 使用教程
    並且在全站Https的大趨勢下,Let's Encrypt 脫穎而出,無疑會對傳統SSL證書提供商造成不小的打擊,並將Https的應用和推廣上升到一個空前火熱的階段。編寫的開源項目,基於python2.7環境,如果系統安裝的是python2.6,會提示升級    也可以執行以下命令(官方不推薦).
  • python模塊和包,常用模塊math、random、random.sample(li,n)#不放回抽取n個隨機樣本
    一、模塊模塊是一個包含所有你定義的函數和變量的文件,其後綴名是.py。模塊可以被別的程序引入,以使用該模塊中的函數等功能。
  • SSL證書配置
    JDK1.6默認只支持 SSLv3 和 TLSv1 兩個版本的https協議,JDK 1.7 版本默認禁用SSLv3,並支持 TLSv1、TLSv1.1及TLSv1.2。Tomcat 6及以下版本在使用 JDK 1.6及以下版本的運行環境時,可能存在無法禁用 SSLv3的情況。此時建議您升級 Tomcat 及 JDK版本,或變更使用 APR模塊來配置SSL證書,以確保安全方式安裝及使用伺服器證書。
  • 高可用實施遇到的腦裂問題怎麼辦?
    ,出現這種主要是仲裁之間網絡中斷或不穩定導致,有沒有好點的解決方案?二是豐富仲裁方式的類型,比如節點間網絡仲裁,和磁碟仲裁。通常HACMP都是有2種仲裁網絡+磁碟仲裁,三個仲裁方式互相保護。劉文  CMBC系統工程師:凡是集群體系架構,腦裂問題應該都是不可逃避的問題。1.
  • 一加黑鯊華碩OPPO等手機root後微信指紋支付不可用怎麼解決
    ROM樂園小編教大家使用 模塊最快解決代替指紋支付功能,目前測試支持一加8Pro黑鯊3Pro3S華碩rog3,理論上支持安卓全部帶指紋的機型  首先我們ROOT的必須使用面具ROOT,其他ROOT暫時不適合此方法,並且面具不會彈窗修復環境,不然無法刷入模塊 文件下載:關注微信公眾號:ROM樂園   回復關鍵詞
  • Raspberry Pi 安裝更新 Python3 和 pip
    安裝Python3sudo apt-get install python3一般情況下,Raspberry Pi的系統會預裝Python
  • Python 爬蟲:urllib.request 模塊
    顧名思義,這個模塊主要負責打開URL和HTTP協議之類的。這個模塊就是Python 2標準庫中的urllib2模塊的升級版。Python 3的urllib.request模塊基本與Python 2的urllib2模塊是一致的。
  • 如何安裝R語言的Python調用接口RPy2模塊
    ,也沒有找到思路,最後才發現官方安裝的rpy2模塊與系統並不兼容,而是要安裝非官方的rpy2模塊,且必須選擇與計算機中安裝的R和Python版本相一致的rpy2版本。我按官方安裝的rpy2模塊一直不能正常使用,一直在報錯,讓我百思不得其解,後面又搜索了很多帖子,說是rpy2可能與win不兼容,我就在linux系統上安裝python和R,但都發覺沒成功,後面我看到有人提到一句,說是官方安裝的
  • 如何修復mac電腦藍牙不可用的問題
    但是有的朋友發現在Mac上會提示「藍牙不可用」消息。不必驚慌,可能是因為您有一段時間沒有重新啟動Mac,或者外部連接的藍牙設備運行不正常,或者macOS存在錯誤而導致。下面為大家總結了幾種出現「藍牙不可用」的解決辦法,快來看看吧!重新啟動Mac在大多數情況下,重新啟動Mac會解決很多問題,藍牙問題也是如此。