这不是设计上应该发生的事情,但是出于安全考虑,我想知道,如果有多个证书与某个CA签署的要求相匹配,那么如何将“正确的”证书发送到服务器?
我正在使用一个简单的SSL JAVA示例客户端,连接到Apache HTTPD。
我尝试用4个证书进行测试,每次删除选择的证书,并记下下一个是谁。除了证书的“
sha256”的词典顺序之外,我找不到合理的逻辑(即日期,别名等)。在我看来这不太可能…
该示例客户端的操作类似于
System.setProperty("javax.net.ssl.keyStore","device.p12");
System.setProperty("javax.net.ssl.keyStorePassword","password");
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
System.setProperty("javax.net.ssl.trustStore","truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword","password");
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSock = (SSLSocket) factory.createSocket("87.69.60.100",443);
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sslSock.getOutputStream(), "UTF8"));
wr.write("GET /lather HTTP/1.1\r\nhost: 87.69.60.100\r\n\r\n");
wr.flush();
并且Apache配置有
SSLCACertificateFile rootCA.crt
SSLVerifyClient require
我找不到相关的文档来回答这个问题。我也想知道-Apache是否有可能以某种方式转发多个证书链?(例如,行为不端的客户发送的邮件很奇怪)。
谢谢!
需要客户端身份验证的服务器将发送可接受的证书类型列表,以及可能的可接受的CA列表。默认情况下,您的Java客户端然后应用以下算法:
客户端证书选择算法未在RFC
5246中
指定,但是Java的简单默认实现似乎是合理的,如果EJP指出将来可能会进行更改。特别地,“第一个”是非常随机的-
凭据当前存储在中Map
,因此它将取决于条目集的迭代顺序。而且,这些KeyManager
实现是可插入的,并且OpenJDK提供了一个“
NewSun”实现,该实现通过传递security属性来激活ssl.KeyManagerFactory.algorithm=NewSunX509
。第二个步骤还将考虑客户端证书的keyUsage和extendedKeyUsage属性,以及有效期。
如果您需要保证从可能的列表中发送的证书,并且发现默认行为对您不利,那么最好的选择是手动创建一个单项密钥库,并使用它来初始化SSLContext
或编写您的证书。自己X509KeyManager
做你想要做的事情chooseClientAlias
,例如在回答这个问题或这个问题时。
问题内容: 我们的系统与多个Web服务提供商进行通信。它们都是从单个Java客户端应用程序调用的。到目前为止,所有的Web服务都已通过SSL进行,但是没有一个使用客户端证书。好吧,一个新的合作伙伴正在改变这一现状。 使应用程序使用证书进行调用很容易;设置和将做到这一点。但是,现在的问题是如何制作它,使其仅在调用该特定Web服务时使用证书。我想更一般地说,我们希望能够选择要使用的客户端证书(如果有)
问题内容: 使用Websphere MQ 8.x,我们是较大环境中的一个应用程序,并且是某些数据接口的客户端。我们的应用程序是在WildFly 9上运行的Java EE应用程序,该应用程序使用资源适配器()与EAR文件一起部署在同一AS中。我们在两个方向上与MQ服务器进行交互。因此,一方面,我们有一些MDB(由于历史渊源仍是EJB 2.x格式而没有注释)列出了一些队列,并由包含激活配置属性的部署描
:) 我在本地Gentoo Linux集群上安装了kubenretes 1.9.3。 我正在尝试配置kubectl,如https://kubernetes.io/docs/getting-started-guides/scratch/ kubernetes文档声明使用和配置kubectl。到目前为止,我在文档中设置了和。不知道我还需要创建哪些证书。 文档声明使用和但是我找不到如何创建它们。 我使用
问题内容: 在Python中,我使用了这样的请求: 非常简单。 现在,我需要使用Apache HttpClient在Java中实现相同的功能。使用HttpClient进行请求时如何通过客户端证书? 问题答案: 我认为主要区别在于,在Java中,通常将密钥和证书放在密钥存储区中,然后从那里使用它。就像您提到的那样,人们经常希望为此使用单独的库,例如提到的httpcomponents客户端(就像您在p
问题内容: 我目前在服务器具有默认的自签名SSL证书的测试环境中工作。我正在使用Restlet 2.1-RC2并实例化客户端资源,如下所示: 并在每次打来的电话中重复使用客户端。如何设置客户端,使其忽略有问题的证书。 问题答案: 正确的方法 是使用以下 方法 将此自签名证书导入客户端的信任库: 您可以直接在可能缺乏灵活性的JRE信任库()中进行操作,也可以在自己的文件副本中进行操作,然后将该文件设
这个问题似乎是警告的重复:找不到合适的证书-在没有客户端身份验证的情况下继续,但我遇到了类似的问题,即使客户端证书是由CertificateRequest消息中提到的签名者签名的。 我只是想知道对客户端和服务器(tomcat)使用自签名证书(CA不信任)是否是对客户端身份验证的限制? 我正在尝试通过一个不受任何CA信任的自签名证书(使用keytool创建)使用客户端身份验证与HTTPS服务器建立连