关于SSLServerSocket.setWantClientAuth:
如果设置为true如果客户端选择不发送证书,则协商继续.
此外,我注意到如果客户端发送证书但不是信任库的一部分,也会发生这种情况.在这种情况下,协商也不会失败.
那么这个设置的用例是什么?
我正在尝试编写一个客户端(实际上是一个中间件,它是一个实体的客户端,但也充当其他人的服务器).在其客户端容量中,它应该与另一台服务器(VMware的VirtualCenter)通信,并要求它代表它做一些事情.
为了提供更多上下文,VirtualCenter允许应用程序注册为扩展.所述申请可以在注册时注册其证书(setCertificate).之后,应用程序可以使用其证书(loginExtensionByCertificate()方法)登录VirtualCenter ,从而无需存储用户名和密码.但是,为了使其正常工作,客户端(我的应用程序)必须发送证书作为其SSL连接的一部分,即使服务器(VirtualCenter)没有特别要求它.
我正在用Java编写我的应用程序.创建了我自己的密钥管理器,将其连接到我的密钥库并指定要使用的别名.然后初始化我的ssl上下文以使用该密钥管理器.在创建的套接字中,我确实看到他们的SSLContext中有我的密钥管理器.但是,我没有看到密钥管理器被调用来获取证书.出于某种原因,套接字不觉得需要发送证书.
我知道服务器可能会要求客户端提供其证书.在这种情况下,它不会发生.我想知道是否有办法强制创建的套接字提供证书,无论服务器是否要求它.
我正在尝试在 .NET 和 Java 之间创建 SSL 套接字服务器/客户端。在这种情况下,我的 SSL 套接字服务器将在 .net 中运行,客户端在 Linux 下以 Java 运行。我的问题是握手期间连接失败,特别是当服务器向客户端请求证书时,客户端无法发回某些内容并且连接失败。
在.net 中,我使用 sslStream 建立连接,在 Java 上,我使用标准 SSLSocket。下面是一些代码片段,但这是我到目前为止所拥有的:
在服务器端 (Windows),我在 MMC 下的个人/证书文件夹中有一个私有证书。我在受信任的人/证书中拥有来自客户的公共证书。两个证书均由同一 CA 颁发。两个证书的证书链都有多个级别,但两者是相同的。链中的根级证书也安装在受信任的证书颁发机构/证书文件夹中。
在客户端 (Linux),我有一个密钥库,其中包含与服务器上安装的公共证书相匹配的私有证书。我有一个信任存储区,其中包含来自服务器的公共证书,与服务器的私有证书相匹配。
在服务器端(.net),我使用一个 Socket 进行异步读取,然后将其包装到 SSLStream 中,代码片段如下:
NetworkStream ns = new NetworkStream(socket, false);
SslStream ssl = new SslStream(ns, true);
ssl.AuthenticateAsServer(serverCertificate, true, SslProtocols.Default, true);
客户端代码几乎是标准代码:
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
InetAddress addr = InetAddress.getByName(servername);
SSLSocket socket = (SSLSocket) factory.createSocket(addr,port);
socket.setUseClientMode(true);
socket.setNeedClientAuth(true);
socket.setWantClientAuth(true);
socket.startHandshake();
os = new DataOutputStream(socket.getOutputStream());
is = new DataInputStream(socket.getInputStream());
byte[] outBuf …我已经创建了一个导入了相关密钥对的密钥库(图像中的server.jks)。
keytool -importkeystore -srckeystore server.p12 -destkeystore server.jks -srcstoretype pkcs12
我需要使用java keytool向其附加中间证书。
使用Windows上的KeyStore资源管理器工具,我可以在右键单击上下文菜单后附加证书,就像在所附的图像中一样。

在“附加证书”选项之后添加主要/中间证书之后,我可以像在树上一样在KeyStore资源管理器中看到它。
---primary intermediate certificate
     |---secondary intermediate certificate
           |---my server certificate  
我非常想知道如何使用(LINUX)命令行上的“ Java KeyTool”来做到这一点。
先感谢您。
我只是这样使用keytool:
keytool -genkey -keyalg RSA -alias selfsigned -keystore mykeys.jks -storepass password -validity 360 -keysize 2048
......然后回答了它提示我的所有后续问题.这会mykeys.jks在我的本地目录中生成密钥库.
我的问题:这个JKS文件与其中包含的自签名证书的名称之间有什么关系?这意味着,我现在在这个密钥库中有一个名为"mykeys"的SSL证书吗?
额外问题:单个密钥库(JKS文件)内部可以有多个证书吗?如果是这样,我如何添加第二个SSL证书,例如,命名my2ndcert为同一个JKS文件?
当我在 Java 7 中创建 SSLServerSocket 时,服务器正确使用我的服务器证书和密钥。该证书是由 ca 的子 ca 颁发的。因此,从根证书到服务器证书的完整链有四个证书。完整的链存在于密钥库/信任库中。
但是,当客户端连接时,服务器始终仅发送服务器证书本身。这也适用于基于 Java 的 Web 服务器,例如 Jetty。
因为大多数客户端只安装了根 ca 证书,而不安装两个子 ca 证书,这是一个大问题。
如何强制 Java 在 SSL/TLS 握手中发送完整的证书链?
我有一个 zuul 代理作为边缘服务器,我的微服务是非 jvm 应用程序,我不使用功能区或尤里卡。这些微服务只能通过 https 访问,并且需要客户端证书才能与它们通信。zuul 是否支持与下游证书的相互身份验证?如果是这样,我如何在我的 zuul 服务器上设置它。
令人困惑的是,由 keytool 生成的密钥库包含使用以下命令的自签名证书:
keytool -genkey -keyalg RSA -keysize 1024 -keystore bob.keystore
生成自签名证书没有意义,因为您需要受信任的 CA 来签署您的证书请求。如何生成非自签名密钥库?