objective-c – 通过套接字与ESMTP协商TLS

objective-c – 通过套接字与ESMTP协商TLS,第1张

概述我有一个简单的SMTP客户端,我试图添加TLS支持.我不确定客户端发出’STARTTLS’命令后会发生什么.大多数来源(包括RFC本身)将其描述为TLS会话的协商,但这并不是特别清楚. 怎么去做这个?我的客户端是用Objective C编写的,并使用Cocoa的流对象(套接字的包装器). Cocoa流能够将TLS指定为具有NSStream的setProperty函数的套接字安全级别系统. 但是,似 我有一个简单的SMTP客户端,我试图添加TLS支持.我不确定客户端发出’STARTTLS’命令后会发生什么.大多数来源(包括RFC本身)将其描述为TLS会话的协商,但这并不是特别清楚.

怎么去做这个?我的客户端是用Objective C编写的,并使用Cocoa的流对象(套接字的包装器). Cocoa流能够将TLS指定为具有Nsstream的setProperty函数的套接字安全级别系统.

但是,似乎必须在打开连接之前完成此 *** 作.如果是这种情况,那么客户端是否应该在从服务器接收代码220(响应STARTTLS)后断开连接,然后在指定TLS时重新连接?

或者说,这只是Nsstream的限制吗?普通套接字是否在不关闭的情况下重新协商TLS或SSL?

此外,一旦STARTTLS发布并且随后的协商完成,客户端是否还有其他编码/解码?

如果这些是简单的问题,请道歉.我很难找到合适的例子.

干杯!

解决方法 我刚刚发现Nsstream允许您通过设置kcfStreamSsllevel属性并重新打开流来将已经活动的非TLS连接升级到TLS.我刚刚在smtp.gmail.com:25的SMTP连接上测试了这个,令人惊讶的是它有效!我正在描述Nsstream / SMTP序列,以防有人感兴趣:

NSHost* host = [NSHost hostWithname:address];[Nsstream getStreamsToHost:host port:port inputStream:&is outputStream:&os];[is setDelegate:self];[os setDelegate:self];[is scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];[os scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];[is open];[os open];

SMTP对话,直到我们发送STARTTLS和服务器说OK:

-> 220 mx.Google.com ESMTP gb6sm4472052wbb.0<- EHLO example.address.com-> 250-mx.Google.com at your service,[84.227.165.204]-> 250-SIZE 35882577-> 250-8BITMIME-> 250-STARTTLS-> 250 ENHANCEDSTATUSCODES<- STARTTLS-> 220 2.0.0 Ready to start TLS

此时我们执行以下 *** 作将套接字升级到SSL:

NSMutableDictionary* settings = [NSMutableDictionary dictionary];[settings setobject:NsstreamSocketSecurityLevelNegotiatedSSL forKey:(Nsstring*)kcfStreamSsllevel];[settings setobject:address forKey:(Nsstring*)kcfStreamSSLPeername];[is setProperty:settings forKey:(Nsstring*)kcfStreamPropertySSLSettings];[os setProperty:settings forKey:(Nsstring*)kcfStreamPropertySSLSettings];[is open];[os open];

我们现在可以像以前一样使用is和os.现在可用的AUTH选项证明服务器认为连接是安全的.

<- EHLO example.address.com-> 250-mx.Google.com at your service,[84.227.165.204]-> 250-SIZE 35882577-> 250-8BITMIME-> 250-AUTH LOGIN PLAIN XOAUTH-> 250 ENHANCEDSTATUSCODES<- AUTH PLAIN hIDDeNbAsE64dAtA-> 235 2.7.0 Accepted<- MAIL FROM: <example.address@gmail.com>-> 250 2.1.0 OK gb6sm4472052wbb.0<- RCPT TO: <another.address@gmail.com>-> 250 2.1.5 OK gb6sm4472052wbb.0<- DATA<- From: =?UTF-8?B?QWxlc3NhbmRybyBWb2x6?= <example.address@gmail.com><- To: =?UTF-8?B?QWxl?= <another.address@gmail.com><- Subject: =?UTF-8?B?VGVzdA==?=<- Mime-Version: 1.0;<- Content-Type: text/HTML; charset="UTF-8";<- Content-transfer-encoding: 7bit;<- <- Ciao!<- .-> 354  Go ahead gb6sm4472052wbb.0-> 250 2.0.0 OK 1307994916 gb6sm4472052wbb.0<- QUIT-> 221 2.0.0 closing connection gb6sm4472052wbb.0

我希望这对某人有用……干杯,

总结

以上是内存溢出为你收集整理的objective-c – 通过套接字与ESMTP协商TLS全部内容,希望文章能够帮你解决objective-c – 通过套接字与ESMTP协商TLS所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1070463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存