OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决 z

http://blog.csdn.net/wangjia184/article/details/6990098

http://www.openssl.org/

在本地测试好好的代码部署到生产环境后,遇到OpenSSL.Net不能加载的错误。

Could not load file or assembly ‘ManagedOpenSsl‘ or one of its dependencies. An attempt was made to load a program with an incorrect format.

ManagedOpenSsl.dll 是一个对 unmanaged的libeay32.dllssleay32.dll 进行包装的Assembly.

它通过P/Invoke调用openssl的dll导出函数,并提供对.Net友好的对象封装方式

而这个错误一般由以下两点原因造成的:

1.  libeay32.dll 和 ssleay32.dll 这两个动态库使用动态链接VC Runtime的方式编译的,因为服务器上没有安装VC++ Runtime而导致加载失败。

2. 服务器操作系统是x64,而这些动态库却是x86的,导致加载失败。

对于这两个原因,下面逐步说明解决方式。

1. VC 运行时(Runtime)依赖性的问题



如果使用Depends.exe查看 从http://openssl-net.sourceforge.net/ 上下载的两个非托管DLL文件,会发现它们都引用了MSVER100.dll, 而此DLL却不是系统自带的。

要解决这个问题,可以使用静态链接VC Runtime的方式编译自己需要的openssl dll.

  1. 首先安装 ActivePerl http://www.activestate.com/activeperl/downloads
  2. http://www.openssl.org/下载最新的openssl源代码包
  3. 在开始菜单中找到 Visual Studio 的命令提示符(Visual Studio Command Prompt),也就是vcvarsall.bat设置好x86编译需要环境变量
  4. 在命令提示符窗口中 切换到下载的openssl源代码包的位置
  5. 执行  perl configure VC-WIN32
  6. 执行 ms\do_ms
  7. 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
  8. 回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
  9. 编译成功后,就可以在out32dll目录下找到这2个DLL了, 替换掉原有的即可。

2. x64操作系统的问题



如果服务器是x64操作系统,如Windows 2008 R2, 那么由于这些dll都是x86环境下的,也会导致加载失败。

对于这类问题最简单的解决办法是,修改IIS应用程序池的设置,允许32bit代码的执行。这种方式并不好,实际上进程被限制在WOW64上运行,对性能会有影响。

最好还是编译一套x64版本的dll,这样无需修改任何IIS设置也可保证运行。

    1. 在开始菜单中找到 Visual Studio 的x64环境命令提示符(Visual Studio x64 Cross Tools Command Prompt ),也就是vcvarsall.bat设置好x64编译需要环境变量
    2. 在命令提示符窗口中 切换到下载的openssl源代码包的位置
    3. 执行  perl configure VC-WIN64A
    4. 执行 ms\do_win64a
    5. 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
    6. 继续修改ntdll.mak
      # The output directory for everything intersting
      OUT_D=out64dll
      # The output directory for all the temporary muck
      TMP_D=tmp64dll
      # The output directory for the header files
      INC_D=inc64
      INCO_D=inc64\openssl
    7. 回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
    8. openssl编译成功后,就可以在out64dll目录下找到这2个DLL了。
    9. 使用GIT客户端下载最新的 OpenSSL.Net的代码, http://sourceforge.net/projects/openssl-net/
    10. 使用VisualStudio打开工程后,将配置管理器中的平台改为x64后编译
    11. 此时3个dll都有了,直接部署到x64服务器即可。
时间: 2024-12-20 06:14:42

OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决 z的相关文章

生产环境中的PHP WEB 简单架构

使用三台虚拟机器, Ubuntu1(nginx) 192.168.226.128 Ubuntu2(php-fpm+memcached)192.168.226.132 CentOS(MySQL)192.169.226.130 PHP 框架使用CakePHP,这个是很常用的MVC 框架,基于事件的分发模型 当然需要注意的是框架代码要部署在php-fpm机器上,需要在nginx 中配置的配置如下 余下的内容: 1. CakePHP 框架代码 2. PHP 内核 3. Nginx内核 4. 数据库设计模

[virtualenv]生产环境中使用virtualenv

virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中我最喜欢的东西之一就是可以使用 virtualenv 去创建隔离的环境.非常简单的就可以在不同的项目中部署不同的python类库. 有一个比较棘手的问题就是在生产环境中使用virtualenv 部署几个不同的服务有一些配置上的不同. 于是我就从我的项目中收集了几种不同的服务的不同配置方式. 可以肯定

生产环境中CentOS7部署NET Core应用程序

NET Core应用程序部署至生产环境中(CentOS7) 阅读目录 环境说明 准备你的ASP.NET Core应用程序 安装CentOS7 安装.NET Core SDK for CentOS7. 部署ASP.NET Core应用程序 配置Nginx 配置守护服务(Supervisor) 这段时间在使用Rabbit RPC重构公司的一套系统(微信相关),而最近相关检验(逻辑测试.压力测试)已经完成,接近部署至线上生产环境从而捣鼓了ASP.NET Core应用程序在CentOS上的部署方案,今天

理解Docker(6):若干企业生产环境中的容器网络方案

本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 (4)Docker 容器的隔离性 - 使用 cgroups 限制容器使用的资源 (5)Docker 网络 (6)若干企业生产环境中的容器网络方案 Docker 在早期只有单机上的网络解决方案,在 1.19 版本引入了原生的 overlay 网络解决方案,但是它的性能损耗较大,可能无法适应一些生产环

生产环境中使用脚本实现tomcat start|status|stop|restart

一.在实际生产环境中tomcat启动是在bin目录下采用自带脚本startup.sh启动:使用shutdown.sh关闭.如下图: 再如果对于新手来讲在不知道路径情况下重启是一件头痛的事情(注意没有reload,所以重启只能shutdown.sh在startup.sh):而且这里还有一个坑等着: 什么坑呢?   如图: tomcat服务是启动成功了的.那么我想停止服务用shutdown.sh,会出现什么呢? 进程还在而且成为了僵尸进程,万恶啊?居然关不了,终极方法kill -9 进程号.试试?

生产环境中tomcat的配置

生产环境中要以daemon方式运行tomcat 通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/shutdown.sh来关闭tomcat. 而在生产环境中,我们要配置tomcat使其以daemon方式运行,这是因为: 以daemon运行不受终端影响,不会因为退出终端而停止运行 可以让tomcat以普通用户身份运行,可以让tomcat随linux启动而启动 如何将tomcat配置成守护进程 将tom

在生产环境中安全执行更新删除SQL脚本的技巧

今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧,现在分享出来. 我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的. 我注意到运营中心的人在拿到我的SQL语句后,把它放到MS

.NET跨平台之旅:生产环境中第2个跑在Linux上的ASP.NET Core站点

今天我们在生产环境中上线了第2个跑在Linux上的ASP.NET Core站点.这是一个简单的Web API站点,通过命令行的方式调用安装在Linux服务器上的程序完成操作.之前用的是nodejs,现在换成了ASP.NET Core,主要代码如下: var psi = new ProcessStartInfo(command, arguments) { RedirectStandardOutput = true, RedirectStandardInput = true, CreateNoWin

.NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点

2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上用V2015开发的,以self-contained应用部署方式发布到Linux服务器.Linux服务器用的是Ubuntu 14.04,站点通过supervisor以服务方式运行,部署在2台阿里云服务器上,用了1台阿里云内网负载均衡. 虽然是很简单的站点,虽然是很小的一步,但是进入生产环境就意味着对性