Tag: ssl

在一个SSL套接字连接中使用两个私钥(密钥库)和两个公钥(信任库)

我需要在一个套接字ssl连接中使用密钥对而不会在客户端中进行任何更改。 为什么? 因为一个客户端在信任存储中使用CN属性进行连接握手,而在同一属性中使用另一个值以同一方式处理相同任务的其他客户端。 所以我需要使用具有不同CN属性的 两个密钥存储 (私有)以及别名并共享 具有不同CN属性的 两个不同信任存储 (公钥)以及别名。 描述如下: keyStore1 密钥库类型:JKS 密钥库提供商:SUN 别名: identity1 所有者: CN = app1 … 发行人:CN = app1 …… trustStore1 别名: identity1 所有者: CN = app1 … 发行人:CN = app1 …… keyStore2 别名: identity2 所有者:CN = app2 … 发行人:CN = app2 …… trustStore2 别名: identity2 所有者: CN = app2 … […]

Java SSL证书撤销检查

我目前正在使用SSL编写网络TCP服务器。 在生产中,我们最终会要求客户使用证书进行身份validation。 为了在紧急情况下撤销证书,我们还想建立一个CRL。 我的问题是:Java是否开箱即用检查CRL(如果提供证书)或者我是否需要手动实施此类检查? 为了测试,我准备了一个带有CRL集的证书,但是Java似乎没有尝试validation它(我将它放入本地Web服务器并且没有访问权限)。 我只找到了com.sun.net.ssl.checkRevocation = true VM选项,但显然它不查询CRL。 VM调试设置为java.security.debug = certpath不会生成任何输出,要么…… Java似乎在其子系统中有相关的类(例如java.security.cert.X509CRLSelector ),但它显然没有发挥作用。 我使用Apache Mina作为客户端服务器编写了一个小型maven风格的项目,该服务器基于密钥/信任库和客户端/服务器的自签名证书初始化SSLContext,可以在此处以ZIP存档的forms下载: https : //www.dropbox.com /s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

续订SSL证书时,还需要更新Android BKS

所以这是一个简单的问题,但我不确定答案。 在android上开发SSL有时是一个棘手的领域。 大多数人都有两种选择:*接受所有证书并冒险MITM攻击*将证书打包为应用程序中的BKS。 在我的应用案例中,我选择将BKS打包并通过HttpsURLConnection读取它 KeyStore trustStore = loadTrustStore(); KeyStore keyStore = loadKeyStore(); TrustManagerFactory tmf = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustStore); KeyManagerFactory kmf = KeyManagerFactory .getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, KEYSTORE_PASSWORD.toCharArray()); SSLContext sslCtx = SSLContext.getInstance(“TLS”); sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); URL url = new URL(“https://myserver.com”); HttpsURLConnection urlConnection = (HttpsURLConnection) url urlConnection.setSSLSocketFactory(sslCtx.getSocketFactory()); 现在我遇到了麻烦。 我的证书快速到期,我不确定如果我升级它会产生什么效果。 问:续订SSL证书而不升级Android设备上的应用会阻止他们访问httpsurl吗? 问:不升级SSL证书有什么影响。 Android设备是否无法联系服务器

如何在Spring引导嵌入式tomcat中设置HTTPS SSL Cipher Suite首选项

我尝试根据服务器首选项设置HTTPS SSL密码套件首选项,而不是基于客户端和服务器支持的具有最高强度的通用密码套件进行自动选择。 我想让服务器选择具有“TLS_ECDHE …”的服务器和客户端之间的通用,以便支持Forward Secrecy。 现在我在“www.ssllabs.com”中测试过,客户端浏览器会更喜欢使用“TLS_RSA …”而非“TLS_ECDHE”的密码… 我注意到java 8支持set密码套件首选项: http : //docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#cipher_suite_preference 我假设Spring启动嵌入式Tomcat会调用Java 8函数来选择密码 这是我在spring boot application.properties文件中设置的服务器支持密码集: server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_SHA256,TLS_ECDHE_RSA_WITH_AES_128_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_SHA,TLS_ECDHE_RSA_WITH_AES_256_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_SHA384,TLS_ECDHE_RSA_WITH_AES_256_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_128_SHA,TLS_DHE_DSS_WITH_AES_128_SHA256,TLS_DHE_RSA_WITH_AES_256_SHA256,TLS_DHE_DSS_WITH_AES_256_SHA,TLS_DHE_RSA_WITH_AES_256_SHA 希望有人可以指导我如何覆盖默认选择密码行为。

TLS-Package之后的神秘字节

我正在尝试创建从Java到Vala服务器的SSL TCP连接。 一切正常,直到我发送第二个包到服务器。 (也是第一个包发送正常)。 服务器只接收第二个包的第一个字节(在本例中为“1”),没有别的,但如果我连接到没有SSL的服务器,一切正常。 我认为服务器不是问题,因为来自另一个Vala客户端的每个其他连接都运行良好。 我使用的是不受信任的证书,所以我创建了一个自定义的TrustManager,我使用的是OpenJDK 7(Elementary OS – Linux)。 这是我的代码: //Main: SSLHandler handler = new SSLHandler(); handler.createSecureSocket(“localhost”, 7431); byte[] data = {1,4,1,1,1,1}; handler.getOutputStream().write(data); handler.getOutputStream().write(data); // SSLHandler public class SSLHandler { // SSL Socket erstellen SSLSocket sslSocket; public void createSecureSocket(String ip, int port) throws UnknownHostException, IOException, KeyManagementException, NoSuchAlgorithmException { SSLSocketFactory factory = (SSLSocketFactory) new […]

拆分ssl认证处理:

我想将认证处理分为Host,Peer,Both和None两类:两者 – validation对等认证和进行主机名validation无 – 通过对等和主机名对等 – 进行对等validation但不进行主机名validation主机 – 做主机名validation但不进行对等validation(特别适用于自签名证书) 目前的实施如下: static SSLSocketFactory getSSLSocketFactory(SslValidationType validationType) throws IOException, NoSuchAlgorithmException, CertificateException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { // First, create a ‘current’ KeyStore that we can provide to the SSLSocketFactory // //File capath = new File(“/system/etc/security/cacert1s.bks”); //KeyStore trustStore = KeyStore.getInstance(“jks”); KeyStore trustStore = KeyStore.getInstance(getKeystoreProperty()); if (capath.exists() == true) { FileInputStream […]

如何从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文件中获取)?

握手在棒棒糖上失败

我正在尝试进行HTTP POST,但我得到两个不同的错误: javax.net.ssl.SSLHandshakeException: Handshake failed net.ssl.SSLPeerUnverifiedException: No peer certificate 我通过此处指定的解决方法修复了无对等证书错误: https : //stackoverflow.com/a/4837230/4254419 但是虽然它修复了错误,但它会抛出一个新错误,这就是握手失败 我知道这不安全而且我不在乎,它不适合生产,所以我更不关心安全性。 这个问题有解决方法吗?

“Android SSL套接字客户端中未找到证书路径的信任锚”

我正在尝试使用Android客户端应用程序连接到SSL服务器。 服务器有JKS证书,使用Portecle转换为BKS。 服务器代码非常简单: public class EchoServer { public static void main(String[] arstring) { try { SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(25000); SSLSocket sslsocket = (SSLSocket) sslserversocket.accept(); InputStream inputstream = sslsocket.getInputStream(); InputStreamReader inputstreamreader = new InputStreamReader(inputstream); BufferedReader bufferedreader = new BufferedReader(inputstreamreader); String string = null; while ((string = bufferedreader.readLine()) != null) { […]

如何在Java中启用客户端TLS会话重用

我有一个Java客户端,可以创建到同一服务器的许多会话。 TLS协议具有缓存会话密钥的function,从而避免了对每个连接进行昂贵的PKI处理。 但我无法让它真正起作用。 openssl s_client -reconnect -state -prexit -connect localhost:1234报告服务器具有“已重用,TLSv1 / SSLv3,密码为ECDHE-RSA-AES256-SHA384”以及相同的主密钥。 数据流是二进制的,而不是HTTP封装的。 我使用的代码是(约),如下所示。 它可以工作,但没有会话重用。 initSSLContext(keyStore, “password”, trustStore, “PKIX”, “TLSv1”); While (true) { connect(); byte[] encode1 = { 0x42, 0, 0, 0, 0, 0, 0, 0, 0, }; outs.write(encode1); byte[] ttlbuf = new byte[10000]; int len = ins.read(ttlbuf, 0, ttlbuf.length); StringBuilder sb = new StringBuilder(); […]