Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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
Ruby Windows 7中的哪个文件对应于linux文件ssl.so?_Ruby_Linux_Ssl_Windows 7 - Fatal编程技术网

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

Ruby Windows 7中的哪个文件对应于linux文件ssl.so?,ruby,linux,ssl,windows-7,Ruby,Linux,Ssl,Windows 7,问题似乎是,在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':

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

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

基于Windows和Unix的操作系统完全是两码事。Windows 7是一个NT操作系统,具有一个NT子系统或两个(如果x86_64)子系统,如果可以运行64位PEs,则包含WIN32+WIN64。 windows子系统提供了一组定义良好的API,该API被调用,不包含.NET或DirectX之类的内容。例如,用于处理网络API的API称为Winsock。 加密API的主API称为See。它的大多数函数位于%SystemRoot%\System32\中,除非您在64位windows版本上使用32位二进制文件。 我试图寻找SSL函数/c++类,但我还没有找到它们,可能是.Net的一部分或其他内容

实际上,您不想使用windows子系统本机函数。您正在尝试让ruby在windows下运行。我不知道您使用的是哪种编译器,但它似乎不是Microsoft Visual Studio中使用的cl。OpenSSL是一个API,提供加密C函数。Windows使用的是不同的函数,因此它无法工作,因为链接器在SSL共享对象文件中查找的是OpenSSL函数

您当前想要使用的是为使用Unix操作系统(如POSIX)中的API而编写的程序

Microsoft为此设计了几项功能: 将给出一个带有X11 gcc和make的基本系统。编译ruby所需的许多库将丢失。因此,您可能需要搜索一些在此基础上预编译的内容


另一种方法是让系统识别ELF格式并包装linux系统调用,这些调用允许在不进行仿真的情况下运行。但是由于您使用的是windows 7,这句话对您来说太糟糕了

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,所以我只能告诉您这些。

您需要哪些导出函数?ECDSA函数可以从私钥生成公钥。它可能被称为libssl32.dll或类似的函数。。。似乎肯定是最新的.Net运行时版本的一部分,该版本远未在任何地方安装……我尝试的第一件错误是安装OpenSSL,Windows rubyinstaller.org安装提供了一些带有gem安装SSL的SSL文件。只是不是ssl.dll,而且提供的文件即使重命名也不起作用。我知道Windows和UNIX是不同的。这就是为什么我使用Ruby FFI库来编写我的扩展——因为FFI扩展是多平台和多实现的。我不想让ruby在Windows下运行。我的ruby在Windows和Linux下都运行,它在这两个平台上都运行,只是动态库ssl.0在Linux下似乎没有相应的动态库ssl.dll在Windows下。再说一次:如果你读对了我的文章,你应该明白Windows中不存在openSSL函数SystemRoot%\System32\crypt32.dll没有所有本机windows加密函数/c++类,而且ssl函数可能是附加组件(如.Net runtime)的一部分。如果要使用openssl函数,则应使用Unix环境。为此,微软在windows上设计了SUA。如果你真的想继续下去,那么你可以把CuthT32.DLL看作是可以等同于SSL的东西。所以,但它不能解决你的问题。OpenSSL可以用于Windows,正如上面的评论指出的那样,我安装了它。目前,我正在使用Linux环境运行我的程序,但也可以使用Windows环境运行它-这就是跨平台支持背后的想法。对不起,即使使用OpenSSL for Windows,您将使用Unix环境:当前的二进制文件实现将使用MainGW或cygw,大多数程序都使用它们。这些操作不需要创建NT子系统,因此它意味着转换POSIX->WinAPI->NT API。通过使用Microsoft实现,您仍将使用windows子系统,但某些部分将使用NT API。如果你懒惰,你可以在你的应用程序中将openssl DLL与cygwin DLL捆绑在一起。从POSIX到WINAPI的真正移植意味着几乎从头开始重写。对于那些没有安装Openssl或者没有将其与应用程序捆绑在安装程序中的人来说,它是不起作用的。他/她要求的是windows版本。@user2284570-除非我错过了,否则OP从未说过OpenSSL不会或不能安装。这看起来很有希望。我会调查的
再晚一点。这开始有了进展:我得到了C:/Ruby200-x64/lib/ruby/gems/2.0.0/gems/ffi-1.9.1/lib/ffi/library.rb:282:in'att ach_function':函数“SSL_library_init”在[libeay32]ffi::NotFoun dError中找不到,这很奇怪,因为您的函数转储显示它应该在那里。我将尝试获取更新的libeay32如果您确实想检查,Microsoft支持工具提供了Dependency walker dependens.exe。它允许您在PE文件中查看导出的符号,并查看是否可以满足所有导入条目。
require 'ffi'

module OpenSSL_EC  
  extend FFI::Library
  ffi_lib 'libeay32'
end