[英]SNI (Server Name Indication) on OS X or iOS - NSURLSession CFNetwork
[英]How to implement server-side sever name indication using Security.framework under OS X/iOS
我正在嘗試在OS X
應用程序的服務器端實現服務器名稱指示:服務器應基於客戶端提供的對等主機名來選擇證書。 有人知道使用Security.framework
是否可以實現嗎? SSLSetCertificate
僅接受一個葉證書,並且我找不到基於主機名提供證書的任何回調。
例如,在openSSL中,有SSL_CTX_set_tlsext_servername_callback用於此目的。
任何幫助是極大的贊賞。
OS X 10.11
(El Capitan)中有一項新功能,使這成為可能。 令人遺憾的是,有關此功能的文檔目前為零,但我仍然發現它是如何工作的:
您必須使用以下kSSLSessionOptionBreakOnClientHello
在SSL上下文中啟用新選項kSSLSessionOptionBreakOnClientHello
:
SSLSetSessionOption(context, kSSLSessionOptionBreakOnClientHello, YES);
這導致握手在從客戶端接收到主機名后中斷,並且返回狀態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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.