标签: jsse

使用客户端证书进行SSL重新协商会导致服务器缓冲区溢出

我编写了一个Java客户端应用程序,它使用客户端证书通过HTTPS连接到Apache Web服务器,并对服务器执行文件的HTTP PUT.它适用于小文件,但与大文件崩溃.

Apache服务器日志显示以下内容:

...
OpenSSL: Handshake: done
...
Changed client verification type will force renegotiation
...
filling buffer, max size 131072 bytes
...
request body exceeds maximum size (131072) for SSL buffer
could not buffer message body to allow SSL renegotiation to proceed
...    
OpenSSL: I/O error, 5 bytes expected to read on BIO
(104)Connection reset by peer: SSL input filter read failed.
(32)Broken pipe: core_output_filter: writing data to the network
Connection closed to child 20 with standard shutdown …
Run Code Online (Sandbox Code Playgroud)

java apache ssl jsse

6
推荐指数
1
解决办法
2万
查看次数

Oracle JDK8中的JSSE是否实现了TLS后备SCSV?

看起来OpenJDK版本8中的JSSE没有实现RFC7507.OpenJDK错误跟踪器中存在一个开放缺陷: JDK-8061798

但是关于Oracle JDK的信息并不多.Oracle JDK版本8是否实现了TLS后备信令密码套件值(SCSV)?如果它能够如何启用此功能?

java security ssl jsse beast

6
推荐指数
1
解决办法
400
查看次数

有人能指出我关于javax.net.debug的确切细节吗?

我想获得使用javax.net.debug生成的SSL调试输出的确切细节.我看过了,但几乎所有内容都只是通过一个示例文件.

提前抱歉,如果这更容易找到,那么我期待.

java debugging ssl jsse

5
推荐指数
2
解决办法
2万
查看次数

如何将Windows Keystore(MCS)与JDBC一起使用?

我正在尝试创建一个PKI用于身份验证的Java应用程序.我需要能够从Microsoft证书存储(MCS)检索证书并将其传递到Oracle数据库(11.2).

我正在使用jdbc:oracle:thin驱动程序进行连接.在谷歌上花了相当长的一段时间后,我已经空了.我发现要更改不同的属性(取决于文章):

  • 设置属性 javax.net.ssl.keyStoreType = "Windows-MY"
  • 设置 javax.net.ssl.keyStore = "Windows-MY"
  • javax.net.ssl.keyStore should be set to "None" (如果使用自定义KeyManager,我认为它不会起作用,因为当它进入我的自定义KeyManager时,我将从连接属性中指定的密钥库中获得证书).

当然所有这些人都声称成功,但没有任何东西对我有用.我已经尝试了所有我没能找到运气的例子.当我使用Oracle钱包时,我能够成功进行身份验证,因此我知道我的证书很好.如果有人之前已经这样做了,并且愿意发布一些很棒的代码.

我知道大多数人都在使用带有网站的Windows密钥库,因此正在创建他们自己的SSLContext,但我无法想象我是唯一一个想用JDBC做这件事的人(据我所知,这不允许我提供它是一个SSLContext).

这是我认为应该工作的代码,但不是.

DriverManager.registerDriver)new OracleDriver());
String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=host)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=someName))(SECURITY= (SSL_SERVER_CERT_DN=\"CN=TESTSERVER\")))";

java.util.Properties props = new java.util.Properties();
props.setProperty("javax.net.ssl.keyStoreType", "Windows-MY");
props.setProperty("javax.net.ssl.keyStore", "NONE");
props.setProperty("javax.net.ssl.trustStoreType", "Windows-ROOT");
props.setProperty("javax.net.ssl.trustStore", "NONE");

props.setProperty("oracle.net.ssl_server_dn_match", "true");
props.setProperty("oracle.net.authentication_services", "(TCPS)");
Connection conn = DriverManager.getConnection(url, props);
Run Code Online (Sandbox Code Playgroud)

此代码失败,但有异常:

java.sql.SQLRecoverableException: IOException: The Network Adapter could not establish the connection
Run Code Online (Sandbox Code Playgroud)

java ssl jdbc jsse oracle11g

5
推荐指数
1
解决办法
2857
查看次数

java如何选择在jsse中使用的最强密码?

我不明白Java如何选择最常使用的密码Server Hello.

我有一个Tomcat 5配置,我在SSL连接器中设置了 ciphers=TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, etc

服务器,即Java支持TLS_RSA_WITH_AES_128_CBC_SHA,Server Hello作为客户端支持的首选.但这并不是最安全的,并不是首选的http://docs.huihoo.com/java/javase/7/technotes/guides/security/SunProviders.html#SunJSSEProvider列出的TLS_RSA_WITH_AES_256_CBC_SHA首选项.
然后我认为是server.xml属性中的顺序产生了差异,我把另一个密码first(TLS_DHE_RSA_WITH_AES_256_CBC_SHA)放在我Client Hello支持的地方.但这也没有被选中,而是TLS_RSA_WITH_AES_128_CBC_SHA再次被选中.

那么JSSE如何选择偏好的密码呢?这是在某处记录的吗?我无法弄清楚这里发生了什么.

java security ssl tomcat jsse

5
推荐指数
1
解决办法
5567
查看次数

Java JSSE TLS - 此连接是否在两个方向上安全加密?

在Java中使用JSSE和TLS.我在服务器和客户端之间创建了一个安全套接字.在最终安全地连接套接字之后,我仍然有一个关于我现有代码安全性的基本问题.我按照教程中的说明进行操作,有时JavaDoc中的文档非常精确,但有点模糊,除非你说的是Swaheli方言的术语....

我现在已经在C++中进行了一段时间的网络编程.过渡到Java很容易.然而,最近我发现使交通安全是明智的.这是说:

我想以与Web浏览器创建安全套接字相同的方式创建安全套接字,因此双向流量都是加密的.客户端可以看到他们从服务器发送的个人帐户信息(如果被截获则非常糟糕),并且客户端可以安全地将他们的用户名和密码发送到服务器(如果被截获也非常糟糕).

我知道公钥加密的工作原理,但仅对公钥加密有副作用.您将公钥发送到客户端,客户端使用公钥加密,并将数据发送到服务器,只有服务器可以解密.根据我的理解,服务器使用私钥来加密发往客户端的消息,并且需要添加另一层安全性以防止任何拥有公钥的人能够解密它.

  1. 我有一个存储在public.key和private.key文件中的公钥/私钥对(我使用JSSE的keytool实用程序制作了这些对)
  2. 我在客户端中包含了public.key
  3. 我在服务器中包含了private.key

客户类:

    KeyStore keyStore;
    TrustManagerFactory tmf;
    KeyManagerFactory kmf;
    SSLContext sslContext;
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.nextInt();

        keyStore = KeyStore.getInstance("JKS");
        keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.public"),"public".toCharArray());
        tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(keyStore);
        kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(keyStore, "public".toCharArray());
        sslContext = SSLContext.getInstance("TLS");
        sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), secureRandom);
        SSLSocketFactory sslsocketfactory = sslContext.getSocketFactory();
        SSLSocket sslsocket = (SSLSocket)sslsocketfactory.createSocket("localhost", 9999);
Run Code Online (Sandbox Code Playgroud)

服务器类:

    String passphrase = "secret"
    KeyStore keyStore;
    TrustManagerFactory tmf;
    KeyManagerFactory kmf;
    SSLContext sslContext;
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.nextInt();

        keyStore = KeyStore.getInstance("JKS");
        keyStore.load(this.getClass().getClassLoader().getResourceAsStream("server.private"),passphrase.toCharArray());
        tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(keyStore);
        kmf = KeyManagerFactory.getInstance("SunX509"); …
Run Code Online (Sandbox Code Playgroud)

java ssl network-programming jsse

5
推荐指数
2
解决办法
3173
查看次数

如何为 Java 指定服务器首选的 SSL 密码套件顺序?

我使用 Java 1.6 和 netty 3.8 作为 HTTP/HTTPS 服务器。我已经通过 ssllab.com(https://www.ssllabs.com/ssltest/analyze.html)完成了 SSL 测试,我得到了如下密码套件的结果。

密码套件(按强度排序;服务器无偏好

但是,google.com 的结果却有所不同。 https://www.ssllabs.com/ssltest/analyze.html?d=www.google.com&s=74.125.227.148

密码套件(服务器优先顺序为 SSL 3+ 套件,然后使用 SSL 2 套件)

如何为密码套件设置服务器端首选项顺序?JSSE 是否有任何关于此的属性或 API?

提前致谢。

java encryption ssl jsse

5
推荐指数
1
解决办法
3949
查看次数

Firefox 浏览器/服务器协商的选定密码与 Tomcat 配置的密码列表不匹配

我有点困惑。我们已将 v7 Tomcat 服务器配置为仅使用 TSLv1.2 与连接的浏览器进行通信,并且我们指定了一组受限制的密码。使用 Firefox 浏览器(v60.3.0esr 64 位)。我们能够建立连接,但奇怪的是在我连接到站点后,我注意到商定的密码不在配置的 tomcat 密码列表中。

我的印象是,在配置 http 连接对象时,服务器作为 hello 连接否定的一部分会将连接限制为可​​用密码列表?我错过了什么?如果缺少 ciphers 参数,则可用密码列表将仅限于在 JVM 上配置的密码(这是我的理解)。因此,我是否还需要将 JVM 中的密码限制为我在 http 连接器元素中指定的同一组?

详细信息:Tomcat(v 7.0.77 java 1.8.0_151)

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true" allowTrace="false"
clientAuth="false" sslProtocols="TLS" sslEnabledProtocols="TLSv1.2"
keystoreFile="/etc/tomcat/tomcat.keystore" keystorePass="XXXX"
ciphers="TLS_RSA_WITH_AES_256_CBC_SHA256,
         TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
         TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
         TLS_RSA_WITH_AES_128_CBC_SHA256, 
         TLS_RSA_WITH_AES_128_CBC_SHA,
         TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
         TLS_RSA_WITH_AES_256_GCM_SHA384,
         TLS_RSA_WITH_AES_128_GCM_SHA256,
         TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
         TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
         TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
         TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384" />
Run Code Online (Sandbox Code Playgroud)

我的 tomcat.config 中没有任何具体定义

    JAVA_HOME="/usr/lib/jvm/jre"
    CATALINA_BASE="/usr/share/tomcat"
    CATALINE_HOME="/usr/share/tomcat"
    JASPER_HOME="/usr/share/tomcat"
    CATALINE_TMPDIR="/var/cache/tomcat/temp"
    TOMCAT_USER="tomcat"
    SECURITY_MANAGER="false"
    SHUTDOWN_WAIT="30"
    SHUTDOWN_VERBOSE="false"
    CATALINA_PID="/var/run/tomcat.pid
Run Code Online (Sandbox Code Playgroud)

建立连接后,我在浏览器窗口中右键单击,选择 Inspect Element 并选择 Network 标记,然后单击客户端请求。然后我选择了安全选项卡(用于请求)并显示:

     Protocol verson: TLSv1.2
     Cipher suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 …
Run Code Online (Sandbox Code Playgroud)

java ssl jsse tomcat7

5
推荐指数
1
解决办法
226
查看次数

OpenJDK 密钥工具密码

我正在尝试在 OpenJDK 中为 https 连接注册公司证书

我在OpenJDK版本 8 中运行了以下命令。它要求我输入密码。Oracle JDK 的默认密码是“changeit”,但它不适用于 OpenJDK

我曾尝试使用密码,changeit但没有用。

OpenJDK 8:

D:\java8\bin\keytool.exe -keystore "D:\java8\jre\lib\security\cacerts" -importcert -alias sds -file C:\Users\SDS\SDS.crt
Run Code Online (Sandbox Code Playgroud)

OpenJDK 版本 11:

D:\jdk-11.0.2\lib\security>D:\jdk-11.0.2\bin\keytool.exe -keystore D:\jdk-11.0.2\lib\security\cacerts -importcert -alias sds -file C:\Users\SDS\SDS.crt
Run Code Online (Sandbox Code Playgroud)

OpenJDK 8:

keytool ??: java.io.IOException: Keystore was tampered with, or password was incorrect
Run Code Online (Sandbox Code Playgroud)

OpenJDK 11版本,出现同样问题:

Warning: use -cacerts option to access cacerts keystore
Enter keystore password:
keytool error: java.io.IOException: Keystore was tampered with, or password was
Run Code Online (Sandbox Code Playgroud)

java jsse keytool

5
推荐指数
1
解决办法
1万
查看次数

使用 OkHttp 进行真实 HTTP 请求的 Robolectric 测试抛出 java.lang.NullPointerException: 未为 PKCS#12 KeyStore 提供密码

我正在使用Robolectric 4.3.1( testImplementation "org.robolectric:robolectric:4.3.1") 为我的集成测试创建一个 Android sqlite 环境。我的系统使用OkHttp( implementation 'com.squareup.okhttp3:okhttp:3.14.7') 来处理真实的 HTTP 请求。我不使用MockWebServer.

升级到 Android 10 SDK 后,我必须根据 Robolectric 说明将单元测试 JVM 更新到 JDK 9 :

在 Android API 29 上运行测试现在严格要求 Java9 运行时或更新版本。如果您在通过 Android Studio 在 API 29 上运行测试时看到有关不受支持的 Java 版本的错误;您可以使用“运行配置”对话框中的“JRE”字段来配置更新的 Java 运行时。有关更多背景信息,请参阅https://developer.android.com/studio/run/rundebugconfig

但是,现在我的集成测试失败了:

java.lang.NullPointerException: No password supplied for PKCS#12 KeyStore.

    at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(Unknown Source)
    at java.base/java.security.KeyStore.load(KeyStore.java:1479)
    at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.loadKeyStore(TrustStoreManager.java:367)
    at java.base/sun.security.ssl.TrustStoreManager$TrustAnchorManager.getTrustedCerts(TrustStoreManager.java:315)
    at java.base/sun.security.ssl.TrustStoreManager.getTrustedCerts(TrustStoreManager.java:59)
    at java.base/sun.security.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:51)
    at java.base/javax.net.ssl.TrustManagerFactory.init(TrustManagerFactory.java:278)
    at okhttp3.internal.Util.platformTrustManager(Util.java:640)
    at …
Run Code Online (Sandbox Code Playgroud)

android jsse robolectric okhttp trustmanager

5
推荐指数
1
解决办法
1796
查看次数