我正在使用CFStream/NSStream建立超文本传输协议连接。我希望能够检测到SSL握手失败的三种情况:
今天,如果不对我的CFStream的SSL属性进行任何操作,我会得到:
有没有办法配置CFStream来正确区分这3种情况?或者在SSL握手期间进行一些回调?
谢谢你的帮助。
不久前,我在使用SSL的CFSockets中遇到了同样的问题。CFStream处理所有握手内容。我为NSStream编写了一个小类添加(基本代码来自Apple,不再有链接,如果我找到它,我会添加它)。这就是我的工作。
接口
@interface NSStream (FSNetworkAdditions)
+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
port:(NSInteger)port
inputStream:(out NSInputStream **)inputStreamPtr
outputStream:(out NSOutputStream **)outputStreamPtr;
@end
和实施
#import "FSNetworkAdditions.h"
@implementation NSStream (FSNetworkAdditions)
+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
port:(NSInteger)port
inputStream:(out NSInputStream **)inputStreamPtr
outputStream:(out NSOutputStream **)outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
assert(hostName != nil);
assert( (port > 0) && (port < 65536) );
assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
readStream = NULL;
writeStream = NULL;
CFStreamCreatePairWithSocketToHost(
NULL,
(CFStringRef) hostName,
port,
((inputStreamPtr != NULL) ? &readStream : NULL),
((outputStreamPtr != NULL) ? &writeStream : NULL)
);
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
//kCFNull,kCFStreamSSLPeerName,
kCFStreamSocketSecurityLevelSSLv3, kCFStreamSSLLevel,
[NSNumber numberWithBool:YES], kCFStreamPropertyShouldCloseNativeSocket,
nil];
if (readStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
}
if (writeStream) {
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
}
if (inputStreamPtr != NULL) {
*inputStreamPtr = CFBridgingRelease(readStream);
}
if (outputStreamPtr != NULL) {
*outputStreamPtr = CFBridgingRelease(writeStream);
}
}
@end
就这样,现在您可以像这样连接到服务器:
NSInputStream *inputStream;
NSOutputStream *outputStream;
[NSStream qNetworkAdditions_getStreamsToHostNamed:host
port:port
inputStream:&inputStream
outputStream:&outputStream];
inputStream.delegate = self;
outputStream.delegate = self;
其中“self”符合NSStreamDelegate协议。
我希望这些片段能有所帮助。
线程“main”javax.net.ssl.SSLHandShakeException中的异常:没有共同的密码套件 列出的密码如下
我想使用客户端证书对每个目录的身份验证进行故障排除。我特别想知道服务器发送哪些可接受的客户端证书。 如何调试SSL握手,最好使用cURL?
我正在学习SSL通信,我遇到了这个问题。我正在编写一个简单的客户端,它试图与本地apache服务器握手。服务器启用https。我将服务器证书添加到所有可能的信任存储(jdk中的一个 注意:我从以下教程中获取了代码: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#KRB 停留
我通过受ssl v3保护的cxf使用soap服务。我从服务器下载.cer文件,并通过keytool使用以下指令创建JKS文件: 在java代码中,我将此代码用于客户端配置: 对于调用此代码的服务: 当我运行代码时,会发生此错误: 我搜索此错误,我意识到该错误是针对不良信任存储的。但我不知道如何生成正确的信任库。
我尝试为Dovecot启用SSL。因此,我使用OpenSSL生成/安装证书。但是当我试图测试conncection时,客户机报告错误。也许有人能帮我。指引我正确的方向? 命令行输入:openssl s_client-connect localhost:pop3s 结果/错误: Dovecot版本:2.0.9 Openssl版本:1.0.1e-FIPS2013年2月11日 SSL的Dovecot配置
我正在尝试连接安装在OSX机器中的贾斯珀软件工作室5.5中在SSL下运行的贾斯珀服务器5.5。我收到错误: javax . net . SSL . SSL handshake异常:sun . security . validator . validator异常:PKIX路径构建失败:sun . security . provider . cert path . suncertpathbuilder