如何检索iOS中的ssl服务器证书?

我希望能够获得ssl证书(如果可能的话+链)能够显示辨别名称,并确定它是否是EV证书。 (通过证书策略检测EV证书( wikipedia )

从我所见过的情况来看,如果证书是自签名的,你只能得到一些证书的详细信息。

是否有可能使用CFNetwork这样的低层来检索证书?

通过macnetworkprog.lists.apple.com邮件列表http://web.archiveorange.com/archive/v/x0fiWEI9emJFc36DY0UP,并在开发者论坛中提到了一些地方

那么,默认的TLS安全策略应该是足够的,但是如果你想参与这个过程,你可以通过实现-connection:canAuthenticateAgainstProtectionSpace:-connection:didReceiveAuthenticationChallenge:来实现(在iPhone OS 3.0和更高版本以及Mac OS X 10.6上) -connection:didReceiveAuthenticationChallenge:委托callback,寻找NSURLAuthenticationMethodServerTrustvalidation方法。

去做这个:

  1. 实现-connection:canAuthenticateAgainstProtectionSpace:委托callback。

  2. 在你的实现中,如果保护空间的authentication方法是NSURLAuthenticationMethodServerTrust ,你有两个select:

    2A。 返回NO ,并让默认的TLSalgorithm踢入。

    2B。 返回YES ,在这种情况下,您的-connection:didReceiveAuthenticationChallenge:委托callback将被调用。

如果要在做出决定之前查看证书,可以调用保护空间对象上的-serverTrust来获取信任对象,然后使用SecTrust API获取证书链。

  1. 如果你采取path2b,你的-connection:didReceiveAuthenticationChallenge:委托callback将被调用。 你有两个select:

    3A。 通过在挑战的发件人上调用-cancelAuthenticationChallenge:禁止连接。

    3B。 通过在挑战的发件人上调用-useCredential:forAuthenticationChallenge:来允许连接。 要获得证书,请调用-[NSURLCredential initWithTrust:] 。 实际上你在这里传递的信任对象并不重要, 来自保护区的人会做。

您不必同步执行此操作。 您可以locking挑战并从您的委托callback中返回,然后在将来某个时候解决挑战。