Tag: sslsocketfactory

为什么SSLSocketFactory缺少setEnabledCipherSuites?

SSLSocketFactory提供了getDefaultCipherSuites (在套接字上默认启用的密码)和getSupportedCipherSuites (如果需要,可以启用密码)。 但是, SSLSocketFactory不提供setEnabledCipherSuites来配置密码列表一次以在后续套接字上提供首选项。 事实上,我认为将setEnabledCipherSuites作为SSLSocket一部分确实使得wok流程复杂化。 例如, HttpsURLConnection不提供getSocket ,它确实打破了这个流程: … SSLContext context = SSLContext.getInstance(“TLS”); context.init(null, trustManager.getTrustManagers(), null); HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); connection.setSSLSocketFactory(context.getSocketFactory()); 我认为关于SSLContext因为它有像getDefaultSSLParameters和getSupportedSSLParameters这样的方法。 我正试图为(in)能力提出一个合理的安全工程理由,但我不能。 也许是决定软件工程的原因。 (我怀疑这是一个很好的理由,而且我目前缺乏洞察力)。 为什么Java缺乏配置SSLSocketFactory的能力? 它显然是一个设计决策,我试图理解为什么它是以牺牲图书馆相关部分的安全性为代价的。

如何从PEM证书和密钥构建SSLSocketFactory而不转换为密钥库?

我获得了一个自签名客户端证书工具包,用于通过HTTPS访问服务器。 该套件包含以下PEM文件: client.crt(客户端证书) client.key(客户端私钥) ca.crt(CA证书) 解决该任务的一种方法是生成Java密钥库: 使用openssl将客户端证书和密钥转换为PKCS12密钥库 使用keytool将CA证书导入到商店 …然后使用以下代码构建SSLSocketFactory实例: InputStream stream = new ByteArrayInputStream(pksData); KeyStore keyStore = KeyStore.getInstance(“PKCS12”); keyStore.load(stream, password); KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, password.toCharArray()); KeyManager[] keyManagers = kmf.getKeyManagers(); TrustManagerFactory tmfactory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); tmfactory.init(keyStore); TrustManager[] trustManagers = tmfactory.getTrustManagers(); SSLContext sslContext = SSLContext.getInstance(“TLS”); sslContext.init(keyManagers, trustManagers, null); sslSocketFactory = sslContext.getSocketFactory(); …后来用于初始化http库。 因此,我们获得了一个KeyStore,然后在它的帮助下初始化KeyManagers和TrustManagers,最后我们用它们构建了SSLSocketFactory实例。 问题是 :有没有办法避免密钥库文件的创建,并以某种方式构建SSLSocketFactory,从PublicKey和Certificate实例开始(例如,可以使用bouncycastle的PemReader从PEM文件中获取)?

谷歌界面X509TrustManager的不安全实现

我在谷歌播放中使用了一个应用程序,我收到了谷歌的一封邮件说: 您在此电子邮件末尾列出的应用使用了界面X509TrustManager的不安全实现。 具体而言,在与远程主机建立HTTPS连接时,该实现会忽略所有SSL证书validation错误,从而使您的应用容易受到中间人攻击。 要正确处理SSL证书validation,请在自定义X509TrustManager接口的checkServerTrusted方法中更改代码,以便在服务器提供的证书不符合您的期望时引发CertificateException或IllegalArgumentException。 我的应用使用“https”,我的checkServerTrusted()如下: TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return null; } }; 然后我修改这个function: TrustManager tm = new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { […]

Java中的密钥SSL套接字连接

我正在加密服务器和客户端之间的TCP连接。 在研究和测试过程中,我倾向于使用密钥加密。 我的问题是我找不到任何有关如何实现此function的教程。 我发现的教程围绕一次性https请求,我需要的只是一个SSL Socket。 我到目前为止编写的代码如下。 我几乎可以肯定它需要扩展,我只是不知道如何。 任何帮助表示赞赏。 private ServerSocketFactory factory; private SSLServerSocket serverSocket; factory = SSLServerSocketFactory.getDefault(); serverSocket = (SSLServerSocket) factory.createServerSocket( ); 用于接受客户端连接的服务器代码 SSLSocket socket = (SSLSocket) serverSocket.accept(); socket.startHandshake(); 我只是不知道如何实际握手。 参考: http : //docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html