python使ssl崩溃

时间:2015-01-11 08:12:52

标签: python ssl bitcoin

以下脚本导致笔记本电脑出现分段错误:

import ctypes
from bitcoin.core.key import NID_secp256k1
ssl = ctypes.cdll.LoadLibrary(ctypes.util.find_library ('ssl') or 'libeay32')
ssl.i2o_ECPublicKey(ssl.EC_KEY_new_by_curve_name(NID_secp256k1), 0)

这段代码来自python-bitcoinlib(https://github.com/petertodd/python-bitcoinlib)。 我没有打开项目本身的票证,因为崩溃来自libcrypto.so.1.0.0的 i2o_ECPublicKey 外部函数。

我使用的是Ubuntu 14.04,libcrypto.so.1.0.0,python 3.4。我也尝试过使用python 2,结果与我预期的完全相同。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

以下是i2o_ECPublicKey()的OpenSSL文档。这些文档适用于C程序员,但它们仍然包含Python程序员的有用信息(但我承认,如果你知道C :)它会有所帮助)。

正如那些文档所述,i2o_ECPublicKey()的第二个arg应该是指向输出缓冲区的指针;如果将NULL作为第二个arg传递给i2o_ECPublicKey(),它只返回输出缓冲区所需的字节数;您应该保存该返回值,以便可以使用正确大小的正确初始化缓冲区重新调用i2o_ECPublicKey。要使用Python ctypes传递NULL,您需要使用None。我 怀疑 0传递给期望指针的lib函数可能会使事情混乱,并带来灾难性的结果。

因此将其替换为上述代码:

import ctypes
from bitcoin.core.key import NID_secp256k1
ssl = ctypes.cdll.LoadLibrary('/usr/lib/x86_64-linux-gnu/libssl.so')
eckey = ssl.EC_KEY_new_by_curve_name(NID_secp256k1)
keysize = ssl.i2o_ECPublicKey(eckey, None)

并查看是否可以避免段错误。如果可行,您可以使用create_string_buffer(keysize)初始化实际的输出缓冲区。

答案 1 :(得分:0)

在Windows上遇到这些库的问题。最终使用define service{ use generic-service host_name alphprdfuse1i service_description Container Delta FADEC Broker Health check_command check_nrpe!check_remote_container_broker_health!-a "--user deltafadec --password B@dM0nk3y --url http://localhost:9093/jolokia --mbean org.apache.activemq:type=Broker,brokerName=amq,service=Health --attribute CurrentStatus --string --critical" "Good" } 库结束。那个人开箱即用。