Tag: ssl

使用Java API的S3 / AWS的SSL问题:“证书中的主机名不匹配”

亚马逊在1.3.21版本的AWS Java SDK中“升级”了SSL安全性。 在使用Amazon的AWS Java API时,这会破坏访问其名称中具有句点的任何S3存储桶。 我使用的是版本1.3.21.1,目前是2012年10月5日。 我在下面的回答中提供了一些解决方案,但我正在寻找针对此问题的其他解决方法。 如果您收到此错误,您将在例外/日志中看到类似以下消息的内容。 在此示例中,存储桶名称为foo.example.com 。 INFO: Unable to execute HTTP request: hostname in certificate didn’t match: != OR OR at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220) at org.apache.http.conn.ssl.StrictHostnameVerifier.verify(StrictHostnameVerifier.java:61) at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:149) at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:130) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:390) 您可以在AWS S3论坛上查看此问题的文档: https://forums.aws.amazon.com/thread.jspa?messageID=387508&#387508 亚马逊对此问题的回应如下。 对于具有此命名模式的存储桶,我们应该能够通过使用旧的路径样式方法来解决此问题(而不是较新的虚拟主机样式寻址)。 我们将开始修复并确保我们的内部集成测试具有包含句点的存储桶名称的测试用例。 任何变通方法或其他解决方案? 感谢您的任何反馈。

使用带有ssl的spring-ldap

我需要通过带有SSL的spring-ldap与LDAP服务器通信,另一端有自签名证书。 任何善良的灵魂,请指点我的一些说明来设置它?

无法使用SMTP发送电子邮件(获取javax.mail.MessagingException:无法将套接字转换为TLS;)

我编写了以下代码,使用javamail API通过SMTP作为TLS发送电子邮件,因为不支持SSL,但我最终得到以下exception。 请参阅下面的代码。 我使用过调试模式,在代码下面你也可以找到exception。 import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendMailTLS { public static void main(String[] args) { final String username = “———@mydomain.com”; final String password = “***********”; Properties props = new Properties(); props.put(“mail.smtp.auth”, “true”); props.put(“mail.smtp.starttls.enable”, “true”); props.put(“mail.smtp.host”, “mail.mydomain.com”); props.put(“mail.smtp.debug”, “true”); props.put(“mail.smtp.port”, “587”); […]

无法通过Java代码连接到服务器。 获取javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

我正在尝试使用可靠的框架在AWS上为REST API构建测试自动化工具。 我只是尝试使用简单的HTTP POST并检查输出JSON正文。 但是当我在Eclipse中运行它时,我得到了SSLHandshakeException 。 我确实试图调查这个问题并发现它可能与服务器证书相关( 收到致命警报:握手_failure通过SSLHandshakeException )但是当我通过POSTMAN测试它时运行正常并提供所需的输出。 此外,如果我通过浏览器点击URI确实从服务器获得响应(错误消息)。 我是SSL编程的新手,想知道它背后的根本原因是什么,以及如何解决这个问题并继续进行。 这是我的测试方法的代码段。 public class First { @Test public void myFirstRestAssuredTest() { given().header(“content-type”, “application/json”).and().header(“cache-control”, “no-cache”).expect().body(“messageType”, equalTo(“XYZ”)).when().post(https://my-server-address.com/postUpdate”); } } 这是我得到的堆栈跟踪: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.Alerts.getSSLException(Alerts.java:154) at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2023) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1125) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:553) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:412) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:179) at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:328) […]

javax.net.ssl.SSLHandshakeException:java.security.cert.CertificateException:没有主题替代名称

基本上,我有一个测试服务器(基于Linux),公共IP机器人没有公共主机名。 所以我正在尝试使用IP地址为它创建ssl证书。 这样我的Java应用程序就可以使用IP地址访问另一个应用程序:例如: https://210.10.10.10:8443/abc 我在下面发帖说明: 如何解析SSL证书服务器名称/我可以使用keytool添加备用名称吗? 我确实尝试了两种方法,以避免这种exception,但非工作。 我得到了同样的错误。 我尝试编辑“openssl.cnf”并添加: [req] req_extensions = v3_req [ v3_req ] # Extensions to add to a certificate request subjectAltName=IP:210.10.10.10 # or subjectAltName=DNS:www.example.com basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment 2.还尝试使用Java 1.7 keytool: 就像创建(在具有java 1.7的Windows中创建并将所有证书和jks文件复制到Linx服务器env,在java 1.6上运行): keytool -importkeystore -deststorepass changeit -destkeypass changeit -destkeystore myServerKeystore2.jks -srckeystore serverCertAsPK12.p12 -srcstoretype PKCS12 -alias […]

如何使用com.sun.net.httpserver.HttpsServer要求客户端证书

我想要求基于Java 1.7的内置HttpsServer的服务器进行客户端证书身份validation。 我似乎无法找到任何方法使服务器失败身份validation。 无论客户端证书是否可信,未知或完全缺席,它都会快乐地向任何旧客户端提供数据。 我对文档的阅读表明,当客户端不受信任时, 设置HttpsParameters.setNeedClientAuth(true)应该导致身份validation失败。 我发现了有类似问题的人的笔记,不同地建议在SSLEngine和SSLParameters中使用相同的标志,但两者都没有改变我的行为。 这是我能够创建的最简单的例子。 看看交易的内容(使用Wireshark或-Djavax.net.debug = all),我看到任何看起来都不像服务器的证书请求…当然,这看起来很明显,因为它在响应时不应该。 我对Java和SSL都比较陌生。 我误解了身份validation过程吗? 我在适当的图书馆使用吗? 我是否忽略了解决此问题的好方法? 谢谢! 编辑1:更新示例代码以正确分离客户端密钥库和信任库。 还有重写问题,以使身份validation问题更清晰。 package authserv; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.URL; import java.security.KeyStore; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.KeyManager; import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManagerFactory; import com.sun.net.httpserver.HttpExchange; import […]

使用自定义X509KeyManager时,Java无法为SSL握手确定匹配的密码套件

我正在使用Java7和JAX-WS 2.2。 对于SOAP Web服务,我需要创建一个自定义X509KeyManager ,以便为JKS密钥库中的每个连接客户端找到正确的证书。 但是,我已经在努力让我的自定义密钥管理器运行。 到目前为止,我使用的是默认值(从初始化的KeyManagerFactory检索),它基本上可以工作 – 但当然它没有选择正确的证书。 所以第一个想法是创建一个自定义X509KeyManager ,它保存原始密钥管理器,只写出一些日志消息,但通常使用默认行为。 出于某种原因,根本不起作用。 无法建立SSL握手。 在ClientHello之后 ,日志显示以下错误: Allow unsafe renegotiation: false Allow legacy hello messages: true Is initial handshake: true Is secure renegotiation: false Thread-3, READ: TLSv1 Handshake, length = 149 *** ClientHello, TLSv1 RandomCookie: GMT: 1476877930 bytes = { 207, 226, 8, 128, 40, 207, 47, […]

如何在apache-commons net中使用生成的证书配置客户端身份validation

首先,我知道这里有一个类似的问题,但它没有回答我的怀疑。 我有一个配置了SSL的FTPS服务器(vsftpd)。 我已经生成了适当的键: openssl req -x509 -nodes -days 1825 -newkey rsa:2048 \ -keyout private/vsftpd.key \ -out certs/vsftpd.crt 并在服务器中配置相应的conf文件。 现在,在使用Apache commons net的Java客户端代码中,我能够通过SSL与服务器通信,如下所示: import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import org.apache.commons.net.PrintCommandListener; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPReply; import org.apache.commons.net.ftp.FTPSClient; public class CommonsNetFTPSTest { public static void main(String[] args) throws Exception { System.setProperty(“javax.net.debug”, “ssl”); String server = “XXX.XXX.XXX.XXX”; String username […]

SSLSocketImpl.getEnabledCipherSuites中的NPE

我在多个worker中使用Apache HTTP客户端,看起来有某种竞争条件(stacktrace在最后)。 我很困惑,谷歌搜索堆栈跟踪没有提供任何提示(尚未)。 在Linux上使用Java 1.7.0-b147 64位。 我在这里做错了吗? 是否有已知的,有效的替代Sun的SSLSocket实现? 编辑:也许没用,但调用代码如下: public String call() { HttpUriRequest request = new HttpGet(aUrl); HttpResponse response = httpClient.execute(request); StatusLine statusLine = response.getStatusLine(); return EntityUtils.toString(response.getEntity()); } 其中httpClient共享给所有可调用对象。 堆栈跟踪: java.lang.NullPointerException at sun.security.ssl.SSLSocketImpl.getEnabledCipherSuites(SSLSocketImpl.java:2320) at javax.net.ssl.SSLSocket.getSSLParameters(SSLSocket.java:614) at sun.security.ssl.SSLSocketImpl.getSSLParameters(SSLSocketImpl.java:2406) at sun.security.ssl.SSLAlgorithmConstraints.(SSLAlgorithmConstraints.java:65) at sun.security.ssl.Handshaker.init(Handshaker.java:236) at sun.security.ssl.Handshaker.(Handshaker.java:191) at sun.security.ssl.ClientHandshaker.(ClientHandshaker.java:104) at sun.security.ssl.SSLSocketImpl.initHandshaker(SSLSocketImpl.java:1217) at sun.security.ssl.SSLSocketImpl.doneConnect(SSLSocketImpl.java:634) at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:608) at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414) at […]

JDBC参数verifyServerCertificate = false连接,无需clientkeystore和truststore

我试图使用以下设置来创建到MYSQL服务器的ssl连接。 我注意到,当我在jdbc url中指定verifyServerCertificate = false时,Java似乎忽略了我通过System.setProperty指定的密钥库和信任库信息。 所以我可以注释掉1)中指定的代码,并且仍然可以成功创建ssl连接。 当我指定verifyServerCertificate = true时,它似乎使用1)设置的值。 所以我的问题是JDBC如何在verifyServerCertificate = false时创建ssl连接,而不使用客户端密钥库和信任库? 谢谢。 Java代码 1) System.setProperty(“javax.net.ssl.keyStore”,(String) keyStorePath); System.setProperty(“javax.net.ssl.keyStorePassword”, keyStorePassword); System.setProperty(“javax.net.ssl.trustStore”,(String) trustStorePath); System.setProperty(“javax.net.ssl.trustStorePassword”,(String) trustStorePassword)); 2) String jdbcURL = “jdbc:mysql://192.11.11.111/database?verifyServerCertificate=false&useSSL=true&requireSSL=true”; 3) Connection con = DriverManager.getConnection(jdbcURL, dbuser, dbpassword); MYSQL服务器 授权声明: 4) ‘GRANT ALL PRIVILEGES ON *.* TO ‘dbuser’@’%’ IDENTIFIED BY PASSWORD \’*2343ASDFWETDFGDSFGSDFGSDSDFWERASF\’ REQUIRE SSL WITH GRANT OPTION’ 编辑到my.cnf文件 […]