当前位置: 首页 > 知识库问答 >
问题:

SMTP STARTTLS:如果远程SMTP服务器具有自签名证书,该如何操作?

苍阳成
2023-03-14

当SMTP客户端连接到远程SMTP服务器并发出STARTTLS命令时,该命令具有自签名证书-我在客户端收到错误:

javax。网ssl。SSLHandshakeException:太阳。安全验证器。ValidatorException:PKIX路径生成失败:sun。安全提供商。certpath。SunCertPathBuilderException:找不到请求目标的有效证书路径

有一种解决方案可以信任所有证书,如:

SSLContext trustAllSSLContext;

TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                @Override
                public void checkClientTrusted(X509Certificate[] certs, String authType) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] certs, String authType) {
                }
            }};

            try {
                trustAllSSLContext = SSLContext.getInstance("SSL");
                trustAllSSLContext.init(null, trustAllCerts, null);
            } catch (NoSuchAlgorithmException | KeyManagementException ex) {
                //...
            }

但这会导致安全漏洞。我想也许这比在这种情况下发送未加密的数据更好?

共有1个答案

厉坚
2023-03-14

与未加密相比,它确实可以防止被动攻击者的入侵,而被动攻击者只能窃听,而不能主动窃听。

基本上重复了如何使用Apache HttpClient处理无效的SSL证书?但这包括了很多你不需要的东西。

当然,最好的方法是让服务器获得一个“真实”的证书。如果不这样做,要信任他们的自签名证书,而不是其他任何人的证书,请通过一些您确信未被篡改的过程来获取他们的证书,并将其放在您的信任库中。

如果这是个人计算机或个人安装的Java,JSSE默认信任存储库是文件JRELOC/lib/security/jssecacerts(如果存在),否则为SAME/cacerts。cacerts文件在Java包中,包括几十个著名的公共CA,如Verisign、GoDaddy等,因此您与Internet上几乎任何公共主机(使用这些CA)的连接都可以工作,但您可以根据需要添加或删除它。在这种情况下,在文件中获取所需的DER或PEM格式的证书,然后:

keytool -keystore JRELOC/lib/security/cacerts -importcert -file the_added_cert 
# or JRELOC/bin/keytool if that directory isn't in your search path
# enter changeit for the password, and confirm that you want to trust this cert

如果此(机器和)Java与其他用户共享,更改默认信任库也会影响他们。如果您或他们不希望这样,请创建自己的文件(通过复制标准文件并进行修改),然后通过使用-Djavax运行程序来使用该信任库。网ssl。trustStore=文件名(如中所述http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Customization)或者,如果您自己没有运行“java”,请告诉我们如何设置该系统属性。

 类似资料:
  • 问题内容: 我已经开始为API编写包装,该包装要求所有请求都通过HTTPS进行。我不想在开发和测试它时向实际的API发出请求,而是希望在本地运行自己的服务器来模拟响应。 我对如何生成创建HTTPS服务器并向其发送请求所需的证书感到困惑。 我的服务器看起来像这样: Pem文件是使用以下命令生成的: 一个请求看起来像这样: 通过此设置,我得到了,所以我认为我需要为该请求添加一个选项。 所以我的问题是我

  • 我需要创建web服务客户端,这家提供服务的公司向我们发送wsdl文件。我有wsdl文件、用户名和密码、服务url和txt文件,其中包含一些密钥,比如“20A9 38 4e 82 3a 94 d1…”。服务器有自签名证书,我试图通过InstallCert获取证书。java,使用keytool等生成密钥库。当我使用axis2 wsdl2java从wsdl生成客户端时,它会生成客户端,但在生成过程结束时

  • 我创建了一个自签名证书,并将CA证书导入到受信任的根证书颁发机构中,但Chrome仍然给我。我遵循了https://gist.github.com/jchandra74/36d5f8d0e11960dd8f80260801109ab0本指南。在Chrome中打开域时,PEM编码链会给我服务器和我提供的证书。我将下的和都设置为并启动了。我怎么调试这个?我如何检查Chrome是否看到我导入的CA,以及

  • 我想为我的REST API使用TLS,我计划为它创建自签名证书,并为我的restapi的客户端提供公钥。 我的restapi部署在tomcat catalina容器(tomcat版本8.0.42)上。 我的测试步骤如下, 服务器端 1) 我使用openssl创建了一个自签名证书 2) 已创建bundle 3) 然后将tomcat配置为启用TLS(keystoreType为“PKCS12”),并启动

  • 我的手被https、ssl、PKI之类的东西弄得脏兮兮的。对于自签名证书,有一点我不太理解。假设我想创建一个自签名证书,并在我们想要建立安全连接时将其发送给我的朋友。 所以步骤是: 创建一个私钥。 创建一个公钥。 用我的公钥在证书上签名。 因此,当我的朋友得到我的证书时,他必须验证他得到的证书是我的,他需要解密数字签名。但为了解密和验证他必须拥有我的私钥。所以,我有点困惑。

  • 我有一个在本地系统帐户下作为Windows服务运行的自托管WCF服务器。我正在尝试用C#以编程方式创建一个自签名证书,用于使用消息级安全性的Net.tcpendpoint。 我可以在资源管理器中看到这个1.43KB的文件。如果我查看propertiesSecurity,我会看到SYSTEM和Administrators都具有完全控制权。 在研究这个错误时,我看到了许多关于私钥丢失或权限不正确的答案