yai*_*air 6 java apache ssl ssl-certificate
这不是设计应该发生的事情,但出于安全考虑,我想知道如何将"正确"的证书发送到服务器,假设有多个证书符合某个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();
Run Code Online (Sandbox Code Playgroud)
Apache配置了
SSLCACertificateFile rootCA.crt
SSLVerifyClient require
Run Code Online (Sandbox Code Playgroud)
我找不到相关文件来回答这个问题.我也想知道 - Apache是否有可能以某种方式转发多个证书链?(对于一个行为不端的客户发送一些奇怪的东西).
谢谢!
rxg*_*rxg 10
需要客户端身份验证的服务器将发送可接受的证书类型列表,可能还包含可接受的CA列表.默认情况下,您的Java客户端将应用以下算法:
RFC 5246中未指定客户端证书选择算法,但Java的简单默认实现似乎是合理的,如果EJP指出将来可能会发生变化.特别是,"第一个"几乎是随机的 - 凭证当前存储在a中Map,因此它将取决于条目集的迭代顺序.此外,这些KeyManager实现是可插拔的,并且OpenJDK提供了一个"NewSun"实现,它通过传递安全属性来激活ssl.KeyManagerFactory.algorithm=NewSunX509.第二个还将考虑您的客户端证书的keyUsage和extendedKeyUsage属性,以及到期日期.
如果您需要保证从可能列表中发送的证书,并且您发现默认行为不适合您,那么您最好的选择是手动创建单项密钥库并使用它来初始化SSLContext或写入您的自己实现X509KeyManager做你想做的事情chooseClientAlias,比如这个问题或这个问题的答案.
| 归档时间: |
|
| 查看次数: |
7057 次 |
| 最近记录: |