ssl - SSL_export_keying_material() 的 OpenSSL 编译问题

标签 ssl compilation openssl darwin

我正在尝试从 SSL 客户端程序调用 SSL_export_keying_material() 方法。但是调用此方法会导致程序编译失败。我收到以下错误。我怎样才能克服这个编译错误?

clang -cc1 version 5.1 based upon LLVM 3.4svn default target x86_64-apple-darwin13.2.0
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.
 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -macosx_version_min 10.9.0 -o withssl -lssl -lcrypto /var/folders/1b/smlgh1256t95yw11pqs2hz380000gn/T/withssl-08785c.o -lSystem /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.1/lib/darwin/libclang_rt.osx.a
Undefined symbols for architecture x86_64:
  "_SSL_export_keying_material", referenced from:
      _main in withssl-08785c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

谢谢

最佳答案

How can I over come this compilation error?

您需要安装最新版本的 OpenSSL。默认情况下,Apple 提供版本 0.9.8,但不提供 SSL_export_keying_material:

$ nm /usr/lib/libssl.dylib | grep SSL_export_keying_material
$

这是我的 1.0.1i 副本:

$ nm /usr/local/ssl/macosx-x64/lib/libssl.a | grep SSL_export_keying_material
...
0000000000002810 T _SSL_export_keying_material
00000000000068c8 S _SSL_export_keying_material.eh

以下是如何在 /usr/local/ssl 中获取并安装 OpenSSL 1.0.1i。还有其他可用的config选项。请参阅Compilation and Installation有关详细信息,请访问 OpenSSL wiki。

wget https://www.openssl.org/source/openssl-1.0.1i.tar.gz
tar xzf openssl-1.0.1i.tar.gz 
cd openssl-1.0.1i
export KERNEL_BITS=64
./config enable-ec_nistp_64_gcc_128 --openssldir=/usr/local/ssl
make
sudo make install

之后,请确保针对 /usr/local/ssl 中的 OpenSSL 设备进行编译和链接。


此外,Apple 链接器还会忽略 LD_PRELOAD-Bstatic-Wl,--rpath。请务必使用DYLD_LIBRARY_PATH(OS X 相当于LD_PRELOAD)。否则,您将针对 1.0.1(来自 /usr/local/ssl)进行编译,但在运行时链接至 0.9.8(来自 /usr/lib)。请参阅dyld(1)有关 Apple 运行时链接编辑器的一些信息。

如果您针对 1.0.1 进行编译,但针对 0.9.8 进行运行时链接,那么您将遇到无法解释的崩溃。原因并不明显,但这是因为 0.9.8 和 1.0.1 二进制不兼容。

我通常将其放入我的代码中以防止它:

long version = SSLeay();
ASSERT(version == OPENSSL_VERSION_NUMBER);
if (version != OPENSSL_VERSION_NUMBER)
{
    /* Handle incorrect version at runtime */
}

上面的代码检查编译时版本与运行时版本是否相同。

关于ssl - SSL_export_keying_material() 的 OpenSSL 编译问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26031239/

相关文章:

android - 查尔斯代理 + Android HTTPS

android - 推特连接失败

macos - 尝试编译 RtAudio 时出现 undefined symbol

iphone - pjsip在xcode4.2上的编译问题

c - EVP_get_cipherbyname 始终返回 null

ssl - Nginx反向代理错误:14077438:SSL SSL_do_handshake() failed

wordpress - 尽管正确安装了 SSL 证书,但 https 重定向到另一个页面

c++ - Borland Can't Compile,怎么回事,我都启动不了

python - 如何从 x509 证书中提取签名

random - 使 OpenSSL 生成确定性 key