在本地测试好好的代码部署到生产环境后,遇到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.dll和ssleay32.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.
- 首先安装 ActivePerl http://www.activestate.com/activeperl/downloads
- 从http://www.openssl.org/下载最新的openssl源代码包
- 在开始菜单中找到 Visual Studio 的命令提示符(Visual Studio Command Prompt),也就是vcvarsall.bat设置好x86编译需要环境变量
- 在命令提示符窗口中 切换到下载的openssl源代码包的位置
- 执行 perl configure VC-WIN32
- 执行 ms\do_ms
- 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
- 回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
- 编译成功后,就可以在out32dll目录下找到这2个DLL了, 替换掉原有的即可。
2. x64操作系统的问题
如果服务器是x64操作系统,如Windows 2008 R2, 那么由于这些dll都是x86环境下的,也会导致加载失败。
对于这类问题最简单的解决办法是,修改IIS应用程序池的设置,允许32bit代码的执行。这种方式并不好,实际上进程被限制在WOW64上运行,对性能会有影响。
最好还是编译一套x64版本的dll,这样无需修改任何IIS设置也可保证运行。
- 在开始菜单中找到 Visual Studio 的x64环境命令提示符(Visual Studio x64 Cross Tools Command Prompt ),也就是vcvarsall.bat设置好x64编译需要环境变量
- 在命令提示符窗口中 切换到下载的openssl源代码包的位置
- 执行 perl configure VC-WIN64A
- 执行 ms\do_win64a
- 用文本编辑器打开 ms目录下的 ntdll.mak. 将CFLAG中的 /MD 标识符改成 /MT
- 继续修改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
- 回到命令提示符下,继续执行 nmake -f ms\ntdll.mak 编译
- openssl编译成功后,就可以在out64dll目录下找到这2个DLL了。
- 使用GIT客户端下载最新的 OpenSSL.Net的代码, http://sourceforge.net/projects/openssl-net/
- 使用VisualStudio打开工程后,将配置管理器中的平台改为x64后编译
- 此时3个dll都有了,直接部署到x64服务器即可。
这里是使用VS2010编译后的文件下载:http://download.csdn.net/detail/wangjia184/3812878
openssl版本 1.0.0e, openssl.net版本 0.5-rc1
分享到:
相关推荐
《OpenSSL.Net 在生产环境中无法正常加载的原因分析与解决方式》配套资源。http://blog.csdn.net/wangjia184/article/details/6990098
openssl 在.NET环境下的库文件,用于在windows下实现openssl
SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。 Secure Socket Layer說明 SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。最早是...
OpenSSL分析与测试 OpenSSL分析与测试 OpenSSL分析与测试 OpenSSL分析与测试
windows 32位操作系统下安装配置openssl环境,及安装过程中一些错误解决
Windows平台OpenSSl_64位安装包,需配环境变量,可用于android系统签名文件生成JKS文件。...如果提示无法打开openssl配置文件:设置一下配置文件:set OPENSSL_CONF=C:\OpenSSL-Win64\bin\openssl.cfg
② 然后,开发者可以在当前文件夹中(OpenSSL运行文件夹),看到app_private_key.pem(开发者RSA私钥)、app_private_key_pkcs8.pem(pkcs8格式开发者RSA私钥)和app_public_key.pem(开发者RSA公钥)3个文件。...
私钥为OpenSSL生成的PEM文件,本资源用C#从文件中读取私钥并加密,可以使用。
nginx .net core3.1 rabbitmq服务器安装手册 含gcc pcre zlib openssl离线依赖包)
openssl源码分析PDF
由于工作需要,最近有空研究了一个openSSL,分别用c与java写了一个测试用例,分享给朋友,有需要的可以自行下载 下来学习。说明一点:在运用本人的c版本程序,请先按本配好openssl的lib库,可以参考本人的这篇 ...
Windows下可以直接运行的OpenSSL.exe,打开后直接输入命令就可以操作证书,
Win7环境中安装OpenSSL的详细步骤
在生产环境中,有时会需要用到自签名的证书,而谷歌浏览器从2016年开始就降低了sha1的算法级别,openssl默认使用的是sha1的算法。 bio = BIO_new_connect("hostname:port"); if(bio == NULL) { /* Handle the ...
从http://slproweb.com/products/Win32OpenSSL.html下载的Win64OpenSSL_Light-3_0_4和Win64 OpenSSL v3.0.4 Win64 OpenSSL v3.0.4 Light包含最常用的基本功能 Win64 OpenSSL v3.0.4功能较全,适合软件开发人员
安装openssl和openssl-develd 的依赖包,解决nginx https代理等问题
OpenSSL 在windows10环境下用Visual Studio 2017编译成功的链接库,包括32/64位的动/静态链接库,共四个。
openssl中文简介.doc
openssl是当前非常流行的SSL密码库工具,如果服务器或者网站需要使用https协议,就需要使用openssl工具生成证书