サーバモードで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>"
キーがここで使用されていますか、どのようにユーザーに表示されるのを避けることができますか?