如何让我的Mono 4.2代码通过Amazon SES发送电子邮件?
问题描述:
我有在Ubuntu 16.04.2 LTS上运行的Mono(版本4.2.1)代码;该代码尝试使用Amazon SES发送电子邮件并失败。我从其他搜索中了解到,错误是由于证书没有出现在mono的信任存储中。该命令以修正此之中: mozroots --import --ask-除去如何让我的Mono 4.2代码通过Amazon SES发送电子邮件?
后跟:
certmgr -ssl SMTPS://email-smtp.eu-west-1.amazonaws.com:587
(因为email-smtp.eu-west-1.amazonaws.com是我使用的SMTP服务器;在端口587)
第一个命令工作正常,进口162个证书来我的商店。 第二个命令失败并出现异常。我究竟做错了什么?
这里的堆栈跟踪:
Unhandled Exception:
System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
at Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord (IAsyncResult asyncResult) <0x402e7020 + 0x00132> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord (IAsyncResult ar, Boolean ignoreEmpty) <0x402e6f50 + 0x00031> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker (IAsyncResult result) <0x402e3aa0 + 0x00225> in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslClientStream.EndNegotiateHandshake (IAsyncResult result) <0x402e7cf0 + 0x000ec> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) <0x402e7a40 + 0x0007f> in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslStreamBase.EndNegotiateHandshake (Mono.Security.Protocol.Tls.InternalAsyncResult asyncResult) <0x402e1190 + 0x0007b> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.NegotiateHandshake() <0x402da8b0 + 0x000b6> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.Write (System.Byte[] buffer, Int32 offset, Int32 count) <0x402da4d0 + 0x000af> in <filename unknown>:0
at System.IO.StreamWriter.Flush (Boolean flushStream, Boolean flushEncoder) <0x7f07ce354da0 + 0x000fa> in <filename unknown>:0
at System.IO.StreamWriter.Flush() <0x7f07ce354d70 + 0x0001f> in <filename unknown>:0
at Mono.Tools.CertificateManager.GetCertificatesFromSslSession (System.String url) <0x402a43e0 + 0x00357> in <filename unknown>:0
at Mono.Tools.CertificateManager.Ssl (System.String host, Boolean machine, Boolean verbose) <0x402a39f0 + 0x0013a> in <filename unknown>:0
at Mono.Tools.CertificateManager.Main (System.String[] args) <0x4029ed70 + 0x004f0> in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.IOException: The authentication or decryption has failed. ---> System.IO.IOException: The authentication or decryption has failed. ---> Mono.Security.Protocol.Tls.TlsException: The authentication or decryption has failed.
at Mono.Security.Protocol.Tls.RecordProtocol.EndReceiveRecord (IAsyncResult asyncResult) <0x402e7020 + 0x00132> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.SafeEndReceiveRecord (IAsyncResult ar, Boolean ignoreEmpty) <0x402e6f50 + 0x00031> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslClientStream.NegotiateAsyncWorker (IAsyncResult result) <0x402e3aa0 + 0x00225> in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslClientStream.EndNegotiateHandshake (IAsyncResult result) <0x402e7cf0 + 0x000ec> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback (IAsyncResult asyncResult) <0x402e7a40 + 0x0007f> in <filename unknown>:0
--- End of inner exception stack trace ---
at Mono.Security.Protocol.Tls.SslStreamBase.EndNegotiateHandshake (Mono.Security.Protocol.Tls.InternalAsyncResult asyncResult) <0x402e1190 + 0x0007b> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.NegotiateHandshake() <0x402da8b0 + 0x000b6> in <filename unknown>:0
at Mono.Security.Protocol.Tls.SslStreamBase.Write (System.Byte[] buffer, Int32 offset, Int32 count) <0x402da4d0 + 0x000af> in <filename unknown>:0
at System.IO.StreamWriter.Flush (Boolean flushStream, Boolean flushEncoder) <0x7f07ce354da0 + 0x000fa> in <filename unknown>:0
at System.IO.StreamWriter.Flush() <0x7f07ce354d70 + 0x0001f> in <filename unknown>:0
at Mono.Tools.CertificateManager.GetCertificatesFromSslSession (System.String url) <0x402a43e0 + 0x00357> in <filename unknown>:0
at Mono.Tools.CertificateManager.Ssl (System.String host, Boolean machine, Boolean verbose) <0x402a39f0 + 0x0013a> in <filename unknown>:0
at Mono.Tools.CertificateManager.Main (System.String[] args) <0x4029ed70 + 0x004f0> in <filename unknown>:0
答
一个certmgr
常见故障的不与sudo
运行它。它产生了Exception
,这是一个非常误导。
在MacOS/Linux的:
certmgr -ssl smtps://email-smtp.eu-west-1.amazonaws.com:587
会产生您发布确切的错误。
使用sudo:
sudo certmgr -ssl smtps://email-smtp.eu-west-1.amazonaws.com:587
结果:
X.509 Certificate v3
Issued from: C=US, O=Equifax, OU=Equifax Secure Certificate Authority
Issued to: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
Valid from: 5/21/2002 4:00:00 AM
Valid until: 8/21/2018 4:00:00 AM
*** WARNING: Certificate signature is INVALID ***
Import this certificate into the CA store ?yes
X.509 Certificate v3
Issued from: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
Issued to: C=US, O=Google Inc, CN=Google Internet Authority G2
Valid from: 4/1/2015 12:00:00 AM
Valid until: 12/31/2017 11:59:59 PM
*** WARNING: Certificate signature is INVALID ***
Import this certificate into the CA store ?yes
X.509 Certificate v3
Issued from: C=US, O=Google Inc, CN=Google Internet Authority G2
Issued to: C=US, S=California, L=Mountain View, O=Google Inc, CN=smtp.gmail.com
Valid from: 4/12/2017 1:28:00 PM
Valid until: 7/5/2017 1:28:00 PM
Import this certificate into the AddressBook store ?yes
3 certificates added to the stores.
注意:确保你所回答yes
的进口问题。
我试着用sudo运行它,并得到了完全相同的错误。我的第一次尝试(没有sudo)可能会损坏系统中的某些东西吗?那么我将如何回滚这些变化? – Cois
@Cois不,它不应该搞砸了......我只是试了一遍,没有sudo同样的错误,与sudo我得到3证书报告,并且他们已经在CA商店... – SushiHangover
@ Cois个人而言,为了添加TLS 1.1/1.2支持,我将添加Google的BoringSSL以取代托管提供商,因此我将升级到mono 4.8。远离托管提供商消除了很多问题,并且因为使用了系统证书存储区而不再需要使用mozroots ...亚马逊仍然在其smtp服务器上支持tls1.0/1.0(至少现在),因此单声道4.2 * should * work .... – SushiHangover