簡體   English   中英

如何在OS X / iOS下使用Security.framework實現服務器端服務器名稱指示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM