我试图在OS X应用程序的服务器端实现服务器名称指示:服务器应该根据客户端提供的对等主机名选择证书。有人知道是否可以使用Security.framework实现这一点吗?SSLSetCertificate只需要一个叶证书,而我无法找到任何基于主机名提供证书的回调。
例如,在openSSL中,有用于此目的的SSL_CTX_set_tlsext_servername_callback。
任何帮助都是非常感谢的。
发布于 2015-10-28 21:43:35
OS X 10.11 (El Capitan)中有一个新特性,这使得这成为可能。遗憾的是,目前没有关于这个特性的文档,但我还是发现它是如何工作的:
您必须在SSL上下文中启用新选项kSSLSessionOptionBreakOnClientHello:
SSLSetSessionOption(context, kSSLSessionOptionBreakOnClientHello, YES);这将导致握手在is从客户端接收到主机名后中断,并返回状态errSSLClientHelloReceived。然后您可以获得主机名,使用它查找适当的证书并将证书应用于上下文。然后你可以继续握手。
OSStatus status = SSLHandshake(context);
// ...
if(status == errSSLClientHelloReceived)
{
size_t hostnameLength;
SSLGetPeerDomainNameLength(context, &hostnameLength);
char hostname[hostnameLength];
SSLGetPeerDomainName(context, hostname, &hostnameLength);
SecIdentityRef cert = ... ; // Look up certificate using hostname
SSLSetCertificate(context, (__bridge CFArrayRef)@[(__bridge id) cert]);
// Repeat from start by calling SSLHandshake
}https://stackoverflow.com/questions/33388718
复制相似问题