问题似乎是在Linux中,OpenSSL包含一个文件ssl.so,但Windows OpenSSL没有等效文件。
我有一个在Ubuntu 12.04上正常运行的ruby程序但在Windows 7上失败并显示以下消息:
C:\Ruby200-x64\code>ruby ssl-bug.rb
C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/ffi-1.9.1/lib/ffi/library.rb:154:in `blo
ck in ffi_lib': Could not open library 'ssl': The specified module could not be
(LoadError)
.
Could not open library 'ssl.dll': The specified module could not be found.
from C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/ffi-1.9.1/lib/ffi/library.r
b:121:in `map'
from C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/ffi-1.9.1/lib/ffi/library.r
b:121:in `ffi_lib'
from ssl-bug.rb:5:in `<module:OpenSSL_EC>'
from ssl-bug.rb:3:in `<main>'
这是一个简短的例子(ssl-bug.rb),它可以在Ubuntu 12.04上运行,但不能在Windows 7上运行,产生上述错误:
require 'ffi'
module OpenSSL_EC
extend FFI::Library
ffi_lib 'ssl'
end
答案 0 :(得分:2)
ECSDA函数位于OpenSSL文件“libeay32.dll”中。如果你检查dll的导出,你可以看到这个。在这里,我使用Visual Studio命令行中的“dumpbin”:
> dumpbin /exports libeay32.dll
产生此输出:
...
Dump of file libeay32.dll
...
ordinal hint RVA name
...
3620 2CD 00044030 ECDSA_OpenSSL
3455 2CE 00044BC0 ECDSA_SIG_free
3395 2CF 00044BA0 ECDSA_SIG_new
3440 2D0 00044C40 ECDSA_do_sign
3671 2D1 00044BE0 ECDSA_do_sign_ex
3672 2D2 00044DE0 ECDSA_do_verify
3522 2D3 00044EF0 ECDSA_get_default_method
3509 2D4 00045330 ECDSA_get_ex_data
3744 2D5 00045270 ECDSA_get_ex_new_index
3625 2D6 00044EE0 ECDSA_set_default_method
3739 2D7 000452A0 ECDSA_set_ex_data
3731 2D8 00045100 ECDSA_set_method
3719 2D9 00044D00 ECDSA_sign
3403 2DA 00044C80 ECDSA_sign_ex
3416 2DB 00044D80 ECDSA_sign_setup
3706 2DC 000451A0 ECDSA_size
3666 2DD 00044E40 ECDSA_verify
因此,在Windows上,您必须在Ruby代码中使用libeay32
而不是ssl
:
require 'ffi'
module OpenSSL_EC
extend FFI::Library
ffi_lib 'libeay32'
end
就我不熟悉FFI而言,这是我能得到你的。
答案 1 :(得分:-1)
我认为安装openssl会对你有所帮助。顺便说一句,我从未在红宝石中写过任何东西。
答案 2 :(得分:-1)
基于Windows和Unix的操作系统完全是两回事。 Windows 7是带有NT子系统的NT OS(如果x86_64则为两个),它由WIN32组成(如果可以运行64位PE,则为+ WIN64)。
Windows子系统提供了一组定义良好的API,称为WINAPI(不包含.NET或DirectX等内容)。例如,用于处理Networking API的API称为Winsock
加密Api的主要API称为CyptoAPI(另请参阅http://msdn.microsoft.com/en-uk/library/aa388162(v=vs.85).aspx)。它的大多数功能都位于%SystemRoot%\ System32 \ Crypt32.dll中(除非您在64位Windows版本上使用32位二进制文件)。
我试图寻找SSL函数/ c ++类,但我还没有找到它们(也许有部分.Net或其他东西)
实际上,您不希望使用Windows子系统Native功能。你试图在windows下运行ruby。我不知道你正在使用哪个编译器,但它似乎不是cl(在Microsoft Visual Studio中使用)。 OpenSSL是一种提供加密C函数的API。 Windows正在使用不同的,所以,它不起作用,因为它是链接器在SSL共享对象文件中寻找的OpenSSL函数。
您目前想要使用的程序是为在POSOS等Unix操作系统中使用API而编写的。
微软为此设计了几个东西:
SUA将为基本系统提供X11 gcc和make。编译ruby所需的许多库都将丢失。因此,您可能希望在此packages上搜索一些预编译的site。
另一种方法是让系统识别ELF格式并包装允许在不进行仿真的情况下运行linux binaries的linux系统调用。但是,由于你使用的是Windows 7,这句话“对你来说太糟糕了”:)