Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Jython获取HTTPS_Python_Ssl_Urllib2_Jython - Fatal编程技术网

Python 使用Jython获取HTTPS

Python 使用Jython获取HTTPS,python,ssl,urllib2,jython,Python,Ssl,Urllib2,Jython,请看下面我的代码。基本上,它是一个以主机名为参数查询API服务的脚本,然后返回一些与此服务器相关的元数据。现在,当从安装在windows机器上的Python2.7编译器执行时,它运行得非常好,也可以使用bash CLI中的CURL(这意味着URL肯定可以正常工作),但此脚本将在具有嵌入式JVM包装器的HP应用程序上运行,这意味着它将使用Jython,而不是像我的本地机器那样使用CPython——至少我认为这就是问题所在。这就是导致第一个问题的原因——SSL握手将失败,因为虽然CPython忽略证

请看下面我的代码。基本上,它是一个以主机名为参数查询API服务的脚本,然后返回一些与此服务器相关的元数据。现在,当从安装在windows机器上的
Python2.7
编译器执行时,它运行得非常好,也可以使用bash CLI中的
CURL
(这意味着URL肯定可以正常工作),但此脚本将在具有嵌入式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的东西都必须分发到所有机器上,这又增加了不可接受的开销

我发现了这个:,但坦率地说,我不太明白

我想我的问题是:为什么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显然返回带有尾随换行符的字符串,这会导致服务器以400作为响应。我想使用encode可以绕过这个问题,尽管我不明白为什么base64.encode首先会返回带有尾随新行的值

案件结案