我有一个简单的安全套接字服务器 - 客户端程序.
对于服务器证书,我使用keytool创建了一个密钥库.
当我尝试通过我的客户端连接到服务器时,我得到以下异常:
在服务器中:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
Run Code Online (Sandbox Code Playgroud)
在客户端:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
如果我的理解是正确的,那么这些例外是由于我使用我创建的证书这一事实引起的.
我的问题如下:
如果我在服务器和客户端中设置启用的密码套件,所有*_anon*密码套件,这不应该解决问题吗?
我的意思是如果我启用*_anon_*密码套件,则不需要身份验证,因此没有例外.
它是否正确?
因为我仍然有例外.我尝试在启用的密码套件中启用所有已启用的+ _anon密码套件.没有成功.我尝试只设置anon并获得一个新例外:
Exception in thread "main" java.lang.IllegalArgumentException: Name must not be null
Run Code Online (Sandbox Code Playgroud)
有人可以用anon密码套件解释为什么我会得到这些例外吗?
注意:
如果我在客户端上设置javax.net.ssl.trustStore指向我创建并由我的服务器使用的密钥库的系统属性,则通信正常!
该程序无异常,数据从客户端发送到服务器.
更新:
这是我用来启用匿名密码的片段(我已经为服务器和客户端部分做了这个):
String[] supported = server.getSupportedCipherSuites();
String[] anonCipherSuitesSupported = new String[supported.length];
int count = 0;
for(int …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用SSLEngine和NIO的应用程序,我编写了客户端和服务器.客户端能够连接到服务器,在他连接后,我希望他能够执行会话恢复/重新协商,但目前没有运气..
由于使用SSLEngine的代码非常大(SSLEngine的使用非常复杂!),我将编写一个简单的伪代码来演示这种情况:
Server:
global sslcontext initialized once
await new client
client.sslEngine = create new server ssl engine using the global sslcontext
client.handleHandshake and wait for it to be done
handle client.
Client:
global sslcontext initialized once
sslEngine = create new client ssl engine using the global sslcontext
performHandshake and wait for it to be done
disconnect (close gracefully the connection)
sslEngine = create new client ssl engine using the global sslcontext
configure engine to not allow session creation
performHandshake and …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要 JRE 并创建证书的安装程序。我正在开发下一个版本的安装程序,它捆绑了一个新的 JRE。我需要将旧 JRE 的cacerts密钥库中导入的所有证书移至新 JRE。如果我将旧的 jre/lib/security/ 目录下的“cacerts”文件复制到新的 JRE,cacerts 中的现有证书是否有效,我将进行安装。
我查看了问题:“是否可以将 cacerts 的所有内容导入到 jssecacerts 文件中?” 将证书导入我的密钥库。这是否意味着如果通过复制 cacerts 进行密钥库迁移不起作用,我需要备份现有的 jre/lib/security/cacerts 并将其导入到新的 JRE 中?
我有一个服务器应用程序,它使用:
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
Run Code Online (Sandbox Code Playgroud)
这是一个java应用程序,它本身就是一个服务器 - 我没有使用任何虚拟服务器,也不是Web应用程序.它应该从客户端应用程序接收连接并处理它们的请求.客户端应用程序和数据库之间的夹层.
在启动它确实运行,但保持垃圾邮件(导致while(true){})此错误:
javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL cipher suites which are enabled.
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
所以,我查找了一些SSL证书创建指南,并使用这些命令制作了证书:
keytool -genkey -alias serverprivate -keystore servestore -keyalg rsa -keysize 2048
keytool -export -alias serverprivate -keystore servestore -rfc -file server.cer
Run Code Online (Sandbox Code Playgroud)
并将其导入我的本地证书存储,因此我可以使用我的客户端应用程序进行测试:
keytool -import -alias trustservercert -file server.cer -keystore clienttruststore
Run Code Online (Sandbox Code Playgroud)
所有这些都是在我的$ JAVA_HOME\bin目录中完成的.我还更新了我的eclipse.ini文件
-vm
$JAVA_HOME\bin\javaw.exe
Run Code Online (Sandbox Code Playgroud)
所以eclipse将使用我的jdk7虚拟机来运行应用程序.
同时,我试图复制server.cer和servestore文件到这两个$ ECLIPSE_HOME和应用程序的主目录.
结果是:相同的错误消息.它不会阻止应用程序运行,但它仍然存在.
非常感谢这里的一些帮助.我究竟做错了什么?也许有一个很酷的,详细的,新手友好的指南,用SSL创建应用程序,我找不到?
我已经按照强化您的网络服务器ssl密码指南建议使用
ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS
Run Code Online (Sandbox Code Playgroud)
但是我正在尝试配置基于纯Java(Tomcat,Jetty)的WebServer,而不是基于Apache或OpenSSL的Web服务器.如何确定哪个JSSE密码名称对应的结果
openssl ciphers -V 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS'
Run Code Online (Sandbox Code Playgroud) 我有一个Java密钥库,我为每个客户的子域存储证书.我打算使用服务器别名来区分密钥存储区中的多个客户,如此处所示.Play框架1.2.7使用Netty的SslHandler来支持服务器端的SSL.我尝试实现使用此解决方案的自定义SslHttpServerContextFactory .
import play.Play;
import javax.net.ssl.*;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyStore;
import java.security.Principal;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Properties;
public class CustomSslHttpServerContextFactory {
private static final String PROTOCOL = "SSL";
private static final SSLContext SERVER_CONTEXT;
static {
String algorithm = Security.getProperty("ssl.KeyManagerFactory.algorithm");
if (algorithm == null) {
algorithm = "SunX509";
}
SSLContext serverContext = null;
KeyStore ks = null;
try {
final Properties p = Play.configuration;
// Try to load it from …Run Code Online (Sandbox Code Playgroud) 在SSL握手期间,客户端使用服务器的公钥加密生成的预主密钥并发送到服务器.服务器和客户端都执行步骤以使用约定的密码生成主密钥.客户端和服务器都使用主密钥生成会话密钥,这些密钥是用于加密和解密SSL会话期间交换的信息的对称密钥
http://www.symantec.com/connect/blogs/how-does-ssl-work-what-ssl-handshake
如何获取对称密钥,以便我可以将其存储到数据库中,并在每次客户端连接时使用相同的密钥?
服务器和客户端都应保存该密钥,并且永远不再进行握手过程.下次(即使断开连接后),他们应该使用https上的对称密钥直接启动通信.
简而言之,我希望SSL会话永远持续下去.
编辑 Android设备是客户端.每当客户端上线时,客户端 - 服务器仅交换少量字节数据.在这种情况下SSL是开销,不是吗?
我有点不知道如何在 WidlFly 11 中使用证书。我查阅了文档,发现了很多术语,例如 JSSE、OpenSSL、Elytron、ApplicationRealm。当我执行代码时出现问题
final URL url = new URL("https://someUrl");
HttpsURLConnection httpURLConnection = (HttpsURLConnection)url.openConnection();
Run Code Online (Sandbox Code Playgroud)
抛出此异常sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
那么,具体需要配置什么呢?我尝试了Elytron Documentation中的“为应用程序启用单向 SSL/TLS”部分,但没有成功。
ps:我正在使用 java 9.01 ps2:我正在使用standalone-full.xml
如果您需要更多信息,请告诉我