在 IronPython 中禁用对 Post 数据的 SSL 验证
Disable SSL Verification to Post Data in IronPython
我们最近迁移到了一个新的开发平台。我们仍在为我们的整个工作流程设置一些部分以使其正常工作。我们有一个问题,我们需要将一个项目提升到生产环境中,但我们在服务器中不断出现错误。我们的团队不太精通 IronPython,无法轻松解决此问题。
我正在编辑相关的脚本。原剧本如下:(请注意我有edited/removed机密和不必要的部分)
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
但仍然出现相同的错误。
对于第二种解决方案,脚本无法识别 SecurityProtocolType
即使 ServicePointManager 已成功导入。
我不明白为什么我什至无法导入 Python 的内置库 (ssl
)。请理解,我发布的脚本是我们唯一可以修改的脚本,因为我们根本无法访问其他脚本。
使用 .NET 的 WebRequest 时,您将绕过标准 python 中可能存在的所有 SSL/TLS-infrastructure,您需要更改 .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
我们最近迁移到了一个新的开发平台。我们仍在为我们的整个工作流程设置一些部分以使其正常工作。我们有一个问题,我们需要将一个项目提升到生产环境中,但我们在服务器中不断出现错误。我们的团队不太精通 IronPython,无法轻松解决此问题。
我正在编辑相关的脚本。原剧本如下:(请注意我有edited/removed机密和不必要的部分)
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
但仍然出现相同的错误。
对于第二种解决方案,脚本无法识别 SecurityProtocolType
即使 ServicePointManager 已成功导入。
我不明白为什么我什至无法导入 Python 的内置库 (ssl
)。请理解,我发布的脚本是我们唯一可以修改的脚本,因为我们根本无法访问其他脚本。
使用 .NET 的 WebRequest 时,您将绕过标准 python 中可能存在的所有 SSL/TLS-infrastructure,您需要更改 .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