在我的应用程序中,我需要实现双向握手。以下是我使用的代码:
public static SSLContext getSSLContext() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, CertificateException, NotFoundException, IOException, UnrecoverableKeyException{
KeyStore clientCertificateKeysKeyStore = getClientCertificateKeystore();
KeyStore trustStore = getServerCertificateKeystore();
KeyManagerFactory kmf = KeyManagerFactory.getInstance(X509);
if(clientCertificateKeysKeyStore != null)
kmf.init(clientCertificateKeysKeyStore, "cleint".toCharArray());
KeyManager[] keyManagers = kmf.getKeyManagers();
// TrustManager[] trustManagers = {new CustomTrustManager(trustStore)};
TrustManagerFactory tmf = TrustManagerFactory.getInstance(X509);
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyManagers, trustManagers, null);
return sslContext;
}
我有一个PEM文件,我必须从中生成密钥库。
private KeyStore loadPEMKeystoreStore(File certificateFile) throws Exception {
InputStream caInput = new BufferedInputStream(new FileInputStream(certificateFile));
byte[] der = loadPemCertificate(caInput);
ByteArrayInputStream derInputStream = new ByteArrayInputStream(der);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
String alias = cert.getSubjectX500Principal().getName();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore .load(null);
keyStore .setCertificateEntry(alias, cert);
return keyStore ;
}
服务器证书是本地存储的. pk12证书。
问题在于握手过程中未附加客户端证书。我使用wireshark分析数据包,它显示客户端证书长度为0。
如果我使用. pk12文件作为客户端证书,它被正确地附加。但是我必须使用PEM文件。任何解决方案!!
PEM文件仅包含证书,不包含私钥。下面是运行良好的更新代码。
private KeyStore loadPEMKeystoreStore(File certificateFile, String password) throws Exception {
InputStream caInput = new BufferedInputStream(new FileInputStream(certificateFile));
KeyStore keystore = KeyStore.getInstance(CLIENT_CERTIFICATE_KEYSTORE_TYPE);
CertificateFactory certificateFactory = CertificateFactory
.getInstance(X509);
X509Certificate cert = (X509Certificate) certificateFactory
.generateCertificate(caInput);
keystore.load(null);
keystore.setCertificateEntry("cert-alias", cert);
keystore.setKeyEntry("key-alias", privateKey, password.toCharArray(),
new Certificate[]{cert});
FileOutputStream out = new FileOutputStream(file);
keystore.store(out, password.toCharArray());
return keyStore ;
}
问题内容: 我正在尝试连接到安全的Web服务。 即使我的密钥库和信任库已正确设置,我也遇到了握手故障。 经过几天的挫败,无休止的谷歌搜索并询问周围的所有人,我发现唯一的问题是java选择在握手期间不将客户端证书发送到服务器。 特别: 服务器请求了客户端证书(CN = RootCA)-即“给我一个由根CA签名的证书” Java查看密钥库,只发现我的客户端证书由“ SubCA”签名,该证书又由“ Ro
我是Netty的新手,我尝试编写一个使用相互身份验证的echo服务器和客户端。不幸的是,它无法工作,客户端没有发送其客户端证书,服务器按预期断开连接。下面是我到目前为止所做的工作和客户端代码的概述--它可能包含一些bug或者我错过了一些重要的东西。谢谢你经历了这一切! 这就是我所拥有的: Netty版本4.1.0.cr1 可在服务器上下载的有效密钥存储库、信任存储库和CRL 直接使用JSSE的ec
我已经能够通过HTTP使用Eureka+ZUUL+Ribbon+Config Server设置并成功验证Spring cloud设置。 然而,当我尝试转移到HTTPS时,单个服务在HTTPS上运行良好,但Eureka客户端发现却失败了。
我有一个客户端-服务器应用程序(Android客户端、Apache Http服务器),通过相互身份验证(TLS 1.2)进行通信。问题是:有时连接(登录)会因SSL错误而失败。 这是有效的: 注册客户端证书 登录 这是行不通的: 注册客户证书 注意:在步骤4之后杀死应用程序,然后启动它并执行步骤5工作。 我能想到的可能解释是: 正在重用一些旧资源(如旧客户端证书)。看起来所有相关的东西(OkHtt
我不知道我到底需要在哪里包含客户机证书。现在,我的第一个问题是我不信任服务器。我尝试使用默认的Java密钥库文件(cacerts),其中包含Thawte和Digicert,这些是我试图与之通信的服务器的根权限。我使用
我正在使用T.Rob的建议调试Websphere MQ服务器和客户机之间的SSL错误,并需要帮助理解SSL握手(SSL连接到MQ使用。NET MQ客户机SSLv3?)。 我的WMQ7.5客户机应用程序是C代码,使用密钥库(.kdb)。利用WebSphere管理员提供的CHLTAB。WMQ服务器运行Java,通道是用相互身份验证定义的。 本文指出,在SSL/TLS握手中,服务器总是发送其公共证书以响