我需要打开一个CFStream套接字连接到具有不受信任CA根的服务器。我有服务器的证书,我可以从它创建一个SecCertificateRef结构。问题是如何设置流的属性。
我认为我应该将kCFStreamPropertySSLSettings属性设置为包含kCFStreamSSLCertificates键的CFDictionary。根据文档,这个键应该包含一个“CFArray of SecCertificateRefs,除了数组中的第一个元素,它是一个SecIdentityRef”。现在我可以从服务器的证书中创建SecCertificateRef,我将随应用程序一起发布该证书,但是如何获得SecIdentityRef呢?我想应该是客户端身份,但我现在绝对不想要客户端身份验证。我也找不到一种方法,只给CFStream提供服务器证书。
注意,我不想将不受信任的证书添加到密钥链中,也不想在设置中禁用kCFStreamSSLValidatesCertificateChain。如果服务器身份验证是基于从磁盘加载的自己的服务器证书数据,并且仅基于此CFStream,则需要接受服务器身份验证。
发布于 2012-03-16 12:07:10
我对你的问题没有直接的答案,但也许没有什么指导方针:
为什么需要使用NSURLConnection API而不是更直观的
根据我在文档中可以找到的内容,它与Mac中可用的所有东西(关于CFStream API )都不是iOS可用的东西一样。因此,考虑一下,看看是否可以切换到NSURLConnection :-)
方法来获得SSL挑战并自己验证证书。您可以检查wsdl2objc项目,我在这里实现了以下特性:
- The project: [http://code.google.com/p/wsdl2objc/](http://code.google.com/p/wsdl2objc/)
- Some guidelines on how to get the certificate references: [http://code.google.com/p/wsdl2objc/wiki/AdvancedOptions](http://code.google.com/p/wsdl2objc/wiki/AdvancedOptions)
我不知道如何在kCFStreamPropertySSLSettings.中设置自定义(不可信) CA我不确定是否可以通过使用kCFStreamSSLCertificates来实现,因为它用于设置客户端证书(因此需要在索引0上设置SecIdentityRef,这基本上提供了私钥)。当您说不想将证书添加到密钥链时,
在我的应用程序中,我使用NSURLConnectionDelegate手动验证不受信任的证书。
致以敬意,
皮斯
发布于 2013-08-21 16:20:59
基本上你必须:
使用kCFStreamSSLValidatesCertificateChain
kCFStreamPropertySSLPeerTrust),一旦连接到流(但在发送任何数据(例如,在kCFStreamEventCanAcceptBytes或kCFStreamEventHasBytesAvailable事件上)之前),将自签名根证书设置为该信任object
SecTrustEvaluate),并检查结果是kSecTrustResultProceed还是kSecTrustResultUnspecifiedhttps://stackoverflow.com/questions/9618886
复制相似问题