1

问题似乎是在 Linux 中,OpenSSL 包含一个文件 ssl.so,但 Windows OpenSSL 没有等效文件。

我有一个 ruby​​ 程序在 Ubuntu 12.04 上运行良好,但在 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>'

这是在 Ubuntu 12.04 上运行良好但不能在 Windows 7 上运行的程序类型的简短示例 (ssl-bug.rb),生成上述错误:

 require 'ffi'

 module OpenSSL_EC  
   extend FFI::Library
   ffi_lib 'ssl'
 end
4

3 回答 3

3

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。

于 2013-11-06T00:53:57.280 回答
-1

我认为安装 openssl 应该对您有所帮助。顺便说一句,我从来没有用红宝石写过任何东西。

于 2013-10-30T21:04:22.457 回答
-2

Windows 和基于 Unix 的操作系统完全是两个不同的东西。Windows 7 是一个 NT 操作系统,带有一个 NT 子系统(如果 x86_64 则为两个),它由 WIN32 组成(如果可以运行 64 位 PE,则为 WIN64)。
Windows 子系统提供了一组定义良好的 API,称为WINAPI(不包含 .NET 或 DirectX 之类的东西)。例如,处理网络 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 子系统的原生功能。您正试图让 ruby​​ 在 Windows 下运行。我不知道您使用的是哪个编译器,但它似乎不是 cl(在 Microsoft Visual Studio 中使用)。OpenSSL 是一个提供加密 C 函数的 API。Windows 使用不同的所以,它不会工作,因为它是链接器在 SSL 共享对象文件中寻找的 OpenSSL 函数。

您当前想要使用的程序是为使用 POSIX 等 Unix OS 中存在的 API 而编写的。


微软为此设计了几样东西: SUA将提供一个带有 X11 gcc 和 make 的基础系统。许多编译 ruby​​ 所需的库将丢失。因此,您可能希望在此站点上搜索一些预编译的

另一种方法是让系统识别 ELF 格式并包装 linux 系统调用,从而允许在没有仿真的情况下运行linux 二进制文件。但是由于您使用的是 Windows 7,因此这句话“对您来说太糟糕了” :)

于 2013-11-05T00:45:12.097 回答