SMTPS服务器开发:SslStream.AuthenticateAsServer()无限阻塞排查与解决
解决SMTPS服务器TLS认证阻塞问题的经历
我最近在开发一款用于教育目的的SMTPS服务器时,卡在了TLS服务器认证这一步,折腾了好一阵才找到根源,分享下整个过程:
证书准备与初始问题:我通过Debian 8(Jessie)的Certbot获取了SSL证书,一开始用这条命令把证书和私钥打包成PFX文件:
openssl pkcs12 -export -out fullcert.pfx -inkey privkey.pem -in cert.pem -certfile chain.pem加载这个PFX文件后,证书本身的验证是有效的,但调用
.NET的SslStream.AuthenticateAsServer()方法时,程序直接无限阻塞,直到客户端超时抛出AggregateException。跨环境的错误表现:
- 在MacBook上测试时,错误信息是:
Unknown Secure Transport errorIllegalParam'` - 在树莓派上测试时,错误信息是:
Mono.Btls.MonoBtlsException: Ssl error:1000009c:SSL routines:OPENSSL_internal:HTTP_REQUEST
- 在MacBook上测试时,错误信息是:
排查过程:我先用localhost测试证书验证流程,发现是可以正常工作的,这说明代码逻辑本身没问题,问题应该出在证书打包的环节。
解决办法:后来我把PFX生成命令换成了下面这条,问题直接解决了:
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out certificate.pfx原因推测:对比两条命令的差异,核心是用
fullchain.pem替代了cert.pem+chain.pem的组合。fullchain.pem本身已经包含了服务器证书和完整的中间证书链,而分开指定cert.pem和chain.pem的方式,可能在打包PFX时没有正确将整个证书链整合进去,导致TLS握手过程中服务器无法提供完整的证书链,最终引发了阻塞和各种奇怪的SSL错误。
内容的提问来源于stack exchange,提问作者Demindiro
相关产品推荐
相关产品推荐

