HTTPS 使用 Jython
HTTPS get using Jython
请看下面我的代码。基本上它是一个脚本,它以主机名作为参数查询 API 服务,然后 returns 一些与该服务器关联的元数据。现在,当从安装到 windows 机器的 Python 2.7
编译器执行时,它工作得非常好,也可以使用 bash CLI 中的 CURL
(意味着 URL 确实有效),但此脚本将 运行ning 在具有嵌入式 JVM 包装器的 HP 应用程序上,这意味着它将使用 Jython
而不是像我本地的 CPython
机器 - 至少我认为这是问题所在。这就是导致第一个问题的原因——SSL 握手将失败,因为 CPython 会忽略证书,而 Jython 不会。由于这个内部 API 的证书是自签名的,我得到这个:
jvm 1 | sslerror(-1, 'SSL handshake exception: Differences between the SSL socket behaviour of cpython vs. jython are explained on the wiki: http://wiki.python.org/jython/NewSocketModule#SSL_Support')
尝试使用 HTTP 时,我收到错误代码 400:
400: ('Bad Request', 'Bad request syntax or unsupported method')
我认为值得注意的是,这不可能是网络问题。我可以使用 HTTP 从浏览器获取数据。
理想情况下,我会对不安全的 HTTP 感到满意,因为无论如何它都是一项内部服务。此外,信任证书也会有问题,因为我的脚本将 运行 在 45-50 台不同的机器上,增加了太多的开销。
此外,使用 urllib2 以外的东西(例如 Python 请求模块)将成为一个问题,因为任何非 ootb 的东西都必须分发到所有机器,再次增加不可接受的开销.
我找到了这个:trusting all certificates in Jython,但坦白说我不太明白。
我想我的问题是:为什么 HTTP 会失败?
编辑:将一些证书导入 JVM 的密钥库,现在我似乎正在通过 SSL 层,但它仍然以代码 400 响应。
import urllib2
import base64
baseUrl = 'https://my-api-example.com/'
hostname = 'server1.example.com'
username = "vinnie"
password = 'pooh'
request = urllib2.Request(baseUrl + hostname)
base64string = base64.encodestring('%s:%s' % (username, password))
request.add_header("Authorization", "Basic %s" % base64string)
try:
data = urllib2.urlopen(request)
print data.read()
except urllib2.HTTPError, e:
print e.code
except urllib2.URLError, e:
print e.reason
except:
print 'Undefined error'
我设法通过打印出 "request" 实例的属性自行解决了这个问题。这样做显示 base64.encode 显然 returns 带有尾随换行符的字符串,这会导致服务器响应 400。我想使用编码可以绕过这个问题,尽管我不明白为什么 base64.encode 返回的值首先带有尾随换行符。
结案...
请看下面我的代码。基本上它是一个脚本,它以主机名作为参数查询 API 服务,然后 returns 一些与该服务器关联的元数据。现在,当从安装到 windows 机器的 Python 2.7
编译器执行时,它工作得非常好,也可以使用 bash CLI 中的 CURL
(意味着 URL 确实有效),但此脚本将 运行ning 在具有嵌入式 JVM 包装器的 HP 应用程序上,这意味着它将使用 Jython
而不是像我本地的 CPython
机器 - 至少我认为这是问题所在。这就是导致第一个问题的原因——SSL 握手将失败,因为 CPython 会忽略证书,而 Jython 不会。由于这个内部 API 的证书是自签名的,我得到这个:
jvm 1 | sslerror(-1, 'SSL handshake exception: Differences between the SSL socket behaviour of cpython vs. jython are explained on the wiki: http://wiki.python.org/jython/NewSocketModule#SSL_Support')
尝试使用 HTTP 时,我收到错误代码 400:
400: ('Bad Request', 'Bad request syntax or unsupported method')
我认为值得注意的是,这不可能是网络问题。我可以使用 HTTP 从浏览器获取数据。
理想情况下,我会对不安全的 HTTP 感到满意,因为无论如何它都是一项内部服务。此外,信任证书也会有问题,因为我的脚本将 运行 在 45-50 台不同的机器上,增加了太多的开销。
此外,使用 urllib2 以外的东西(例如 Python 请求模块)将成为一个问题,因为任何非 ootb 的东西都必须分发到所有机器,再次增加不可接受的开销.
我找到了这个:trusting all certificates in Jython,但坦白说我不太明白。
我想我的问题是:为什么 HTTP 会失败?
编辑:将一些证书导入 JVM 的密钥库,现在我似乎正在通过 SSL 层,但它仍然以代码 400 响应。
import urllib2
import base64
baseUrl = 'https://my-api-example.com/'
hostname = 'server1.example.com'
username = "vinnie"
password = 'pooh'
request = urllib2.Request(baseUrl + hostname)
base64string = base64.encodestring('%s:%s' % (username, password))
request.add_header("Authorization", "Basic %s" % base64string)
try:
data = urllib2.urlopen(request)
print data.read()
except urllib2.HTTPError, e:
print e.code
except urllib2.URLError, e:
print e.reason
except:
print 'Undefined error'
我设法通过打印出 "request" 实例的属性自行解决了这个问题。这样做显示 base64.encode 显然 returns 带有尾随换行符的字符串,这会导致服务器响应 400。我想使用编码可以绕过这个问题,尽管我不明白为什么 base64.encode 返回的值首先带有尾随换行符。
结案...