禁用 SSL 验证以在 IronPython 中发布数据

Posted

技术标签:

【中文标题】禁用 SSL 验证以在 IronPython 中发布数据【英文标题】:Disable SSL Verification to Post Data in IronPython 【发布时间】:2019-08-21 02:35:45 【问题描述】:

我们最近迁移到了一个新的开发平台。我们仍在为我们的整个工作流程设置一些部分以正常工作。我们有一个问题,我们需要将一个项目提升到生产中,但我们一直在服务器中收到错误。我们的团队并不精通 IronPython,因此无法轻松解决此问题。

我正在编辑与此相关的脚本。原脚本如下:(请注意我已经编辑/删除了机密和不必要的部分)

def callWebService(URI, setProjectState): 
    job = jobs[0]
    job.AddNote(0, job.CurrentVersion, ('%s.' % (job.Id)))

    PARAMETERS='"id": "%s", "someData": "%s"' % (job.Id, setProjectState)

    from System.Net import WebRequest
    request = WebRequest.Create(URI)
    request.ContentType = "application/json"
    request.Method = "POST"

    from System.Text import Encoding
    bytes = Encoding.ASCII.GetBytes(PARAMETERS)
    request.ContentLength = bytes.Length
    reqStream = request.GetRequestStream()
    reqStream.Write(bytes, 0, bytes.Length)
    reqStream.Close()

    response = request.GetResponse()

    from System.IO import StreamReader
    result = StreamReader(response.GetResponseStream()).ReadToEnd()
    print result
    return; 

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12   

callWebService('https://somesite.com/needtoposthere', 'Production')

新平台的支持告诉我们,为了解决这个问题,我们需要绕过 ssl 验证部分,因为只有在我们工作流程的这一部分中,我们才将数据发布到 HTTPS url,因为它是生产环境。

我尝试了很多方法,例如添加ff代码:

import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

还尝试按照支持人员的建议插入这个:

from System.Net import ServicePointManager
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

from System.Net import ServicePointManager
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072

我也尝试过使用 ssl 库的 verify = false,但仍然不断出错。

对于第一个解决方案,我得到的错误是 ssl 模块似乎无法导入。日志显示错误module named "ssl" cannot be found". 我尝试像其他导入声明一样声明导入:from System.Net import ssl 但仍然得到相同的错误。

对于第二种解决方案,即使已成功导入 ServicePointManager,脚本也无法识别SecurityProtocolType

我不明白为什么我似乎无法导入 Python 的内置库 (ssl)。请理解,我发布的脚本是我们唯一可以修改的脚本,因为我们根本无法访问其他脚本。

【问题讨论】:

【参考方案1】:

使用 .NET 的 WebRequest 时,您将绕过标准 python 中可能存在的所有 SSL/TLS 基础设施,您需要在 .NET 端更改 SSL/TLS 设置。

鉴于未找到模块 ssl,它要么不在模块查找路径上,要么与 IronPython 不兼容(因为它可能是本机的)。

警告:以下示例禁用所有证书验证并且不适合生产 此外,它仅将 SSL/TLS 版本限制为 1.2。

from System.Net import ServicePointManager, SecurityProtocolType
ServicePointManager.ServerCertificateValidationCallback = lambda sender, certificate, chain, sslPolicyErrors: True
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

如果可能,您应该避免完全禁用证书验证,并至少进行某种指纹检查,这意味着您正在固定并只允许一个预期的、不完全有效的开发证书。 这可能看起来像

def certificateCheck(sender, certificate, chain, sslPolicyErrors):
    # check for certificate whitelist, specific root certificate etc.
    # print certificate
    return certificate.Thumbprint == "..."

ServicePointManager.ServerCertificateValidationCallback = certificateCheck

【讨论】:

这就是我无法导入 ssl 模块的原因。感谢您分享的知识。我真的没有想过添加 SecurityProtocolType,因为我认为导入 ServicePointManager 就足够了。我们只进行此临时修复,因为支持人员表示该问题将在其软件的下一次更新中得到解决,但目前尚不可用 是的,我在答案中添加了另一个 sn-p,显示了如何检查特定证书以避免接受任何内容。试一试,如果能解决您的问题,请标记答案。 抱歉迟到了,我们昨天才能够测试这个。像魅力一样工作!

以上是关于禁用 SSL 验证以在 IronPython 中发布数据的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 cURL SSL 证书验证 [重复]

如何禁用 Ktor 客户端 SSL 验证?

如何禁用 Jenkins 结帐和 git 插件 SSL 验证?

SSL 证书 - 在 axios 中禁用验证并做出反应

单击 Javascript 链接以在 Python 中发出发布请求

如何在 python 中禁用 http.client.HTTPSConnection 类的 ssl 验证?