2016-09-07 14 views
0

サーバモードでSSLで保護されたソケットを実装しようとしています。使用された証明書は、プログラムによって一度生成され、Keychainに格納される、自己署名する必要があります。SSLハンドシェークのOS X Keychainアクセスプロンプト

私はCocoaAsyncSocket(https://github.com/robbiehanson/CocoaAsyncSocket)を使用しています。これは内部的にSSLContextとネイティブセキュリティフレームワークの関連するものを使用しています。自己署名証明書の生成については は私がMyUtilitiesからMYGetOrCreateAnonymousIdentity機能迅速で接続を確保するコードは次のようになります(https://github.com/snej/MYUtilities/blob/master/MYAnonymousIdentity.h

を使用します。

var error: NSError? = nil 
if let identity = MYGetOrCreateAnonymousIdentity("MyIdentity", 60.0 * 60.0 * 24.0 * 365.0 * 10.0, &error)?.takeUnretainedValue() { 

    var certificateOpt: SecCertificate? = nil 
    SecIdentityCopyCertificate(identity, &certificateOpt) 

    // Secure the socket 
    let settings: [String:NSObject] = [ 
     kCFStreamSSLCertificates as String: self.sslCertificates as NSArray, 
     kCFStreamSSLIsServer as String: NSNumber(value: true) 
    ] 
    socket.startTLS(settings) 

} 
else { 
    Swift.print("Failed to get certificates for SSL: \(error)") 
    return nil 
} 

コードが正常に動作するようです:自己署名証明書キーチェーンに作成されて保存されると、ソケットを介したセキュリティ保護された通信も正常に機能しているようです。

問題は、SSLハンドシェイク(SSLHandshake機能のどこかで)中に、キーの使用許可を求めるキーチェーンのプロンプトが表示されていることです(署名には"<key>")。キーチェーンを調べると、"<key>"のキーは私のプログラムで作成されたキーではなく、他のキーと思われます。

なぜ"<key>"キーがここで使用されていますか、どのようにユーザーに表示されるのを避けることができますか?

答えて

0

ええと、いくつかの遊びの後で、証明書を削除して再作成すると、その問題は解消されたようです。キーチェーン内の証明書が何らかの形で壊れているか誤って設定されている可能性があります