我希望能够获得 ssl 证书(如果可能,+chain)以便能够显示可分辨名称并确定它是否是 EV 证书。(通过证书策略检测 EV 证书(维基百科)
据我所知,如果证书是自签名的,您只会看到一些证书详细信息。
是否可以使用 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),寻找NSURLAuthenticationMethodServerTrust
身份验证方法。
去做这个:
实现-connection:canAuthenticateAgainstProtectionSpace:
委托回调。
在你的实现中,如果保护空间的认证方式是NSURLAuthenticationMethodServerTrust
,你有两种选择:
2a. Return NO
,并让默认的 TLS 算法启动。
2b。Return YES
,在这种情况下,您的-connection:didReceiveAuthenticationChallenge:
委托回调将被调用。
如果您想在做出决定之前查看证书,您可以调用-serverTrust
保护空间对象以获取信任对象,然后使用SecTrust API获取证书链。
如果您采用路径 2b,您的-connection:didReceiveAuthenticationChallenge:
委托回调将被调用。你有两个选择:
3a。-cancelAuthenticationChallenge:
通过调用质询的发送者来禁止连接。
3b。-useCredential:forAuthenticationChallenge:
通过调用挑战的发送者来允许连接。要获取凭证,请致电-[NSURLCredential initWithTrust:]
。你在这里传递什么信任对象实际上并不重要。保护空间里的那个就行了。
您不必同步执行此操作。您可以锁定挑战并从委托回调中返回,然后在将来的某个时间解决挑战。