4

GCDAsyncSocket を使用して単純な TLS サーバーを作成し、クライアントの公開鍵を取得したいと考えています。私はこれを使ってみました:

- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    SSLContextRef ref = [sock sslContext];
    SecTrustRef trust;
    SSLCopyPeerTrust(ref, &trust);

    SecKeyRef key = SecTrustCopyPublicKey(trust);
    NSLog(@"%@",key);
}

しかし、私は SecTrustCopyPublicKey メソッドで exc_bad_access を取得します。公開鍵を NSString/NSData として取得するにはどうすればよいですか?

4

1 に答える 1

0
  1. SSL 接続があることを確認しますか? didSecureデリゲート メソッドは呼び出されていますか?
  2. trust参照が関数の実行NULL後にないことを確認してください。SSLCopyPeerTrust
  3. Apple が提供するSecTrustCopyPublicKeyCertificate , Key, and Trust Services Referenceに関する議論があります。

この関数を呼び出す前に、 SecTrustEvaluate関数を呼び出す必要があります。この関数を呼び出すと、信頼評価が失敗した場合でも、リーフ証明書の公開キーを返そうとします。信頼の評価が成功した場合でも、この関数は NULL を返すことがあります。たとえば、何らかの理由でリーフ証明書のキーを抽出できない場合です。

于 2014-12-02T11:44:59.517 に答える