如何连接Python IMAP4_SSL和自签名服务器SSL证书?

2023-12-02

我正在使用 python3 和imaplib连接到 Exchange 服务器。 Exchange 服务器使用为主机名“my.server.fqdn”创建的自签名证书。最近在我的工作站(Ubuntu 14.04)上升级操作系统后,我的 python 脚本不再工作。

我正在使用的基本代码片段在这里:

#!/usr/bin/python3

import imaplib
import socket
import ssl
import getpass

passwd = getpass.getpass()
mail =  imaplib.IMAP4_SSL('my.server.fqdn', 1143)  
mail.login('mike', passwd)
mail.list()
mail.select("INBOX")

该代码在升级之前运行良好。现在这段代码产生了这个错误:

Traceback (most recent call last):
  File "./example.py", line 9, in <module>
    mail =  imaplib.IMAP4_SSL('my.server.fqdn', 1143)  
  File "/usr/lib/python3.4/imaplib.py", line 1222, in __init__
    IMAP4.__init__(self, host, port)
  File "/usr/lib/python3.4/imaplib.py", line 181, in __init__
    self.open(host, port)
  File "/usr/lib/python3.4/imaplib.py", line 1236, in open
    IMAP4.open(self, host, port)
  File "/usr/lib/python3.4/imaplib.py", line 257, in open
    self.sock = self._create_socket()
  File "/usr/lib/python3.4/imaplib.py", line 1228, in _create_socket
    server_hostname=server_hostname)
  File "/usr/lib/python3.4/ssl.py", line 364, in wrap_socket
    _context=self)
  File "/usr/lib/python3.4/ssl.py", line 578, in __init__
    self.do_handshake()
  File "/usr/lib/python3.4/ssl.py", line 805, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: TLSV1_ALERT_INTERNAL_ERROR] tlsv1 alert internal error (_ssl.c:598)

我不清楚 python 的自签名证书、SSL 版本是否有问题,或者 python 3 是否有新的东西不适用于我的旧代码。

我确实有来自 Exchange 服务器的 PEM 文件,它允许我使用以下命令连接到服务器curl。身份验证失败,但检查curlSSL 握手期间似乎工作正常。我必须提供curl the --sslv3选项以及 PEM 文件的路径以使其正常工作。如果这就是我需要使用 python 来使其再次工作的方法,那么我该如何为 python 提供相同的信息呢?

卷曲会话在这里:

$ curl -vvv --sslv3 https://my.server.fqdn:1143 --cacert ~/my_server_fqdn.pem 
    * Rebuilt URL to: https://my.server.fqdn:1143/
    * Hostname was NOT found in DNS cache
    *   Trying 10.10.10.10...
    * Connected to my.server.fqdn (10.10.10.10) port 1143 (#0)
    * successfully set certificate verify locations:
    *   CAfile: /home/username/my_server_fqdn.pem
      CApath: /etc/ssl/certs
    * SSLv3, TLS handshake, Client hello (1):
    * SSLv3, TLS handshake, Server hello (2):
    * SSLv3, TLS handshake, CERT (11):
    * SSLv3, TLS handshake, Server key exchange (12):
    * SSLv3, TLS handshake, Server finished (14):
    * SSLv3, TLS handshake, Client key exchange (16):
    * SSLv3, TLS change cipher, Client hello (1):
    * SSLv3, TLS handshake, Finished (20):
    * SSLv3, TLS change cipher, Client hello (1):
    * SSLv3, TLS handshake, Finished (20):
    * SSL connection using ECDHE-RSA-AES256-SHA
    * Server certificate:
    *        subject: O=fqdn; O=SERVER; OU=M; CN=my.server.fqdn
    *        start date: 2013-07-29 20:59:04 GMT
    *        expire date: 2023-07-27 20:59:04 GMT
    *        common name: my.server.fqdn (matched)
    *        issuer: O=fqdn; O=SERVER; OU=M; CN=my.server.fqdn
    *        SSL certificate verify ok.
    > GET / HTTP/1.1
    > User-Agent: curl/7.35.0
    > Host: my.server.fqdn:1143
    > Accept: */*
    > 
    * OK [CAPABILITY IMAP4REV1 AUTH=LOGIN MOVE] IMAP4rev1 server ready
    GET BAD command authentication required
    User-Agent: BAD command authentication required
    Host: BAD command authentication required
    Accept: BAD command authentication required
    * SSLv3, TLS alert, Client hello (1):
    * Connection #0 to host my.server.fqdn left intact

显然这个问题是由于一个或多个被禁用的 TLS 协议版本在 Ubuntu 12.04 和 14.04 上的 openssl 软件包中。我最终在 python3 中使用了 ssl 上下文,并强制使用 SSL 版本 3 进行连接。这现在看来有效。真的希望这可以帮助任何遇到同样问题的人。

#!/usr/bin/python3

import imaplib
import socket
import ssl
import getpass

ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv3)  
passwd = getpass.getpass()
mail =  imaplib.IMAP4_SSL('my.server.fqdn', 1143, ssl_context=ctx)
mail.login('mike', passwd)
mail.select('INBOX', 1)
typ, uids = mail.uid("SEARCH", None, "ALL")

uids = uids[0].split()
for u in uids:
   print ("found uid " , u)

mail.close()
mail.logout()
del mail
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何连接Python IMAP4_SSL和自签名服务器SSL证书? 的相关文章

  • Twisted 的 Deferred 和 JavaScript 中的 Promise 一样吗?

    我开始在一个需要异步编程的项目中使用 Twisted 并且文档非常好 所以我的问题是 Twisted 中的 Deferred 与 Javascript 中的 Promise 相同吗 如果不是 有什么区别 你的问题的答案是Yes and No
  • 递归 lambda 表达式可能吗?

    我正在尝试编写一个调用自身的 lambda 表达式 但我似乎找不到任何语法 或者即使它是可能的 本质上我想将以下函数传输到以下 lambda 表达式中 我意识到这是一个愚蠢的应用程序 它只是添加 但我正在探索可以在 python 中使用 l
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • Pandas:GroupBy 到 DataFrame

    参考这个关于 groupby 到 dataframe 的非常流行的问题 https stackoverflow com questions 10373660 converting a pandas groupby object to dat
  • Python 2.7 中的断言对我来说不起作用示例assertIn

    我的 Mac 上安装了 python 2 7 通过在终端中运行 python v 进行验证 当我尝试使用任何新的 2 7 断言方法时 我收到 AtributeError 我看过http docs python org 2 library u
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 使用 Pandas 计算 delta 列

    我有一个数据框 如下所示 Name Variable Field A 2 3 412 A 2 9 861 A 3 5 1703 B 3 5 1731 A 4 0 2609 B 4 0 2539 A 4 6 2821 B 4 6 2779 A
  • Python:IndexError:修改代码后列表索引超出范围

    我的代码应该提供以下格式的输出 我尝试修改代码 但我破坏了它 import pandas as pd from bs4 import BeautifulSoup as bs from selenium import webdriver im
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 如何根据第一列创建新列,同时考虑Python Pandas中字母和列表的大小? [复制]

    这个问题在这里已经有答案了 我在 Python Pandas 中有 DataFrame 如下所示 col1 John Simon prd agc Ann White BeN and Ann bad list Ben Wayne 我需要这样做
  • TKinter 中的禁用/启用按钮

    我正在尝试制作一个像开关一样的按钮 所以如果我单击禁用按钮 它将禁用 按钮 有效 如果我再次按下它 它将再次启用它 我尝试了 if else 之类的东西 但没有成功 这是一个例子 from tkinter import fenster Tk
  • 从 pandas DataFrame 中删除少于 K 个连续 NaN

    我正在处理时间序列数据 我在从数据帧列中删除小于或等于阈值的连续 NaN 时遇到问题 我尝试查看一些链接 例如 标识连续 NaN 出现的位置以及计数 Pandas NaN 孔的游程长度 https stackoverflow com que
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • 无法将 /root/.rnd 加载到 RNG 中

    我想使用 Windows Open SSL 生成服务器证书 当我运行此命令行时 出现此错误 我应该怎么办 Command openssl req new x509 days 3650 key ca key out ca crt Error

随机推荐

  • Google Play 游戏服务邀请丢失

    我正在使用新的 Google Play 游戏服务在 Android 上开发我的游戏 现在我正在尝试包含邀请系统 我有 3 个 Google 帐户 用于通过 2 个 Android 设备和 1 个 Android 模拟器尝试邀请 我的问题是
  • 函数超时 (jQuery)

    function getNames some code 这个功能可以在一秒钟内完成 但有时它会无限期地冻结自身和页面上的 html 块 ajax 内部 我希望这个功能有时间限制 如果十秒内没有完成 则中止它 这个怎么做 使用 jQuery
  • 使用 javascript toDataURL 保存 HTML5 画布时如何插入 PNG 注释块?

    我有一个紧凑的canvas to png下载保护程序功能 参见下面的代码 这段代码运行得很好 我对它的输出很满意 主要是 第二次更换就够了吗 那个替代品会是什么样子 我唯一的其他选择是使用 imagemagick 对文件进行后处理 有任何想
  • SFENCE和LFENCE对相邻核心的缓存有什么影响?

    From the speech Herb Sutter in the figure of the slides on page 2 这里显示了单独的缓存 L1S和存储缓冲区 SB 1 在 Intel x86 处理器中cache L1 和 S
  • 传递变量时 SwiftUI 中的 .sheet 行为奇怪

    我在 SwiftUI 中使用 sheet 视图 并且在代码执行中观察到奇怪的行为 我正在查看 SignInView2 struct SignInView2 View Environment presentationMode var pres
  • 使用 AJAX 将数据从 HTML 表单提交到 WebMethod

    因此 我从 HTML 表单中获取数据 然后使用 AJAX 将数据发送到 Web 方法 然后发送到 sqlite 数据库 但我的 AJAX 调用失败 我搞砸了什么 我做得正确吗 HTML 表单
  • 相当于 Access 中的 SET IDENTITY_INSERT OFF

    正如标题所示 是否有任何方法可以关闭 Access 中的自动编号字段 以允许我插入具有我选择的 id 的行 就像在 SQL Server 中使用 SET IDENTITY INSERT OFF 所做的那样 您可以使用 SQL 插入 ID I
  • Laravel 5.5 中用户会话过期时自动重定向

    我想使用 Laravel 函数在用户会话过期时自动重定向到我的登录页面 当用户尝试访问另一个页面并且会话过期时 我会进行重定向 我设置了一个生命周期 这有助于由于用户不活动而自动注销 而我想要的是在会话超时时立即重定向 我尝试使用 Java
  • mysql数据库中的奇怪字符

    当我输入像 或 这样的奇怪字符并将其存储在 mysql 数据库中时 该字符将被转换为 它可能必须对我的字符集做一些事情 但我现在不知道从哪里开始 在页面顶部我插入了 该字段在dbase中的搭配是 utf8 unicode ci 在网页中显示
  • Android studio 在 KMP/KMM/KN 中添加了错误的 xcodeproj 位置

    我正在尝试运行全新的 KMM 应用程序和我之前创建的现有 KMM 应用程序 当我尝试从 Android Studio 运行 iOS 版本时 我没有 iOS 配置 当我创建 iOS 配置时 我收到一个必须首先修复的错误 当我按下 修复它 按钮
  • 检查 PHP 类中的会话变量

    在我的索引页面顶部 使用以下命令设置会话 SESSION language english 当我回显 SESSION language 时 它回显 english 但是会话值在 PHP 类中不可读 为什么呢 你必须打电话session st
  • iOS 7 用 UIPickerView 打开 UITableViewController 很慢

    据此这个问题和 KyleC 的友善回答我已经实现了UITableViewController其中有许多行依赖于从核心数据中获取 每行显示一个简单的NSString 获取的对象的名称 并且有一个UIPickerView hidden 问题是
  • cin 条件检查错误

    我是一名学习c 的初学者程序员 我在使用 cin 命令时遇到了一个棘手的问题 在下面的程序部分中 如果我在第一个 cin 命令处输入错误的类型 则程序将根本不会执行以下任何 cin 命令 但会执行程序的其余部分 start include
  • CSS:顶部与顶部边缘

    我不确定我是否完全理解这两者之间的区别 有人可以解释为什么我会使用其中一种而不是另一种以及它们有何不同吗 如果您想将一个 块 元素从文档流中的其他元素移开 您可以使用边距 这意味着它将把以下元素推开 进一步向下 请注意 相邻块元素的垂直边距
  • 如何返回数组中可能存在的一组连续数字?

    如果我有一个已排序的数组 如何找到连续的数字 顺便说一句 这是为了确定扑克牌是否是顺子 数组中的重复项已被删除 我可以做到这一点 但这将是一种多行方法 我认为可能有一个使用可枚举方法的快速单行方法 例如 FindSequence 9 8 7
  • 如何知道黑莓设备是否有 GPS?

    我想知道设备是否有 GPS 对于 5 0 以下的设备如何做到这一点 查看文档Location Provider 在不同情况下的一些设备上尝试此代码 我认为它应该有效 try LocationProvider lp LocationProvi
  • 如何获取 Spring 4.1 使用的 Jackson ObjectMapper?

    Spring 4 1实例化一个JacksonObjectMapper实例 我有理由想要 Autowire将该实例放入我的一个控制器中 该控制器使用 Jackson 对它自己进行一些小的 JSON 解析 但是ObjectMapper它使用的应
  • 将container_of宏应用于嵌入的char数组时报告警告

    当我申请时container of宏到包含 char 数组的 C 结构 我得到警告 从不兼容的指针类型进行初始化 这是代码 define container of ptr type member const typeof type 0 gt
  • 字符串文字中的转义序列 (Fortran)

    C 中有一个例子 string str str First n Second n Third n cout lt lt str lt lt endl 输出将是 First Second Third 我想尝试在 Fortran 中重复它 但没
  • 如何连接Python IMAP4_SSL和自签名服务器SSL证书?

    我正在使用 python3 和imaplib连接到 Exchange 服务器 Exchange 服务器使用为主机名 my server fqdn 创建的自签名证书 最近在我的工作站 Ubuntu 14 04 上升级操作系统后 我的 pyth