首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OS X/iOS下使用Security.framework实现服务器端服务器端的名称指示

如何在OS X/iOS下使用Security.framework实现服务器端服务器端的名称指示
EN

Stack Overflow用户
提问于 2015-10-28 10:34:01
回答 1查看 205关注 0票数 1

我试图在OS X应用程序的服务器端实现服务器名称指示:服务器应该根据客户端提供的对等主机名选择证书。有人知道是否可以使用Security.framework实现这一点吗?SSLSetCertificate只需要一个叶证书,而我无法找到任何基于主机名提供证书的回调。

例如,在openSSL中,有用于此目的的SSL_CTX_set_tlsext_servername_callback。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 21:43:35

OS X 10.11 (El Capitan)中有一个新特性,这使得这成为可能。遗憾的是,目前没有关于这个特性的文档,但我还是发现它是如何工作的:

您必须在SSL上下文中启用新选项kSSLSessionOptionBreakOnClientHello

代码语言:javascript
复制
SSLSetSessionOption(context, kSSLSessionOptionBreakOnClientHello, YES);

这将导致握手在is从客户端接收到主机名后中断,并返回状态errSSLClientHelloReceived。然后您可以获得主机名,使用它查找适当的证书并将证书应用于上下文。然后你可以继续握手。

代码语言:javascript
复制
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 
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33388718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档