Windows 7中的哪个文件对应于linux文件ssl.so?

时间:2013-10-30 18:42:22

标签: ruby linux ssl windows-7

问题似乎是在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

3 个答案:

答案 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,这句话“对你来说太糟糕了”:)